আরকিপি.জিওমেট্রি __geo_interface__ এবং AsShape () ফাংশন: নির্ভুলতা এবং গর্তের ক্ষতি


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: গর্তগুলি যদি বহুভুজের গর্ত থাকে তবে ভূ-আন্তঃ পৃষ্ঠ একটি ত্রুটি উত্পন্ন করে:

    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) আমাকে কয়েকবার ব্যর্থ করে। আমি কেন নিশ্চিত যে তা কেন ঘটে যায় am @ ভলভলন্ডনের পরামর্শটি ব্যবহার করে দ্বিতীয় সমস্যাটি ঠিক করা হয়েছিল। আপনি কীভাবে .সমানগুলি ঠিক করবেন তা যদি জানতে পারেন তবে দয়া করে শেয়ার করুন।
মিশালিস অভ্রাম

@ মিচালিসআভ্রাম আমাদেরও একই সমস্যা ছিল এবং সমাধানের জন্য ইএসআরআই-তে পৌঁছেছি - দেখা যাচ্ছে এটি একটি পরিচিত বাগ (যখন আপনি কোনও প্রক্ষেপণ ছাড়াই একটি রত্ন তৈরি করেন তখন এটি নির্ভুলতা ছাড়িয়ে যায়) - এই প্রশ্নটিও একবার দেখুন।
ওমেনার্স

@ ওম_হেনার্স আমি এটি ধরে নিয়েছি। তবে আরকিপি.এসএফ শেপ () ফাংশন আপনাকে একটি স্থানিক উল্লেখ উল্লেখ করতে দেয় না। আমি কিছু পরিবেশের ভেরিয়েবল সেট করে রেখেছি আশা করি এটি কিছু করবে (আউটপুট কর্ডস, ইত্যাদি ...)। এরপরে সমাধানটি হ'ল ম্যানুয়ালি জিওজেএসনকে ডিকোড করা হবে কারণ ইএসআরআই নির্ভুলতার বিষয়ে চিন্তা করে না?
মিশালিস অভ্রাম

উত্তর:


5

ঠিক আছে - ভাল আমি ভেবেছিলাম আমি এটি সমাধান করেছি।

এই ফাইলটির লাইন ~ 80 প্রতিস্থাপন করুন: from পাইথন 26 \ আরকজিআইএস 10.0 \ লিবি \ আরকিপি \ আরকোবজেক্টস \ জ্যামিতি.পি:

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]}

সেই স্ট্রিংয়ের পরিবর্তে কোনও ডিকশনারি ফেরত দেওয়া উচিত নয়? :)
blah238

হ্যাঁ, আপনি ঠিক বলেছেন, এটা করা উচিত। আমি এটি পরিবর্তন করে একটি বৈধ GeoJSON অভিধান মজাদার থুতু ফেললাম। তবে AsShape পদ্ধতিটি পরীক্ষা করার পরে আমি আমার প্রচেষ্টার ব্যর্থতা উপলব্ধি করেছিলাম।
ভালভ লন্ডন

আমি আশ্চর্য হই যে এই থ্রেডে বর্ণিত সমস্যার সাথে যদি এর কোনও যোগসূত্র থাকে : forums.arcgis.com/threads/9763- ত্রুটি- in - arcpy - s- পোলিগন - ক্লাস - 10 এসপি 2 এ স্থির করা উচিত এবং অবশ্যই 10.1।
blah238

2
ইএসআরআই C:\Program Files\ArcGIS\Server\arcpy\arcpy\arcobjects\geometries.py10.1 এ আপডেট হয়েছে তবে আপনি যদি 10.0 এ থাকেন তবে আপনি নিজেই এটি ঠিক করতে পারেন।
ভালভ লন্ডন

3
হ্যাঁ, আমি এটি 10.1 এ স্থির করেছি, উপরের আপডেটটি .pyফাইলের নতুন উত্স । আমি ভেবেছিলাম এটি 10 ​​এর জন্য একটি সার্ভিস প্যাক হিসাবে তৈরি করেছে তবে আমার ধারণা নেই।
জেসন শিয়েরার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.