问题描述
我有一个基于 plotly
的地图,我在 MapBox 散点图中显示了几个坐标。现在我想从这些坐标中获取一个形状并在地图上绘制一个形状。
坐标以 pandas.Series
形式提供。下面是坐标的摘录。
0 [[51.795,3.363],[51.79483333333334,...
1 [[51.42536,2.622246666666667],[51.4256883333 ...
如何获得这些坐标的形状,哪些边界是集群的最外坐标?
解决方法
在几何中,基本上有两个主要概念 Convex hull 和 Alpha shape(也称为 Concave hull)来获得有限点集的形状。下图应该可以直观地描述它们之间的区别 [2]。
如果您想要凸包,您可以使用 scipy.spatial.ConvexHull
[4]。
请在下面找到一个基本示例,说明如何使用 scipy.spatial.ConvexHull
计算某些随机生成的坐标的凸包并使用 plotly
绘制形状。
import plotly.express as px
import numpy as np
from scipy.spatial import ConvexHull
def get_random_coordinate():
return [ np.random.uniform(54.9,56.2),np.random.uniform(2.3,3.2) ]
points = [ get_random_coordinate() for _ in range(20) ]
def get_convex_hull():
hull = ConvexHull(points)
return [ [hull.points[visible_facet][1],hull.points[visible_facet][0]] for visible_facet in hull.vertices ]
convex_hull_points = get_convex_hull()
fig = px.scatter_mapbox(points,lat=0,lon=1,zoom=6)
fig.update_layout(
mapbox = {
'style': "open-street-map",'layers': [
{
'source': {
'type': "FeatureCollection",'features': [{
'type': "Feature",'geometry': {
'type': "MultiPolygon",'coordinates': [[convex_hull_points]]
}
}]
},'type': "fill",'below': "traces",'color': "#FF00AA",'opacity': 0.5
}
]}
)
fig.show()
低于最终结果。
作为 scipy
的替代方案,您还可以选中 geopandas 和 alphashape。