如何从 lon/lat 坐标计算形状并用 plotly 绘制它

问题描述

我有一个基于 plotly 的地图,我在 MapBox 散点图中显示了几个坐标。现在我想从这些坐标中获取一个形状并在地图上绘制一个形状。

坐标以 pandas.Series 形式提供。下面是坐标的摘录。

0    [[51.795,3.363],[51.79483333333334,...
1    [[51.42536,2.622246666666667],[51.4256883333 ...

如何获得这些坐标的形状,哪些边界是集群的最外坐标?

enter image description here

解决方法

在几何中,基本上有两个主要概念 Convex hullAlpha shape(也称为 Concave hull)来获得有限点集的形状。下图应该可以直观地描述它们之间的区别 [2]。

enter image description here

如果您想要凸包,您可以使用 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()

低于最终结果。

enter image description here

作为 scipy 的替代方案,您还可以选中 geopandasalphashape