arcpy.geometry __geo_interface__ ve AsShape () işlevi: hassasiyet ve delik kaybı


10

Benim arkpy geometrileri geojson olarak serileştiriyorum, böylece onları daha sonra geometriler olarak geri hidratlayabilirim ve döngüde 2 sorun yaşıyorum .:

SORUN 1: Hassasiyet

    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

Dize temsilini kontrol edersem, koordinatlar biraz değişti:

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

SORUN 2: Delikler Çokgenin delikleri varsa, geo_interface bir hata oluşturur:

    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'

Bu problemlerin nasıl çözüleceğine dair bir fikrin var mı?


Evet, sadece 2 numarayla karşılaştım. Ve bu konu için fazla aşk gibi görünmüyor.
valveLondon

ArcGIS 10.1'de bu hala arcpy'de kırık - ESRI'nin konu hakkında yorum yapması güzel olurdu.
James Mills

Birinci ve ikinci sorunla karşılaştım. Benimle, koordineli değişmiyor gibi görünüyor (yazdırdığınızda) ama geom1.equals (geom2) beni sadece birkaç kez başarısızlığa uğrattı. Bunun da neden olduğundan emin değilim. 2. problem @valveLondon'un önerisi kullanılarak düzeltildi. .Equals nasıl düzeltileceğini öğrendiyseniz lütfen paylaşın.
Michalis Avraam

@MichalisAvraam Aynı sorunu yaşadık ve bir çözüm için ESRI'ya girdik - bilinen bir hata olduğu ortaya çıktı (projeksiyon olmadan bir geom oluşturduğunuzda hassasiyeti kesiyor) - bu soruya da göz atın .
om_henners

@om_henners Bunu kabul ettim. Ancak arcpy.AsShape () işlevi, uzamsal başvuru belirtmenize izin vermez. Tüm ortam değişkenlerini bir şey yapmasını umarak ayarladım (çıktı koordinatları, vb ...). Çözüm, GeoRI'nin manuel olarak kodunu çözmektir, çünkü ESRI doğruluk umurunda değil mi?
Michalis Avraam

Yanıtlar:


5

Tamam - ben çözdüğümü sanıyordum.

Bu dosyanın C ~ \ Python26 \ ArcGIS10.0 \ Lib \ arcpy \ arcobjects \ geometries.py satırını ~ 80 yerine koy:

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

buna (veya daha özlü ve zarif ve aynı şeyi yapan bir şey):

  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

Temel olarak boş değerlerle işaretlenmiş çörekleri düşünmeyi unuttular. Bu iyi geoJson (ayrı parçalar) tükürüyor ancak arcpy.AsShape yöntemi GeoJSON'u çöpe atıyor.

bu kod:

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__

bunu çıktılar:

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

Pes ediyorum. ;)

Güncelleme Delik problemi bu python yığını ile 10.1'de çözüldü:

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

sözlüğü temsil eden bir dize yerine bir sözlük döndürmemeli midir? :)
blah238

Evet, haklısın, olmalı. Geçerli bir GeoJSON sözlük obj tükürmek için değiştirdim. ama AsShape yöntemine karşı kontrol ettikten sonra çabalarımın yararsızlığını fark ettim.
valfLondra

Bunun bu konuda açıklanan sorunla bir ilgisi olup olmadığını merak ediyorum: forums.arcgis.com/threads/9763-Errors-in-arcpy-s-Polygon-class - 10 SP2 ve kesinlikle 10.1'de düzeltilmiş olmalıdır.
blah238

2
ESRI C:\Program Files\ArcGIS\Server\arcpy\arcpy\arcobjects\geometries.py10.1'de güncellendi , ancak 10.0'daysanız kendiniz düzeltebilirsiniz.
VanaLondon

3
Evet, 10.1'de düzelttim, yukarıdaki güncelleme .pydosyadaki yeni kaynak . Ben 10 için bir hizmet paketi haline düşündüm ama sanmıyorum.
Jason Scheirer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.