أكثر

استخدام الوظيفة في استعلام SQL مع ArcPy؟


أحاول ضم النقاط إلى المضلعات بناءً على ما إذا كانت عناوينها متطابقة وكذلك إذا كانت المسافة بينها أقل من 2500 قدم. لقد حددت دالة haversine التي تحسب المسافة بين النقطة والمضلع باستخدام إحداثياتهم. ومع ذلك ، تلقيت خطأ يفيد بأن SQL غير صالح.

استيراد arcpy استيراد 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 .polyX، polyshp.polyY) <2500 "keyfield =" pointshp.OBJECTID "arcpy.MakeQueryTable_management ([" pointshp "،" polyshp "]،" Join "،" USE_KEY_FIELDS "، keyfield،" "، where) arcpy.CopyFeatures_management "انضم" ، "انضم")

الخطأ الذي أحصل عليه:

تم استخدام عبارة SQL غير صالحة. [انضم]

الهافرسينالوظيفة التي أستخدمها والتي يتم حفظها في برنامج نصي منفصل يسمىharversine.pyأي أنه ليس خطأ إملائي.

import math def myhaversine (lon1، lat1، lon2، lat2): # تحويل الدرجات العشرية إلى راديان lon1، lat1، lon2، lat2 = map (math.radians، [lon1، lat1، lon2، lat2]) # haversine formula 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 # نصف قطر الأرض بالكيلومترات. استخدم 3956 للأميال ، 208887680 قدمًا لإرجاع الرياضيات .ceil (c * r)

أعتقد أن أفضل رهان لك هو تحديد جميع العناوين التي تناسب معايير المسافة أولاً ، ثم تصفية تلك العناوين. إليك طريقة واحدة للقيام بذلك. حدد قيم النقطتين X و Y من الحقول ، وأضفهما إلى قاموس بحيث يكون المفتاح هو العنوان. ثم قم بإجراء العمليات الحسابية لكل عنوان أثناء التكرار عبر المضلعات ، وإذا كان العنوان يفي بمعايير المسافة ، أضف العنوان إلى قائمة "العنوان الجيد". أخيرًا قم بتضمين هذه العناوين في جملة where. كلها جداول ، لذا يجب أن تكون سريعة نسبيًا.

الكود (لم يتم اختباره):

استيراد arcpy استيراد harversine arcpy.env.overwriteOutput = صحيح arcpy.env.workspace = r "C:  mygdb.gdb" print "إنشاء قاموس النقاط" # قاموس مع XYs حسب العنوان من النقطة pntDi = ديكت ([(addr، (x ، y)) للعنوان، x، y في arcpy.da.SearchCursor ("pointshp"، ["CAdd"، "NewLong"، "NewLat"]) إذا كان العنوان و x و y]) # قائمة فارغة للعناوين الجيدة = [] #iterate polygon table طباعة "مضلعات مكررة وحساب" باستخدام مؤشر arcpy.da.SearchCursor ("polyshp" ، ["P_Address" ، "polyX" ، "polyY"]) كمؤشر: لعنوان addr و polyX و polyY في المؤشر : إذا لم يكن addr أو ليس polyX أو polyX: تابع إذا لم يكن addr في pntDi: تابع pntX = pntDi [addr] [0] pntY = pntDi [addr] [1] #Calculate value value = harversine.myhaversine (pntX، pntY، polyX، polyY) # أضف قيمة جيدة إلى قائمة العناوين إذا كانت القيمة <2500: goodAddresses + = [addr] #New where clause addressStr = "'،'" .join (goodAddresses) where = "pointshp.CAdd = polyshp.P_Address and pointshp. أضف بتنسيق ('{0}') ". (addressStr)


شاهد الفيديو: SQL Log file clear (شهر اكتوبر 2021).