You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

大规模GeoJSON数据中坐标点与多边形归属检测的高效实现方案探讨

高效实现单点匹配百万级静态多边形集合的坐标归属判断

我正在做一个坐标映射相关的项目,核心需求是判断坐标点是否属于指定的多边形集合。目前项目的数据规模相当大:要处理约1000万个坐标点,匹配超过1亿个多边形。我已经查过相关问题,这次不是重复提问——我的场景是动态坐标点与静态多边形的匹配,和之前看到的批量静态点匹配场景不太一样。

为了聚焦问题,我先缩小了测试范围:用单个坐标点匹配200万个建筑轮廓多边形,分别试了两种方法:

方法1:基于Shapely的实现

from shapely.geometry import shape, Point
import json

f = open('path/to/file.geojson', 'r')
data = json.loads(f.read())
point = Point(42.3847, -71.127411)
for feature in data['features']:
    polygon = shape(feature['geometry'])
    if polygon.contains(point):
        print(polygon)

遍历200万个多边形花了大概30秒,这个效率完全达不到项目要求。

方法2:基于mplPath的实现

import matplotlib.path as mplPath
import numpy as np
from tqdm import tqdm
import json

f = open('path/to/file.geojson', 'r')
data = json.loads(f.read())

building_arrays = [np.array(data['features'][i]['geometry']['coordinates'][0]) for i, v in enumerate(tqdm(data['features']))]
bbPath_list = [mplPath.Path(building) for building in tqdm(building_arrays)]
for b in tqdm(bbPath_list):
    if b.contains_point((-71.1273842, 42.3847423)):
        print(b)

这个方法耗时约6秒,比Shapely快了不少,但放到项目整体的千万级坐标点+亿级多边形的规模里看,还是慢得没法接受。

现在想请教各位大佬:

  • 有没有更高效的实现方式?目前我暂时不想用PySpark这类分布式计算方案(打算把它当作最后的备选),但实在不行的话也可以考虑。
  • 能不能用向量化计算替代逐一遍历多边形的方式来提升效率?后续我会更新用numba优化后的测试结果。

内容的提问来源于stack exchange,提问作者mmz

火山引擎 最新活动