Python 基于纬度、经度计算重叠区域的包
Python package for calculating overlapping areas based on latitude, longitude
我有一个包含 venue_id(大约 1,500 个)、物理地址、纬度和经度的数据集。
我想创建一个名为 'overlap' 的列,它计算重叠 venue_id 的数量(如果有的话)。
例如,对于venue_id == 1,在2km半径内如果有任何其他venue_ids在2km半径方面重叠,计数并保存它在列 'overlap' 中。如果有 2 个 venue_id 与 venue_id == 1 重叠,则 'overlap' 等于 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会在'pixel'画一个圆,如果我没理解错的话,它是固定在底座上的'zoom-level'我选择了创建底图
- 我最好的猜测是利用 'haversine' 包,但如果有更好的方法来完成这项工作,你们中的任何人都可以提供一些建议吗?
p.s。只要正确计算了 2km 半径测量值,就不需要实际可视化结果,我只是尝试通过 folium 可视化它,看看我是否可以 'manually' 计算重叠的圆...
提前致谢。
听起来这里的目标只是确定在数据集中任何其他点的 2 公里范围内有多少点。在这种情况下,Haversine 距离是可行的方法。由于您只对短距离感兴趣并且您的点数相对较少,因此 this answer 提供了中心功能。然后只需将其应用于您的数据即可。这是一种方法:
import pandas as pd
import numpy as np
# function from
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)
应用函数时,只计算另一点距离<= 2km的次数。我们再次减去 1,因为该函数应用于所有行,并且每个点距自身 0km。
我有一个包含 venue_id(大约 1,500 个)、物理地址、纬度和经度的数据集。
我想创建一个名为 'overlap' 的列,它计算重叠 venue_id 的数量(如果有的话)。
例如,对于venue_id == 1,在2km半径内如果有任何其他venue_ids在2km半径方面重叠,计数并保存它在列 'overlap' 中。如果有 2 个 venue_id 与 venue_id == 1 重叠,则 'overlap' 等于 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会在'pixel'画一个圆,如果我没理解错的话,它是固定在底座上的'zoom-level'我选择了创建底图
- 我最好的猜测是利用 'haversine' 包,但如果有更好的方法来完成这项工作,你们中的任何人都可以提供一些建议吗?
p.s。只要正确计算了 2km 半径测量值,就不需要实际可视化结果,我只是尝试通过 folium 可视化它,看看我是否可以 'manually' 计算重叠的圆...
提前致谢。
听起来这里的目标只是确定在数据集中任何其他点的 2 公里范围内有多少点。在这种情况下,Haversine 距离是可行的方法。由于您只对短距离感兴趣并且您的点数相对较少,因此 this answer 提供了中心功能。然后只需将其应用于您的数据即可。这是一种方法:
import pandas as pd
import numpy as np
# function from
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)
应用函数时,只计算另一点距离<= 2km的次数。我们再次减去 1,因为该函数应用于所有行,并且每个点距自身 0km。