arcpy.geometry __geo_interface__ dan AsShape () fungsi: kehilangan presisi dan lubang

10

Saya membuat serial geometri busur saya sebagai geojson sehingga saya dapat 'menghidrasi' mereka kembali sebagai geometri kemudian dan saya mengalami 2 masalah dalam siklus .:

MASALAH 1: Presisi

    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

Jika saya memeriksa representasi string, koordinatnya sedikit berubah:

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

MASALAH 2: Lubang Jika poligon memiliki lubang, geo_interface menghasilkan kesalahan:

    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'

Ada ide tentang cara mengatasi masalah ini?

Víctor Velarde
sumber
Yap, saya sendiri berlari melintasi nomor 2. Dan tampaknya tidak terlalu menyukai topik ini.
valveLondon
Ini masih rusak di arcpy di ArcGIS 10.1 - Alangkah baiknya jika ESRI bisa mengomentari subjek.
James Mills
Saya menemukan masalah pertama dan kedua. Dengan saya, tampaknya terkoordinasi tidak berubah (ketika Anda mencetaknya) tetapi geom1.equals (geom2) gagal saya hanya beberapa kali. Saya tidak yakin mengapa itu terjadi juga. Masalah ke-2 diperbaiki menggunakan saran @valveLondon. Jika Anda menemukan cara untuk memperbaiki. Sama silakan lakukan berbagi.
Michalis Avraam
@MichalisAvraam Kami memiliki masalah yang sama juga dan mendapatkan ESRI untuk solusi - ternyata itu adalah bug yang dikenal (ketika Anda membuat geom tanpa proyeksi itu memotong presisi) - lihat pertanyaan ini juga.
om_henners
@ Tom_henners saya berasumsi itu. Tetapi fungsi arcpy.AsShape () tidak memungkinkan Anda menentukan referensi spasial. Saya telah mengatur semua variabel lingkungan dengan harapan akan melakukan sesuatu (output coords, dll ...). Solusinya kemudian adalah secara manual men-decode GeoJSON karena ESRI tidak peduli dengan akurasi?
Michalis Avraam

Jawaban:

5

OK - well saya pikir saya telah menyelesaikannya.

ganti baris ~ 80 dari file ini C: \ Python26 \ ArcGIS10.0 \ Lib \ arcpy \ arcobjects \ geometries.py dari ini:

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

untuk ini (atau sesuatu yang lebih ringkas dan elegan dan melakukan hal yang sama):

  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

Pada dasarnya mereka lupa untuk mempertimbangkan donat dalam bentuk yang ditandai dengan nilai titik nol. Ini memuntahkan geoJson yang baik (bagian terpisah) tetapi metode arcpy.AsShape membuang GeoJSON.

kode ini:

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__

output ini:

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

Saya menyerah. ;)

Perbarui Masalah lubang telah dipecahkan pada 10.1 dengan potongan python ini:

return {'type': 'Polygon', 'coordinates': [[((pt.X, pt.Y) if pt else None)
                                                    for pt in part]
                                                        for part in self]}
katup London
sumber
bukankah seharusnya mengembalikan kamus alih-alih string yang mewakili kamus? :)
blah238
Ya, Anda benar, seharusnya. Saya mengubahnya untuk mengeluarkan obj kamus GeoJSON yang valid. tetapi setelah memeriksa terhadap metode AsShape saya menyadari kesia-siaan usaha saya.
valveLondon
Saya ingin tahu apakah itu ada hubungannya dengan masalah yang dijelaskan dalam utas ini: forums.arcgis.com/threads/9763-Errors-in-arcpy-s-Polygon-class - seharusnya sudah diperbaiki dalam 10 SP2 dan pasti 10.1.
blah238
2
ESRI diperbarui C:\Program Files\ArcGIS\Server\arcpy\arcpy\arcobjects\geometries.pypada 10.1 tetapi jika Anda pada 10.0 Anda dapat memperbaikinya sendiri.
valveLondon
3
Ya, saya memperbaikinya di 10.1, pembaruan di atas adalah sumber baru dalam .pyfile. Saya pikir itu membuatnya menjadi paket layanan untuk 10 tetapi saya rasa tidak.
Jason Scheirer