Python 基于纬度、经度计算重叠区域的包

Python package for calculating overlapping areas based on latitude, longitude

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

到目前为止,我首先尝试使用 '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'我选择了创建底图

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。