Frage

Ich entwickle eine Geodjango -Anwendung, in der Benutzer Kartendateien hochladen und einige grundlegende Zuordnungsvorgänge wie Abfragen von Funktionen innerhalb von Polygonen durchführen können.

Ich erkannte, dass Benutzer "Multilinestrings" anstelle von "Polygon" manchmal hochladen. Dies führt dazu, dass die Fragen, die erwartet, geschlossene Geometrien scheitern.

Was ist der beste Weg, um ein Multilinestring -Objekt in ein Polygon in Python umzuwandeln?

Vielen Dank.

- Omat

War es hilfreich?

Lösung

Hehe, zuerst habe ich Folgendes geschrieben:

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

Aber dann entdeckte ich, dass es eine raffinierte kleine Methode nennt convex_hull Das führt die Polygonumwandlung für Sie automatisch aus.

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

Andere Tipps

Dieser kleine Code kann viel Zeit sparen, vielleicht wird später ein kürzeres Formular in Geopandas aufgenommen.

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])
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top