Mehr

Versuchen, eine Weltdatei für Bilder zu erstellen, die auf einem aus dem Schwerpunkt in Python generierten Ausdehnungsrechteck basiert

Versuchen, eine Weltdatei für Bilder zu erstellen, die auf einem aus dem Schwerpunkt in Python generierten Ausdehnungsrechteck basiert


Ich habe Schwerpunkte für Kartenbilder, die ich schnell und grob über Python-Skript mit arcpy georeferenzieren möchte. Ich kenne die Abmessungen der Bilder, die dpi, den Maßstab, die Drehung und das Koordinatensystem, in das sie eingefügt werden müssen. Mein Skript erstellt Rahmen oder Rechteckausdehnungen basierend auf dem Mittelpunkt, und dann versuche ich, die Weltdatei zu erstellen, indem ich die Auflösung eingebe und Berücksichtigung des Drehwinkels - ich habe diesen Beitrag als Leitfaden verwendet - http://www.omg.unb.ca/~jonnyb/processing/geotiff_tifw_format.html. Ich verwende einen Attributwert in der Punkteebene, um die Weltdateinamen so aufzubauen, dass sie den Bildnamen entsprechen. Das Skript läuft ohne Fehler, aber wenn ich meine Frames in und meine Bilder mit World-Files in eine Map lade, stimmen die Bilder und Frames nicht überein. Die obere rechte Ecke des Bildes landet dort, wo die obere linke Ecke des Rahmens ist. Hier ist ein Bild wie es aussieht:

Ich habe auch diesen Beitrag gefunden, wie man eine Weltdatei mit Rotation generiert, aber ich konnte keine Antwort darauf finden. Was mache ich falsch? Hier ist mein Code:

