Shapely MultiPolygonからPolygonへの変換:この手法は常に機能するとは限りません


10

外部座標を取得するために、形の良いMultiPolygonをPolygonに変換する必要があります。私はそれをこのようにします:

if poly.geometry.type == 'Polygon':
    x, y = poly.geometry.exterior.xy
elif poly.geometry.type == 'MultiPolygon':
    allparts = [p.buffer(0) for p in poly.geometry]
    poly.geometry = shapely.ops.cascaded_union(allparts)
    x, y = poly.geometry.exterior.xy  # here happens the error

これは頻繁に成功しますが、次のエラーが発生するため、Polygonが明らかにMultiPolygonのままである場合もあります。

AttributeError: 'MultiPolygon' object has no attribute 'exterior'

ただし、MultiPolygonのすべての部分がポリゴンであり、それ自体がMultiPolygonではないことを確認しました。

>>>>[p.type for p in poly.geometry]
['Polygon', 'Polygon']

これがなぜ起こるのか、そしてそれを修正する方法はありますか?

ポリゴンの穴にできますか?私はこのように見えます: ここに画像の説明を入力してください


MultiPolygonはポリゴンの単純なリストであるため、リストには「外部」はありませんが、リスト内のすべてのポリゴンには「外部」があります。ポリゴンが必要な場合は、forループ([p.exterior.xy for p in Multi)]
gene

わかりましたが、MultiPolygonの外部座標を取得するために何ができますか?私のアプローチでは、単一のポリゴンの結合を試みていますが、これはここでは機能しないようです...
カントリーマン

その間にAPIの形が変わった可能性はありますか?に属性geometryが表示されませんPolygonが、geom_type
K.-Michael Aye

回答:


14

Shapelyバイナリ述語を理解する必要があります。

1)2つのポリゴンがunionまたはunary_union(赤)の結果と交差する場合は、ポリゴンであるため、外部を計算できます。

ここに画像の説明を入力してくださいここに画像の説明を入力してください

2)2つのポリゴンが接続されていない場合、結果はMultiPolygon(2つのポリゴンがある赤)である必要があります。

ここに画像の説明を入力してくださいここに画像の説明を入力してください

トポロジなしでシェープファイルを操作すると、これが発生する可能性があります

解決策は、凹包を計算することですが、実際には結合ではありません。

ここに画像の説明を入力してください


さて、確かに、私はこれが事実であり、論理であることがわかりました!どうもありがとう!
同国人

1
凹面の船体をどのように計算しますか?
Dima Lituiev
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.