arcpy.geometry __geo_interface__ और Ashahape () फ़ंक्शन: सटीक और छिद्रों का नुकसान


10

मैं अपने चापलूसी ज्यामितीयों को जियोजोन के रूप में क्रमबद्ध कर रहा हूं ताकि मैं बाद में उन्हें ज्यामितीय रूप में 'हाइड्रेट' कर सकूं और मुझे चक्र में 2 समस्याएं हो रही हैं:

समस्या 1: परिशुद्धता

    R0 = arcpy.SearchCursor(self.shpTest, "FID=0").next().getValue("Shape")          
    geojson = R0.__geo_interface__                        
    R1 = arcpy.AsShape(geojson)
    self.assertTrue(R0.equals(R1)) <<< THIS FAILS

यदि मैं स्ट्रिंग प्रतिनिधित्व की जांच करता हूं, तो निर्देशांक थोड़ा बदल गए हैं:

    geojson2 = R1.__geo_interface__
    print geojson
    print geojson2  

    {'type': 'Polygon', 'coordinates': [[(442343.5516410945, 4814166.6184399202), (442772.17749834526, 4811610.7383281607), (441565.67508534156, 4811499.6131059099), (440772.50052100699, 4814184.7808806188), (442343.5516410945, 4814166.6184399202)]]}
    {'type': 'Polygon', 'coordinates': [[(442343.55169677734, 4814166.6185302734), (442772.17749023438, 4811610.73828125), (441565.67510986328, 4811499.6130981445), (440772.50048828125, 4814184.7808837891), (442343.55169677734, 4814166.6185302734)]]}

समस्या 2: छेद यदि बहुभुज में छेद हैं, तो geo_interface एक त्रुटि उत्पन्न करता है:

    R0_WithHoles = arcpy.SearchCursor(self.shpTest, "FID=0").next().getValue("Shape")          
    geojson = R0.__geo_interface__  <<< generates this ERROR:

    File "C:\Program Files\ArcGIS\Desktop10.0\arcpy\arcpy\arcobjects\geometries.py", line 68, in __geo_interface__
        return {'type': 'Polygon', 'coordinates': [[(pt.X, pt.Y) for pt in part] for part in self]}
    AttributeError: 'NoneType' object has no attribute 'X'

इन समस्याओं को हल करने के बारे में कोई विचार?


हां, बस खुद नंबर 2 पर दौड़ा। और इस विषय के लिए बहुत प्यार प्रतीत नहीं होता है।
वाल्वलोनडॉन

यह अभी भी आर्कजीआईएस 10.1 में आर्कपी में टूट गया है - यह अच्छा होगा यदि ईएसआरआई विषय पर टिप्पणी कर सकता है।
जेम्स मिल्स

मैं पहली और दूसरी समस्या पर आया था। मेरे साथ, समन्वित परिवर्तन नहीं लगता है (जब आप उन्हें प्रिंट करते हैं) लेकिन geom1.equals (geom2) मुझे केवल कुछ ही बार विफल करता है। मुझे यकीन नहीं है कि ऐसा क्यों होता है। 2 समस्या @valveLondon के सुझाव का उपयोग करके तय की गई थी। यदि आपको पता चला है कि। To को कैसे ठीक किया जाए तो कृपया शेयर करें।
मिखली अवराम

@MichalisAvraam हमारा भी यही मुद्दा था और ईएसआरआई पर एक समाधान के लिए मिला - यह एक ज्ञात बग है (जब आप एक प्रक्षेपण के बिना जियोम बनाते हैं तो यह परिशुद्धता को कम कर देता है) - इस प्रश्न पर भी एक नज़र डालें ।
om_henners

@om_henners मैंने मान लिया। लेकिन arcpy.AsShape () फ़ंक्शन आपको एक स्थानिक संदर्भ निर्दिष्ट करने की अनुमति नहीं देता है। मैंने सभी पर्यावरण चर निर्धारित किए हैं, यह आशा करता है कि यह कुछ (आउटपुट कोर्डर्स, आदि ...) करेगा। फिर समाधान यह है कि GeoJSON को मैन्युअल रूप से डिकोड किया जाए क्योंकि ESRI सटीकता की परवाह नहीं करता है?
मिकालिस अवराम

