Mehr

Funktion in SQL-Abfrage mit ArcPy verwenden?


Ich versuche, Punkte mit Polygonen zu verbinden, basierend darauf, ob ihre Adressen übereinstimmen und ob die Entfernung zwischen ihnen weniger als 2500 Fuß beträgt. Ich habe eine Haversine-Funktion definiert, die den Abstand zwischen dem Punkt und dem Polygon anhand ihrer Koordinaten berechnet. Allerdings bekomme ich eine Fehlermeldung, dass das SQL ungültig ist.

import arcpy import harversine arcpy.env.overwriteOutput=True arcpy.env.workspace=r"C:mygdb.gdb" where="pointshp.CAdd = polyshp.P_Address and harversine.myhaversine(pointshp.NewLong,pointshp.NewLat,polyshp .) .polyX,polyshp.polyY) < 2500" keyfield="pointshp.OBJECTID" arcpy.MakeQueryTable_management(["pointshp","polyshp"],"joined","USE_KEY_FIELDS",keyfield,"",where) arcpy.CopyFeatures_management( "beigetreten","beigetreten")

Der Fehler, den ich bekomme:

Es wurde eine ungültige SQL-Anweisung verwendet. [beigetreten]

DashaversineFunktion, die ich verwende, die in einem separaten Skript namens . gespeichert wirdharversine.pyd.h. es handelt sich nicht um einen Rechtschreibfehler.

import math def myhaversine(lon1, lat1, lon2, lat2): # Dezimalgrad in Bogenmaß umwandeln lon1, lat1, lon2, lat2 = map(math.radians, [lon1, lat1, lon2, lat2]) # Haversine-Formel dlon = lon2 - lon1 dlat = lat2 - lat1 a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2 c = 2 * math.asin(math.sqrt(a)) r = 20887680 # Erdradius in Kilometern. Verwenden Sie 3956 für Meilen, 20.887.680 Fuß zurück math.ceil(c * r)

Ich denke, es ist am besten, zuerst alle Adressen zu ermitteln, die den Entfernungskriterien entsprechen, und dann nach diesen zu filtern. Hier ist eine Möglichkeit, dies zu tun. Bestimmen Sie die Punkt-X- und -Y-Werte aus den Feldern und fügen Sie sie einem Wörterbuch hinzu, wobei der Schlüssel die Adresse ist. Führen Sie dann die Berechnungen pro Adresse durch, während Sie durch die Polygone iterieren, und wenn die Adresse die Entfernungskriterien erfüllt, fügen Sie die Adresse zu einer "guten Adresse"-Liste hinzu. Schließlich fügen Sie diese Adressen in die where-Klausel ein. Es ist alles tabellarisch, also sollte es relativ schnell gehen.

Der Code (ungetestet):

import arcpy import harversine arcpy.env.overwriteOutput = True arcpy.env.workspace = r"C:mygdb.gdb" print "Punktverzeichnis erstellen" #Wörterbuch mit XYs nach Adresse von Punkt pntDi = dict ([(addr, (x , y)) für addr, x, y in arcpy.da.SearchCursor ("pointshp", ["CAdd", "NewLong", "NewLat"]) if addr und x und y]) #leere Liste für gute Adressen goodAddresses = [] #iterate polygon table print "Polygone iterieren und berechnen" mit arcpy.da.SearchCursor ("polyshp", ["P_Address", "polyX", "polyY"]) als Cursor: für addr, polyX, polyY im Cursor : wenn nicht addr oder nicht polyX oder nicht polyY: fortfahren wenn nicht addr in pntDi: fortfahren pntX = pntDi[addr][0] pntY = pntDi[addr][1] #Wert berechnen value = harversine.myhaversine(pntX, pntY, polyX, polyY) #Guten Wert zur Adressliste hinzufügen, wenn Wert < 2500: goodAddresses += [addr] #Neue Where-Klausel addressStr = "', '".join (goodAddresses) where = "pointshp.CAdd = polyshp.P_Address and pointshp. CAdd in ('{0}')".format (addressStr)


Schau das Video: Accessing Your Enterprise Geodatabase Using SQL (Oktober 2021).