首页 > 编程问答 >有没有任何命令可以给我一个基于多点几何的 alpha 形状?

有没有任何命令可以给我一个基于多点几何的 alpha 形状?

时间:2024-07-24 16:43:05浏览次数:15  
标签:python geopandas convex-hull concave-hull alpha-shape

大家好,

我拥有具有多点作为几何形状的聚类地理数据。我能够使用 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 函数直接应用于每个集群的点几何。

解释:

  1. 导入 alphashape 你需要从 shapely.ops 导入 alphashape 函数。
  2. 定义 alpha alpha 参数控制 α 形状的平滑度。较低的数值会产生更紧密的形状,而较高的数值会产生更平滑的形状。你需要根据你的数据和所需的粒度对此参数进行试验。
  3. 应用 alphashape alphashape 函数以点集合作为输入,在本例中是每个集群的 point 几何。 unary_union 用于将点的 GeoSeries 转换为 Shapely MultiPoint 对象,该对象是 alphashape 所需的。
  4. 绘制结果: 为了比较,代码会绘制凸包和 α 形状。

通过这种修改,你就可以为你的聚类地理数据生成 α 形状并分析它们。

标签:python,geopandas,convex-hull,concave-hull,alpha-shape
From: 69195026

相关文章

  • Python 的分布式锁管理器
    我有一堆具有多个实例的服务器,这些实例访问的资源对每秒的请求有硬性限制。我需要一种机制来锁定所有正在运行的服务器和实例对此资源的访问。有我在github上找到的一个restful分布式锁管理器:https://github.com/thefab/restful-distributed-lock-manager不幸......
  • 如何在Python中提示self变量的类型
    通常不需要关心Python类成员函数中的self变量,但我正在实现一个装饰器,看起来像defextractor(depends:List[Text]=None,provides:List[Text]=None)->Callable[[ExtractorFunction],Extracto......
  • 将 Python 类型提示限制为元组中的值
    我的方法之一采用status中使用的filter()参数。此参数与定义如下的模型字段相关:STATUS_CHOICES=((1,_("draft")),(2,_("private")),(3,_("published")),)classMyModel(Model):status=models.PositiveSmallIntegerFi......
  • 在python中查找区间数据的中位数
    我正在探索不同的python库,我想知道如何找到分组数据集的近似中值。这里有一个表格供参考。年龄频率1-1012310-203502......
  • 比较Python中的字符串统一特殊字符
    也许我可以使用更好的英语,但我想要的是忽略单词中的重音(和类似的),所以:renè、rené、rene'和rene应该是相同的,所以应该mañana和manana或even-distribuited和evendistribuited,可能还有sho......
  • 如何使用 Python 脚本从客户账单电子邮件中获取订单 ID - WooCommerce API
    我想创建一个python脚本,返回只知道客户的账单电子邮件的订单。我尝试这样做,但返回所有最近的订单:fromwoocommerceimportAPIwcapi=API(url="https://siteexample.com",consumer_key="ck_xxx",consumer_secret="cs_xxx",version="wc/v3")......
  • python基础理论小总结
    1.python语言的特性Python是一门解释型语言,简单清晰,开源免费,跨平台,有大量第三方库辅助开发,支持面向对象与自动垃圾回收,方便与其他编程语言相互调用。Python在数据采集、人工智能、WEB后台开发、自动化运维、测试等方向应用广泛。2.解释型语言和编译型语言的区别执行方式不......
  • python编码规范
    本篇讲的是代码格式化的问题,解决格式化的方法在最下方,不想看内容的,滑到最下方就好了。一、变量的命名规则1.组成:字母、数字、下划线2.不可以以数字开头3.不建议使用下划线开头4.命名需见名知意5.不要与关键字重名。如何查找所有关键字?importkeywordprint(keyword.k......
  • Python爬虫开发中的常用库与框架安装指南
    在Python爬虫开发中,选择合适的库和框架可以大大提高开发效率和爬虫的性能。本文将介绍一些常用的解析库、请求库、储存库、Web库、App爬取库以及爬虫框架,并展示如何使用pip命令进行安装。一、解析库1.BeautifulSoupBeautifulSoup是一个用于从HTML或XML文件中提取数据的Pyth......
  • 如何在Python中的指定项目之后添加新项目到嵌套列表?
    给定的列表是这样的。list1=[10,20,[300,400,[5000,6000],500],30,40]预期输出是这样的。我知道这是一个非常基本的问题,但我很困惑。输出:[10,20,[300,400,[5000,6000,7000],500],30,40]我希望有人能帮助我解决这个问题。并解释了嵌套列表的插入功......