arcpy.geometry __geo_interface__ und AsShape () Funktion: Verlust an Präzision und Löchern

10

Ich serialisiere meine bogenförmigen Geometrien als Geojson, damit ich sie später wieder als Geometrien "hydratisieren" kann, und ich habe zwei Probleme im Zyklus:

PROBLEM 1: Präzision

    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

Wenn ich die Zeichenfolgendarstellung überprüfe, haben sich die Koordinaten geringfügig geändert:

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

PROBLEM 2: Löcher Wenn das Polygon Löcher hat, generiert geo_interface einen Fehler:

    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'

Irgendwelche Ideen, wie man diese Probleme löst?

Víctor Velarde
quelle
Ja, ich bin gerade auf Nummer 2 gestoßen. Und scheint nicht viel Liebe für dieses Thema zu sein.
Ventil London
Dies ist in ArcGIS 10.1 immer noch in arcpy defekt. - Es wäre schön, wenn ESRI das Thema kommentieren könnte.
James Mills
Ich bin auf das erste und zweite Problem gestoßen. Bei mir scheinen sich die Koordinaten nicht zu ändern (wenn Sie sie drucken), aber geom1.equals (geom2) versagt mir nur ein paar Mal. Ich bin mir nicht sicher, warum das auch so ist. Das zweite Problem wurde mit dem Vorschlag von @valveLondon behoben. Wenn Sie herausgefunden haben, wie Sie die .equals beheben können, teilen Sie diese bitte mit.
Michalis Avraam
@MichalisAvraam Wir hatten das gleiche Problem auch und haben uns an ESRI gewandt, um eine Lösung zu finden. Es stellt sich heraus, dass es sich um einen bekannten Fehler handelt (wenn Sie ein Geom ohne Projektion erstellen, wird die Genauigkeit abgeschnitten.) Schauen Sie sich auch diese Frage an .
om_henners
@om_henners Das habe ich angenommen. Mit der Funktion arcpy.AsShape () können Sie jedoch keinen Raumbezug angeben. Ich habe alle Umgebungsvariablen festgelegt, in der Hoffnung, dass sie etwas bewirken (Ausgabekoordinaten usw.). Die Lösung besteht dann darin, den GeoJSON manuell zu dekodieren, da es ESRI nicht um Genauigkeit geht.
Michalis Avraam

Antworten:

5

OK - nun, ich dachte ich hätte es gelöst.

Ersetzen Sie die Zeile ~ 80 dieser Datei C: \ Python26 \ ArcGIS10.0 \ Lib \ arcpy \ arcobjects \ geometries.py durch:

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

dazu (oder etwas, das prägnanter und eleganter ist und dasselbe tut):

  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

Grundsätzlich haben sie vergessen, Donuts in der Form zu berücksichtigen, die durch Nullpunktwerte gekennzeichnet sind. Dies spuckt gutes GeoJson (separate Teile) aus, aber die arcpy.AsShape-Methode zerstört GeoJSON.

dieser Code:

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__

gibt dies aus:

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

Ich gebe auf. ;)

Update Das Lochproblem wurde um 10.1 mit diesem Python-Teil gelöst:

return {'type': 'Polygon', 'coordinates': [[((pt.X, pt.Y) if pt else None)
                                                    for pt in part]
                                                        for part in self]}
ventilLondon
quelle
Sollte das nicht ein Wörterbuch anstelle einer Zeichenfolge zurückgeben, die ein Wörterbuch darstellt? :)
blah238
Ja, du hast recht, es sollte. Ich habe es geändert, um ein gültiges GeoJSON-Wörterbuchobjekt auszuspucken. Aber nachdem ich mich gegen die AsShape-Methode gewandt hatte, erkannte ich die Sinnlosigkeit meiner Bemühungen.
Ventil London
Ich frage mich, ob das irgendetwas mit dem in diesem Thread beschriebenen Problem zu tun hat: forums.arcgis.com/threads/9763-Errors-in-arcpy-s-Polygon-class - sollte in 10 SP2 und definitiv 10.1 behoben worden sein.
blah238
2
ESRI wurde C:\Program Files\ArcGIS\Server\arcpy\arcpy\arcobjects\geometries.pyauf 10.1 aktualisiert, aber wenn Sie auf 10.0 sind, können Sie es selbst beheben.
Ventil London
3
Ja, ich habe es in 10.1 behoben. Das obige Update ist die neue Quelle in der .pyDatei. Ich dachte, es wäre ein Service Pack für 10, aber ich denke nicht.
Jason Scheirer