用于根据纬度、经度计算重叠区域的Python包[重复]

Posted

技术标签:

【中文标题】用于根据纬度、经度计算重叠区域的Python包[重复]【英文标题】:Python package for calculating overlapping areas based on latitude, longitude [duplicate] 【发布时间】:2021-10-26 14:58:27 【问题描述】:

我有一个包含venue_id(大约1,500 个)、物理地址、纬度和经度的数据集。

我想创建一个名为“overlap”的列,它会计算重叠的venue_id 的数量(如果有)。

例如,对于venue_id == 1,如果在2km 半径内有任何其他venue_ids 在2km 半径范围内重叠,则将其计数并保存在“重叠”列中。如果有 2 个场所 ID 与场所 ID == 1 重叠,则“重叠”将等于 2。

到目前为止,我首先尝试使用“folium”对其进行可视化

import pandas as pd
import folium

m = folium.Map(location=[37.553975551114476, 126.97545224493899],
               zoom_start=10)

locations = df['lat'], df['lng']

df = df.dropna(how='any')
print(df.isna().sum())


for _, row in df.iterrows():
    folium.Circle(location=[row['lat'], row['lng']],
                        radius=2000).add_to(m)

m.save("index.html")

问题是,如果我理解正确,folium 的 Circle 会在“像素”中绘制一个圆圈,并且它固定为我选择创建基本地图的基本“缩放级别”。

我最好的猜测是使用“haversine”包,但如果有更好的方法来完成这项工作,你们中的任何人都可以提供一些建议吗?

附言只要正确计算了 2 公里半径测量值,就不需要实际可视化结果,我只尝试通过 folium 可视化它,看看我是否可以“手动”计算重叠的圆圈......

提前致谢。

【问题讨论】:

所以你不需要这些区域?仅在有重叠的情况下? 如果我正确阅读了Documentation,folium.Circle 以米为单位绘制,并将其绘制为矢量,因此它应该独立于缩放级别。对我的机器的快速测试功能与文档中提到的完全一样(folium 0.12.1)。 folium.CircleMarker 使用像素作为半径 @AlfredRodenboog 我再次阅读了文档,是的,它独立于缩放功能,但我真的不确定半径 = 2000 的圆圈是否精确地表示 2 公里。 @UlisesBussi 听起来像!会尽快试一试。非常感谢! @UlisesBussi 是的,我只需要计算每个场地 ID 的重叠次数 【参考方案1】:

听起来这里的目标只是确定有多少点位于数据集中任何其他点的 2 公里范围内。在这种情况下,Haversine 距离是要走的路。由于您只对短距离感兴趣并且您的点数相对较少,因此this answer 提供了中心功能。然后只需将其应用于您的数据即可。这是一种方法:

import pandas as pd
import numpy as np

# function from https://***.com/a/29546836/4325492
def haversine_np(lon1, lat1, lon2, lat2):
    """
    Calculate the great circle distance between two points
    on the earth (specified in decimal degrees)

    All args must be of equal length.    

    """
    lon1, lat1, lon2, lat2 = map(np.radians, [lon1, lat1, lon2, lat2])

    dlon = lon2 - lon1
    dlat = lat2 - lat1

    a = np.sin(dlat/2.0)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2.0)**2

    c = 2 * np.arcsin(np.sqrt(a))
    km = 6367 * c
    return km

# generate some sample data
lng1, lat1 = np.random.randn(2, 1000)
df = pd.DataFrame(data='lng':lng1, 'lat':lat1)

# Apply to the data
df['overlap'] = df.apply(lambda x: sum(haversine_np(x[0], x[1], df.lng, df.lat) <= 2) - 1, axis=1)

应用函数时,只计算另一个点距离

【讨论】:

不错的解决方案,我喜欢您使用自定义 hasrsine 函数进行矢量化的方式。我在使用 hasrsine 包时遇到了问题。无论如何,我认为点之间的距离应该是 4 公里,因为 OP 对重叠 2k 半径圆感兴趣 @Brendan A. 这绝对是我一直在寻找的,并且可以很好地处理示例数据。但是当我用我的数据框尝试它时收到一条奇怪的错误消息,说“TypeError:输入类型不支持ufunc'radians',并且根据强制转换规则''safe'无法安全地将输入强制转换为任何支持的类型” '”。一旦我解决了这部分问题,我认为它会很好地解决问题。

以上是关于用于根据纬度、经度计算重叠区域的Python包[重复]的主要内容,如果未能解决你的问题,请参考以下文章

用于足迹的纬度/经度的 Python 排序字典

使用纬度和经度计算多边形区域

计算指定区域的经纬度范围

根据纬度/经度计算密度

python如何根据经纬度输出最近距离点

使用从笛卡尔空间和世界文件生成的纬度和经度计算多边形区域