जवाबों:


5

ठीक है - अच्छा मुझे लगा कि मैंने इसे हल कर लिया है।

इस फ़ाइल की पंक्ति ~ 80 को प्रतिस्थापित करें C: \ Python26 \ ArcGIS10.0 \ Lib \ arcpy \ arcobjects \ geometries.py इसमें से:

return {'type': 'Polygon', 'coordinates': [[(pt.X, pt.Y) for pt in part] for part in self]}

यह (या ऐसा कुछ जो अधिक संक्षिप्त और सुरुचिपूर्ण है और वही काम करता है):

  obj = {"type": "Polygon"}
    coordinates = []
    for part in self:
        _part = []
        for pt in part:
            if pt is not None:
                print pt
                _part.append([pt.X,pt.Y])
            else:
                print "none"
                coordinates.append(_part)
                _part=[]
        coordinates.append(_part)
    obj["coordinates"]=coordinates
    return obj

मूल रूप से वे आकार में डोनट्स पर विचार करना भूल गए, जो अशक्त मानों द्वारा चिह्नित हैं। यह अच्छा जियोजन (अलग-अलग भाग) फैलाता है, लेकिन आर्कपी।शैप विधि जिंजॉन को चकरा देती है।

यह कोड:

import arcpy
gj = {
  'type': 'Polygon', 'coordinates': [
   [[-122.803764, 45.509158], [-122.796246, 45.500050], [-122.808193, 45.500109],
      [-122.803764, 45.509158]],
   [[-122.804206, 45.504509], [-122.802882, 45.502522], [-122.801866, 45.504479], 
      [-122.804206, 45.504509]]
   ]
 }

 p = arcpy.AsShape(gj)
 print p.__geo_interface__

आउटपुट यह:

    {'type': 'Polygon', 'coordinates': [[[-122.8037109375, 45.50927734375],  
    [-122.79620361328125, 45.5001220703125], [-122.80810546875, 45.5001220703125],
    [-122.8037109375, 45.50927734375]]]}

मैं हार मानता हूं। ;)

अद्यतन छेद समस्या 10.1 पर अजगर के इस भाग के साथ हल किया गया है:

return {'type': 'Polygon', 'coordinates': [[((pt.X, pt.Y) if pt else None)
                                                    for pt in part]
                                                        for part in self]}

एक शब्दकोश का प्रतिनिधित्व करने वाले स्ट्रिंग के बजाय एक शब्दकोश को वापस नहीं करना चाहिए? :)
ब्लाह

हां, आप सही हैं, यह होना चाहिए। मैंने इसे एक मान्य GeoJSON डिक्शनरी obj से बाहर निकालने के लिए बदल दिया। लेकिन एशैप पद्धति के खिलाफ जांच के बाद मुझे अपने प्रयासों की निरर्थकता का एहसास हुआ।
वाल्वलोनडॉन

मुझे आश्चर्य है कि अगर इस धागे में वर्णित समस्या से कोई लेना -देना नहीं है : forum.arcgis.com/threads/9763-Errors-in-arcpy-s-Polygon-class - निश्चित रूप से 10 SP2 में निश्चित होना चाहिए और 10.1।
blah238

2
ESRI C:\Program Files\ArcGIS\Server\arcpy\arcpy\arcobjects\geometries.py10.1 पर अपडेट किया गया , लेकिन यदि आप 10.0 पर हैं तो आप इसे स्वयं ठीक कर सकते हैं।
वाल्वलोन

3
हां, मैंने इसे 10.1 में तय किया है, ऊपर दिया गया अद्यतन .pyफ़ाइल में नया स्रोत है । मैंने सोचा कि यह 10 के लिए एक सर्विस पैक में बना है, लेकिन मुझे नहीं लगता है।
जेसन शहीर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.