使用Geopandas和Folium在Python中绘制多边形

4
我需要根据“区域”绘制多边形。我想要一条线沿着区域的外部,来定义它的周长。
以下是我的代码:
#Import the source data and libraries
import pandas as pd
import geopandas as gpd
import folium
from shapely.geometry import Polygon
df = pd.read_csv('tacs.csv')

#Extract the lat long lists from the datasource
lat_point_list = df['magnet.latitude'].tolist()
lon_point_list = df['magnet.longitude'].tolist()

#Some wizardry
polygon_geom = Polygon(zip(lon_point_list, lat_point_list))
crs = {'init': 'epsg:4326'}
polygon = gpd.GeoDataFrame(index=[0], crs=crs, geometry=[polygon_geom])       

#output to files
polygon.to_file(filename='polygon.geojson', driver='GeoJSON')
polygon.to_file(filename='polygon.shp', driver="ESRI Shapefile")

#plot on a map with central point being birmingham
m = folium.Map([51.509865, -0.118092], zoom_start=12, tiles='cartodbpositron')
folium.GeoJson(polygon).add_to(m)
folium.LatLngPopup().add_to(m)
m

问题是,显示出来的效果像下面这样。它不是沿着周长画出的线条,而是一个相互交织的乱麻。
有什么办法可以解决这个问题吗? enter image description here
2个回答

3

有一个名为convex_hull的属性。根据此文档:

GeoSeries.convex_hull返回表示每个几何图形的凸包的几何系列。

几何图形的凸包是包含每个几何图形中所有点的最小凸多边形,除非几何对象中的点数少于三个。对于两个点,凸包会缩成一个LineString; 对于1个点,是一个点。

这里是一个例子:

import geopandas as gpd
from shapely.geometry import Polygon

lat_point_list = [50.854457, 48.853033, 52.518172, 50.072651, 50.854457]
lon_point_list = [4.377184, 2.349553, 13.407759, 14.435935, 4.377184]

polygon_geom = Polygon(zip(lon_point_list, lat_point_list))
polygon_geom2 = polygon_geom.convex_hull # the atribute
import folium
m = folium.Map([50.854457, 4.377184], zoom_start=5, tiles='cartodbpositron')
folium.GeoJson(polygon_geom).add_to(m)
folium.GeoJson(polygon_geom2).add_to(m)
folium.LatLngPopup().add_to(m)
m

2
一个非凸多边形的凸包不是它的周长。一种方法(可能还有更好的方法)是将该多边形重构为一个线性环:
#a polygon:
R = shapely.geometry.Polygon([[1,2],[2,3],[3,2],[1,2]])
#cast as linearring:
L = shapely.geometry.LinearRing(R.exterior.coords)

然后,您可以将geodataframe中Polygons的几何列替换为LinearRings/LineStrings的几何列,并绘制它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接