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

oma*_*mat 5 python gis polygon geos multilinestring

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

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

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

谢谢。

-oMat

And*_*yuk 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
Run Code Online (Sandbox Code Playgroud)

但后来我发现有一个漂亮的小方法,名为「凸面船身」,可以自动为您进行多边形转换。

>>> 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)),)
Run Code Online (Sandbox Code Playgroud)

  • 多行的凸包可能不是您所需要的。凸包定义了包含该形状的最小多边形,并且可能不如您所需要的那样精确,因为它不会在形状边界上包含“内部”的任何点。即,如果您有一个形状已从中取出大块的形状,则可能看不到该形状的边界外有一个大块。 (11认同)
  • 您可以使用 shapely.geometry.Polygon 将线字符串简单地转换为多边形。它将连接第一个和最后一个坐标。尝试使用 Polygon([(0, 0), (1, 1), (1, 2), (0, 1)]) 或 Polygon(s1) 生成 POLYGON ((0 0, 1 1, 1 2, 0 1 , 0 0))。 (2认同)