如何将GEOS MultiLineString转换为多边形?

问题描述 投票:5回答:2

我正在开发一个GeoDjango应用程序,用户可以在其中上传地图文件并执行一些基本的映射操作,例如查询多边形内的要素。

我认识到用户有时会上载“ MultiLineString”而不是“ Polygon”。这会导致期望封闭几何的查询失败。

在Python中将MultiLineString对象转换为多边形的最佳方法是什么?

python gis polygon multilinestring geos
2个回答
5
投票

呵呵,起初我是这样写的:

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)),)

0
投票
此小代码可以节省很多时间,也许以后会合并在Geopandas中使用的较短形式。

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])

© www.soinside.com 2019 - 2024. All rights reserved.