如何使用PHP/MySQL计算并使用Morton(z-index)值来索引地理数据?
我有一个MySQL记录表,每个记录都有一个lat/lng坐标。根据中心点和半径对该数据进行搜索(返回半径内的任何记录)。我用球余弦定律来计算查询中的距离。我的问题是索引地理数据的效率非常低(lat/lng值存储为浮动)。使用MySQL的空间扩展不是一个选项。由于数据集的大小约为100k,因此执行查询所需的时间不合理 我做了一些研究,似乎使用z指数,即莫顿数可以有所帮助。我可以在插入时计算每条记录的莫顿数,然后根据地球半径/中心点/给定搜索半径计算边界框的高/低莫顿值如何使用PHP/MySQL计算并使用Morton(z-index)值来索引地理数据?,php,mysql,indexing,geolocation,z-order-curve,Php,Mysql,Indexing,Geolocation,Z Order Curve,我有一个MySQL记录表,每个记录都有一个lat/lng坐标。根据中心点和半径对该数据进行搜索(返回半径内的任何记录)。我用球余弦定律来计算查询中的距离。我的问题是索引地理数据的效率非常低(lat/lng值存储为浮动)。使用MySQL的空间扩展不是一个选项。由于数据集的大小约为100k,因此执行查询所需的时间不合理 我做了一些研究,似乎使用z指数,即莫顿数可以有所帮助。我可以在插入时计算每条记录的莫顿数,然后根据地球半径/中心点/给定搜索半径计算边界框的高/低莫顿值 我对这方面的知识只够构建我的
我对这方面的知识只够构建我的应用程序,所以我不能完全确定这是否可行,我也不知道如何用PHP计算Morton数。这是一个按位操作吗?如果你的半径与地球的大小相比很小,那么你可能可以使用简单的2D毕达哥拉斯而不是昂贵的3D球形几何体。如果你离两极越近,这可能就越不真实,所以我希望你不是在绘制企鹅或北极熊的地图 接下来,考虑问题的边界框。您知道它们必须在搜索点的+/-$半径范围内。将搜索半径转换为度,并在搜索中心+/-$radiusingrees定义的框内查找lat/lon所在的所有记录 如果您首先进行搜索并列出可能的匹配项列表,那么您只需从结果数据集中筛选出搜索框的各个角。如果返回匹配点的纬度/经度,则可以用PHP计算距离,从而避免计算表中所有点的距离。这有意义吗 使用数据库查找正方形边界框内的所有内容,然后使用PHP过滤超出所需半径的点