大家好,
我拥有具有多点作为几何形状的聚类地理数据。我能够使用 geopanda 的方法
convex_hull
创建凸包。但不知何故,我无法找到类似的命令来创建 alpha 形状。或者给我一个给定簇中所有点的严格边界。
出于演示目的,我将在此处提供代码。该代码从 Open Street Map 下载示例数据,使用 HDBSCAN 方法对点进行聚类,然后为每个聚类创建凸包。
# Import all necessary packages
import pandas as pd
import geopandas as gpd
import osmnx as ox
from hdbscan import HDBSCAN
import numpy as np
# Get the sample data from OSM
tags={"amenity": 'restaurant'}
place_name = 'San Diego'
sample = ox.geometries_from_place(
place_name, tags={"amenity": ['restaurant', 'bar']}
)[["name", "geometry"]]
# Change crs to calculate centroids
sample_albers = sample.to_crs(epsg=3311) # This is only the sample data. CRS might be wrong, but it is not the main focus here
sample_albers['point'] = sample_albers.centroid
sample_albers.set_geometry('point', inplace = True)
# Create lat and lon to cluster the data
lon_lat = np.column_stack((sample_albers['point'].x, sample_albers['point'].y))
# Apply HDBSCAN, get labels directly and dissolve the sample data by labels
labels = HDBSCAN(min_cluster_size=10).fit(lon_lat).labels_
clusters = sample_albers[['point']].dissolve(by=labels)
# Creating Convex Hulls
clusters['convex_hull'] = clusters.convex_hull
主要问题是关于最后一个命令。我想以类似的方式创建一个 alpha 形状(带有 predifend alpha 参数),其中我将拥有多边形,就像凸包的情况一样。
有什么建议吗?
虽然 GeoPandas 没有直接创建 α 形状的内置函数,但你可以使用
Shapely
库来实现。Shapely 有一个
alphashape
函数,可以用来从点集创建 α 形状。
以下是如何修改你的代码以创建 α 形状的方法:
import geopandas as gpd
from shapely.ops import alphashape
from descartes import PolygonPatch
import matplotlib.pyplot as plt
#...(你的现有代码)...
# 创建 Alpha 形状
alpha = 0.2 # 定义 alpha 参数。你可能需要对此进行试验以找到最适合你数据的数值
clusters['alpha_shape'] = clusters['point'].apply(lambda points: alphashape(points.unary_union, alpha))
# 绘制结果,比较凸包和 alpha 形状
fig, ax = plt.subplots()
clusters.plot(ax=ax, color='white', edgecolor='black')
clusters.convex_hull.plot(ax=ax, color='blue', alpha=0.3)
clusters.alpha_shape.plot(ax=ax, color='red', alpha=0.3)
plt.show()
这段代码首先计算每个集群的 α 形状,然后将其存储在
alpha_shape
列的新几何中。
alphashape
函数直接应用于每个集群的点几何。
解释:
-
导入
alphashape
: 你需要从shapely.ops
导入alphashape
函数。 -
定义
alpha
:alpha
参数控制 α 形状的平滑度。较低的数值会产生更紧密的形状,而较高的数值会产生更平滑的形状。你需要根据你的数据和所需的粒度对此参数进行试验。 -
应用
alphashape
:alphashape
函数以点集合作为输入,在本例中是每个集群的point
几何。unary_union
用于将点的 GeoSeries 转换为 Shapely MultiPoint 对象,该对象是alphashape
所需的。 - 绘制结果: 为了比较,代码会绘制凸包和 α 形状。
通过这种修改,你就可以为你的聚类地理数据生成 α 形状并分析它们。
标签:python,geopandas,convex-hull,concave-hull,alpha-shape From: 69195026