2つの別々のフィーチャクラスを比較して、それらの違いを識別しようとしています(diff関数の一種)。私の基本的なワークフロー:
- SearchCursorを使用してジオメトリを抽出します
- 修正した
__geo_interface__
(valveLondon から取得したreturn {'type': 'Polygon', 'coordinates': [[((pt.X, pt.Y) if pt else None) for pt in part] for part in self]}
)を使用して、2つのフィーチャクラスのジオメトリをGeoJSONとして保存します。これは、ESRIがカーソルで使用する共有ジオメトリオブジェクトと、ディープコピーを作成できないことを回避するためです(gis.stackexchangeでのいくつかの議論でそれについて説明しています)。 - 一意の識別子に基づいて、2つのフィーチャクラスのジオメトリを確認します。たとえば、FC1 OID1ジオメトリとFC2 OID1ジオメトリを比較します。ジオメトリをESRIオブジェクトインスタンスとして取得するには、を呼び出して
arcpy.AsShape()
(穴のあるポリゴン(上記のポイント2を参照)を読み込むように変更しますreturn cls(Array([map(lambda p: Point(*p) if p is not None else Point(), part) for part in coordinates]))
。比較はGeometry Classにgeom1.equals(geom2)
示されているとおりです。
ジオメトリに約140の変更が見つかると予想されますが、私のスクリプトでは430があると主張しています。
以下に例を示します。
>>> geom1geoJSON
{'type': 'Polygon', 'coordinates': [[(-122.8423481559999, 47.060497293000083), (-122.84239755599992, 47.059262423000064), (-122.84416913599989, 47.059309693000046), (-122.84416913599989, 47.060497293000083), (-122.8423481559999, 47.060497293000083)]]}
>>> geom2geoJSON
{'type': 'Polygon', 'coordinates': [[(-122.8423481559999, 47.060497293000083), (-122.84239755599992, 47.059262423000064), (-122.84416913599989, 47.059309693000046), (-122.84416913599989, 47.060497293000083), (-122.8423481559999, 47.060497293000083)]]}
>>> geom1 = arcpy.AsShape(geom1geoJSON)
>>> geom2 = arcpy.AsShape(geom2geoJSON)
>>> geom1.equals(geom2)
False
>>> geom2.equals(geom1)
False
ここで予想される動作はTrue(Falseではない)でなければなりません。
すべてをogrジオメトリに移動する前に、何か提案はありますか?(ogr.CreateGeometryFromGeoJSON()は文字列を期待し、arcpy's __geo_interface__
は辞書を返すのでheしているので、さらに複雑になっているように感じます)。
質問に答えていない場合でも、次のリソースが役立つことがわかりました。
- ここでテキストにリンクされたgis.stackexchange.comのarcpy.Geometryの質問。
- arcgis.comフォーラムのarcpyのPolygonクラスのエラー(明らかに10.1で理論的に修正されたArcGIS 10.0には多くの精度エラーがありますが、10.0 SP5ではまだエラーが発生することを確認できません)。