Вопрос

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

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

Как лучше всего преобразовать многолинейный объект в полигон в Python?

Спасибо.

- Омат

Это было полезно?

Решение

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

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

Но потом я обнаружил, что есть изящный маленький метод под названием выпуклая оболочка Это автоматически переоборудован для полигона.

>>> 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])
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top