Pythonを使用してGEOSマルチリネストリングをポリゴンに変換する方法は?
-
23-10-2019 - |
質問
ユーザーがマップファイルをアップロードし、ポリゴン内のクエリ機能などの基本的なマッピング操作を実行できるGeodjangoアプリケーションを開発しています。
ユーザーは、「ポリゴン」の代わりに「マルチリネストリング」を時々アップロードしていることを認識しました。これにより、閉じたジオメトリが失敗することを期待するクエリが発生します。
マルチリネストリングオブジェクトをPythonのポリゴンに変換する最良の方法は何ですか?
ありがとう。
- オマット
解決
hehe、最初はこれを書きました:
def close_geometry(self, geometry):
if geometry.empty or geometry[0].empty:
return geometry # empty
if(geometry[-1][-1] == geometry[0][0]):
return geometry # already closed
result = None
for linestring in geom:
if result is None:
resultstring = linestring.clone()
else:
resultstring.extend(linestring.coords)
geom = Polygon(resultstring)
return geom
しかし、その後、私は呼ばれる気の利いた小さな方法があることを発見しました convex_hull これにより、ポリゴン変換は自動的に行われます。
>>> s1 = LineString((0, 0), (1, 1), (1, 2), (0, 1))
>>> s1.convex_hull
<Polygon object at ...>
>>> s1.convex_hull.coords
(((0.0, 0.0), (0.0, 1.0), (1.0, 2.0), (1.0, 1.0), (0.0, 0.0)),)
>>> m1=MultiLineString(s1)
>>> m1.convex_hull
<Polygon object at...>
>>> m1.convex_hull.coords
(((0.0, 0.0), (0.0, 1.0), (1.0, 2.0), (1.0, 1.0), (0.0, 0.0)),)
他のヒント
この小さなコードは多くの時間を節約できます。おそらく、後でジオパンダのより短い形が組み込まれます。
import geopandas as gpd
from shapely.geometry import Polygon, mapping
def linestring_to_polygon(fili_shps):
gdf = gpd.read_file(fili_shps) #LINESTRING
geom = [x for x in gdf.geometry]
all_coords = mapping(geom[0])['coordinates']
lats = [x[1] for x in all_coords]
lons = [x[0] for x in all_coords]
polyg = Polygon(zip(lons, lats))
return gpd.GeoDataFrame(index=[0], crs=gdf.crs, geometry=[polyg])
所属していません StackOverflow