Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的加速地理定位算法_Python_Multithreading_Python 2.7_Numpy_Pandas - Fatal编程技术网

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示例: 您不需

我有一套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
    ,然后使用其测试点是否包含在其中。与其他两种方法相比,这可能会更慢、更容易编写代码


看起来很棒。我现在有足够大的网格结构,这样就没有点在外面了。。。我也喜欢视觉化。在作为Web服务器运行的google maps上打印也很容易吗?Matplotlib本身对此没有规定。您可能需要查看。ok将查看gmplot。是否可以使matplot示例中的单元格大小相等,并且仅使用颜色来表示频率?e、 g.是的,请查看文档字符串以查找
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)