arcpyジオメトリをgeojsonとしてシリアル化しているため、後でジオメトリとして「ハイドレート」して元に戻すことができ、サイクルで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:穴 ポリゴンに穴がある場合、geo_interfaceはエラーを生成します。
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番に出くわした。そして、このトピックへの愛情はあまりないようです。
—
valveLondon、2011
これは、ArcGIS 10.1のarcpyではまだ壊れています-ESRIがこの件についてコメントできると便利です。
—
James Mills
最初と2番目の問題に遭遇しました。私の場合、調整すると(印刷したときに)変更されないようですが、geom1.equals(geom2)で数回失敗します。それがなぜ起こるのか私にはわかりません。2番目の問題は、@ valveLondonの提案を使用して修正されました。.equalsの修正方法がわかった場合は、共有してください。
—
Michalis Avraam
@MichalisAvraam同じ問題があり、ESRIで解決策を得ました-既知のバグであることが判明しました(プロジェクションなしでgeomを作成すると、精度が切り捨てられます)- この質問も見てください。
—
om_henners
@om_henners私はそれを仮定しました。ただし、arcpy.AsShape()関数では空間参照を指定できません。私はそれが何かをすることを期待してすべての環境変数を設定しました(出力コードなど...)。解決策は、ESRIが精度を気にしないため、GeoJSONを手動でデコードすることですか?
—
Michalis Avraam