Wie konvertiere ich mit Python ein Geos -Multilinestring in Polygon?
-
23-10-2019 - |
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
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])