python中的加速地理定位算法
我有一套100k的地理位置(lat/lon)和一个六角网格(4k多边形)。我的目标是计算位于每个多边形内的点的总数 我当前的算法使用2个for循环在所有地理点和所有多边形上循环,如果我增加多边形的数量,速度会非常慢。。。你将如何加速算法?我上传了一个最小的例子,它创建了100k个随机地理点,并在网格中使用了561个单元格 我还看到读取geo json文件(包含4k多边形)需要一些时间,也许我应该将多边形导出为csv hexagon_grid.geojson文件: 最小python示例:python中的加速地理定位算法,python,multithreading,python-2.7,numpy,pandas,Python,Multithreading,Python 2.7,Numpy,Pandas,我有一套100k的地理位置(lat/lon)和一个六角网格(4k多边形)。我的目标是计算位于每个多边形内的点的总数 我当前的算法使用2个for循环在所有地理点和所有多边形上循环,如果我增加多边形的数量,速度会非常慢。。。你将如何加速算法?我上传了一个最小的例子,它创建了100k个随机地理点,并在网格中使用了561个单元格 我还看到读取geo json文件(包含4k多边形)需要一些时间,也许我应该将多边形导出为csv hexagon_grid.geojson文件: 最小python示例: 您不需
您不需要显式地测试每个六边形以查看给定点是否位于其内部 现在,让我们假设所有点都位于六边形网格的边界内。因为你们的六边形形成了一个规则的晶格,你们只需要知道哪个六边形中心离每个点最近 这可以使用以下公式非常有效地计算: 打印输出:
from matplotlib import pyplot as plt
fig, ax = plt.subplots(1, 1, subplot_kw={'aspect': 'equal'})
ax.hold(True)
ax.scatter(xy[:, 0], xy[:, 1], 10, c='b', alpha=0.25, edgecolors='none')
ax.scatter(centroids[:, 0], centroids[:, 1], marker='h', s=(counts + 5),
c=counts, cmap='Reds')
ax.margins(0.01)
我可以想出几种不同的方法来处理网格外的点,具体取决于您需要的精度:
- 可以排除位于六边形顶点外边界矩形之外的点(即
,x
等)。但是,这将无法排除沿栅格边缘落在“间隙”内的点x>xmax
- 另一个简单的选择是根据六边形中心的间距在距离上设置一个截止值,这相当于使用外六边形的圆形近似值
- 如果精度至关重要,则可以定义与六边形栅格外部顶点对应的
,然后使用其测试点是否包含在其中。与其他两种方法相比,这可能会更慢、更容易编写代码matplotlib.path.path
plt.scatter
。您还应该知道matplotlib有一个内置函数,用于绘制六边形二元直方图(plt.hexbin
),尽管我不确定它的相对性能。
from matplotlib import pyplot as plt
fig, ax = plt.subplots(1, 1, subplot_kw={'aspect': 'equal'})
ax.hold(True)
ax.scatter(xy[:, 0], xy[:, 1], 10, c='b', alpha=0.25, edgecolors='none')
ax.scatter(centroids[:, 0], centroids[:, 1], marker='h', s=(counts + 5),
c=counts, cmap='Reds')
ax.margins(0.01)