arcpy.geometry __geo_interface__およびAsShape()関数:精度と穴の喪失


10

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

回答:


5

OK-まあ、私はそれを解決したと思った。

このファイルC:\ Python26 \ ArcGIS10.0 \ Lib \ arcpy \ arcobjects \ geometries.pyの〜80行を次のように置き換えます:

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

これ(またはより簡潔でエレガントで同じことをするもの):

  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

基本的に、彼らはヌルポイント値でマークされた形状のドーナツを考慮することを忘れていました。これは適切なgeoJson(個別のパーツ)を吐き出しますが、arcpy.AsShapeメソッドはGeoJSONを破棄します。

このコード:

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__

これを出力します:

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

あきらめる。;)

更新 穴の問題は、次のPythonのチャンクによって10.1で解決されました。

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

辞書を表す文字列の代わりに辞書を返すべきではありませんか?:)
blah238

はい、そうです、そうです。有効なGeoJSON辞書objを吐き出すように変更しました。しかし、AsShapeメソッドと照合した後、私は自分の努力の無益さに気づきました。
valveLondon、2012年

これはこのスレッドで説明されている問題と関係があるのでしょうか?forums.arcgis.com/threads/9763-Errors-in-arcpy-s-Polygon-class-10 SP2で修正され、間違いなく10.1で修正されているはずです。
blah238

2
ESRI C:\Program Files\ArcGIS\Server\arcpy\arcpy\arcobjects\geometries.pyは10.1で更新されましたが、10.0の場合は自分で修正できます。
valveLondon、

3
はい、10.1で修正しました.py。上記の更新はファイル内の新しいソースです。10のサービスパックにしたと思ったが、そうではなかったと思う。
Jason Scheirer、2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.