用于根据纬度、经度计算重叠区域的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包[重复]的主要内容,如果未能解决你的问题,请参考以下文章