import arcpy, os w = float(raw_input('ungefähre Breite des Kartenrahmens in gewünschten Karteneinheiten angeben: '))/2 l = float(raw_input('ungefähre Länge des Kartenrahmens in gewünschten Karteneinheiten angeben: '))/2 inputAngle = int(raw_input('Winkel für Rahmenausrichtung angeben: ')) pointLayer = r'C:Temp	emp.gdbQD_Georef_test_geocoded_CCS27z3e' pointFields = ['POINT_X','POINT_Y'] polygonFCpath = r'C:Temp 	emp.gdb' polygonFCname = 'test' polygonFC = os.path.join(polygonFCpath,polygonFCname) features = [] polyArray = {} arcpy.env.overwriteOutput = True arcpy.AddXY_management(pointLayer) frameID = str(raw_input(' Geben Sie den Feldnamen mit der Frame-ID ein, die mit den Bildnamen übereinstimmt: ')) pointFields.insert(0,frameID) polygonFields = [frameID,'UpperLeftX', 'UpperLeftY','[email protected]'] srID = raw_input('Gewünschten Raumbezug eingeben für Frames nach Code oder Name: ') if srID[0].isdigit(): srInput = int(srID) else: srInput = srID sr = arcpy.SpatialReference(srInput) arcpy.CreateFeatureclass_management(polygonFCpath,polygonFCna me,'POLYGON') arcpy.DefineProjection_management(polygonFC,sr) arcpy.AddField_management(polygonFC,frameID,'TEXT',",",50) arcpy.AddField_management(polygonFC,'UpperLeftX','DOUBLE') arcpy.AddField_management( polygonFC,'UpperLeftY','DOUBLE') def RotateXY(x,y,xc=0,yc=0,angle=0,units='GRAD'): import mathe x = float(x) - xc y = float( y) - yc if units == 'GRAD': angle = math.radians(Winkel) xr = (x * math.cos(Winkel)) - (y * math.sin(Winkel)) + xc yr = (x * math.sin(angle)) + (y * math.cos(angle)) + yc gibt xr,yr für Zeile in arcpy.da.SearchCursor(pointLayer,pointFields) zurück: featureList = [] upperLeftX = str(row[1] - w) upperLeftY = str(row[2] + l) upperRightX = str(row[1] + w) upperRightY = str(row[2] + l) lowerLeftX = str(row[1] - w) lowerLeftY = str (row[2] - l) lowerRightX = str(row[1] + w) lowerRightY = str(row[2] - l) upperLeftVal = RotateXY(upperLeftX,upperLeftY,row[1],row[2],inputAngle) upperRightVal = RotateXY(upperRightX,upperRightY,row[1],row[2],inputAngle) lowerLeftVal = RotateXY(lo werLeftX,lowerLeftY,row[1],row[2],inputAngle) lowerRightVal = RotateXY(lowerRightX, lowerRightY,row[1],row[2],inputAngle) shtID = row[0] coordsList = [] coordsList.append( upperLeftVal) coordsList.append(upperRightVal) coordsList.append(lowerRightVal) coordsList.append(lowerLeftVal) polyArray[shtID, upperLeftVal[0],upperLeftVal[1]] = coordsList für Schlüssel, Werte in polyArray(): features.appends .Array.iteritem ((key[0],key[1],key[2],arcpy.Polygon(arcpy.Array([arcpy.Point(*value) für Wert in Werten]), arcpy.SpatialReference(srInput)))) mit arcpy.da.InsertCursor(polygonFC,polygonFields) as cur: für Feature in Features: cur.insertRow(feature) cellSize = float(raw_input('Zellgröße für georeferenziertes Bild bereitstellen (scale/dpi): ')) angleRadians = math. radians(inputAngle) worldFileLine1 = cellSize * math.cos(angleRadians) worldFileLine2 = -cellSize * math.sin(angleRadians) worldFileLine3 = -cellSize * math.sin(angleRadians) worldFileLine4 = -cellSize * math.cos(angleRadians) imageWkspc = raw_input ('Profi vide Pfadposition für zu georeferenzierende Bilder: ') arcpy.env.workspace = imageWkspc imgList = arcpy.ListRasters() für i in imgList: für Zeile in arcpy.da.SearchCursor(polygonFC,polygonFields): mapSet = row[0] .split('-')[0].lower() +'_'+row[0].split('-')[1].split('.')[0].zfill(5)+' _'+ row[0].split('.')[1].zfill(3) if mapSet in i: iName = i.split('.')[0] worldFile = open(os.path.join( imageWkspc,iName+'.tfw'),'w') worldFileLine5 = row[1] worldFileLine6 = row[2] print 'Weltdatei ausschreiben für',i,'… ' worldFile.write(str(worldFileLine1)+' n'+str(worldFileLine2)+'
'+str(worldFileLine3)+'
'+str(worldFileLine4)+'
'+str(worldFileLine5)+'
'+str(worldFileLine6)) worldFile. schließen()

Ich habe festgestellt, dass ich die Abmessungen und den Rotationswert falsch eingegeben habe und daher nicht die richtigen Koordinaten für die obere linke Ecke des Bildes erfasst habe. Auch wenn ich noch nicht verstehe warum, muss das Vorzeichen des Rotationswerts für die Weltdatei umgekehrt werden. Hier ist der aktualisierte Code:

import arcpy, os w = float(raw_input('ungefähre Breite des Kartenrahmens in gewünschten Karteneinheiten angeben: '))/2 l = float(raw_input('ungefähre Länge des Kartenrahmens in gewünschten Karteneinheiten angeben: '))/2 inputAngle = int(raw_input('Winkel für Rahmenausrichtung angeben: ')) pointLayer = r'C:Temp	emp.gdbQD_Georef_test_geocoded_CCS27z3e' pointFields = ['POINT_X','POINT_Y'] polygonFCpath = r'C:Temp 	emp.gdb' polygonFCname = 'test' polygonFC = os.path.join(polygonFCpath,polygonFCname) features = [] polyArray = {} arcpy.env.overwriteOutput = True arcpy.AddXY_management(pointLayer) frameID = str(raw_input(' Geben Sie den Feldnamen mit der Frame-ID ein, die mit den Bildnamen übereinstimmt: ')) pointFields.insert(0,frameID) polygonFields = [frameID,'UpperLeftX', 'UpperLeftY','[email protected]'] srID = raw_input('Gewünschten Raumbezug eingeben für Frames nach Code oder Name: ') if srID[0].isdigit(): srInput = int(srID) else: srInput = srID sr = arcpy.SpatialReference(srInput) arcpy.CreateFeatureclass_management(polygonFCpath,polygonFCna me,'POLYGON') arcpy.DefineProjection_management(polygonFC,sr) arcpy.AddField_management(polygonFC,frameID,'TEXT',",",50) arcpy.AddField_management(polygonFC,'UpperLeftX','DOUBLE') arcpy.AddField_management( polygonFC,'UpperLeftY','DOUBLE') def RotateXY(x,y,xc=0,yc=0,angle=0,units='GRAD'): import mathe x = float(x) - xc y = float( y) - yc if units == 'GRAD': angle = math.radians(Winkel) xr = (x * math.cos(Winkel)) - (y * math.sin(Winkel)) + xc yr = (x * math.sin(angle)) + (y * math.cos(angle)) + yc gibt xr,yr für Zeile in arcpy.da.SearchCursor(pointLayer,pointFields) zurück: featureList = [] upperLeftX = str(row[1] - w) upperLeftY = str(row[2] + l) upperRightX = str(row[1] + w) upperRightY = str(row[2] + l) lowerLeftX = str(row[1] - w) lowerLeftY = str (row[2] - l) lowerRightX = str(row[1] + w) lowerRightY = str(row[2] - l) upperLeftVal = RotateXY(upperLeftX,upperLeftY,row[1],row[2],inputAngle) upperRightVal = RotateXY(upperRightX,upperRightY,row[1],row[2],inputAngle) lowerLeftVal = RotateXY(lo werLeftX,lowerLeftY,row[1],row[2],inputAngle) lowerRightVal = RotateXY(lowerRightX, lowerRightY,row[1],row[2],inputAngle) shtID = row[0] coordsList = [] coordsList.append( upperLeftVal) coordsList.append(upperRightVal) coordsList.append(lowerRightVal) coordsList.append(lowerLeftVal) polyArray[shtID, upperLeftVal[0],upperLeftVal[1]] = coordsList für Schlüssel, Werte in polyArray(): features.appends .Array.iteritem ((key[0],key[1],key[2],arcpy.Polygon(arcpy.Array([arcpy.Point(*value) für Wert in Werten]), arcpy.SpatialReference(srInput)))) mit arcpy.da.InsertCursor(polygonFC,polygonFields) as cur: für Feature in Features: cur.insertRow(feature) cellSize = float(raw_input('Zellgröße für georeferenziertes Bild bereitstellen (scale/dpi): ')) angleRadians = math. radians(-inputAngle) worldFileLine1 = cellSize * math.cos(angleRadians) worldFileLine2 = -cellSize * math.sin(angleRadians) worldFileLine3 = -cellSize * math.sin(angleRadians) worldFileLine4 = -cellSize * math.cos(angleRadians) imageWkspc = raw_input('Pr oide Pfadposition für Bilder zum Schreiben von Weltdateien für: ') arcpy.env.workspace = imageWkspc imgList = arcpy.ListRasters() for i in imgList: for row in arcpy.da.SearchCursor(polygonFC,polygonFields): mapSet = row[ 0].split('-')[0].lower() +'_'+row[0].split('-')[1].split('.')[0].zfill(5) +'_'+ row[0].split('.')[1].zfill(3) if mapSet in i: iName = i.split('.')[0] worldFile = open(os.path. join(imageWkspc,iName+'.tfw'),'w') worldFileLine5 = row[1] worldFileLine6 = row[2] print 'Weltdatei ausschreiben für',i,'… ' worldFile.write(str(worldFileLine1)+ '
'+str(worldFileLine2)+'
'+str(worldFileLine3)+'
'+str(worldFileLine4)+'
'+str(worldFileLine5)+'
'+str(worldFileLine6)) worldFile.close()

Schau das Video: Minecraft Map einfügen