Как преобразовать GEOS MultiLineString в Polygon, используя Python? - PullRequest
4 голосов
/ 03 июня 2010

Я занимаюсь разработкой приложения GeoDjango, в котором пользователи могут загружать файлы карт и выполнять некоторые базовые операции отображения, такие как запросы к функциям внутри полигонов.

Я понял, что иногда пользователи загружают «MultiLineString» вместо «Polygon». Это приводит к тому, что запросы, ожидающие замкнутых геометрий, не будут работать.

Каков наилучший способ преобразования объекта MultiLineString в Polygon в Python?

Спасибо.

- Omat

1 Ответ

4 голосов
/ 04 июня 2010

Хе-хе, сначала я написал это:

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

но потом я обнаружил, что есть изящный маленький метод с именем convx_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)),)
...