Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.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
如何使用PHP/MySQL计算并使用Morton(z-index)值来索引地理数据?_Php_Mysql_Indexing_Geolocation_Z Order Curve - Fatal编程技术网

如何使用PHP/MySQL计算并使用Morton(z-index)值来索引地理数据?

如何使用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指数,即莫顿数可以有所帮助。我可以在插入时计算每条记录的莫顿数,然后根据地球半径/中心点/给定搜索半径计算边界框的高/低莫顿值 我对这方面的知识只够构建我的

我有一个MySQL记录表,每个记录都有一个lat/lng坐标。根据中心点和半径对该数据进行搜索(返回半径内的任何记录)。我用球余弦定律来计算查询中的距离。我的问题是索引地理数据的效率非常低(lat/lng值存储为浮动)。使用MySQL的空间扩展不是一个选项。由于数据集的大小约为100k,因此执行查询所需的时间不合理

我做了一些研究,似乎使用z指数,即莫顿数可以有所帮助。我可以在插入时计算每条记录的莫顿数,然后根据地球半径/中心点/给定搜索半径计算边界框的高/低莫顿值


我对这方面的知识只够构建我的应用程序,所以我不能完全确定这是否可行,我也不知道如何用PHP计算Morton数。这是一个按位操作吗?

如果你的半径与地球的大小相比很小,那么你可能可以使用简单的2D毕达哥拉斯而不是昂贵的3D球形几何体。如果你离两极越近,这可能就越不真实,所以我希望你不是在绘制企鹅或北极熊的地图

接下来,考虑问题的边界框。您知道它们必须在搜索点的+/-$半径范围内。将搜索半径转换为度,并在搜索中心+/-$radiusingrees定义的框内查找lat/lon所在的所有记录

如果您首先进行搜索并列出可能的匹配项列表,那么您只需从结果数据集中筛选出搜索框的各个角。如果返回匹配点的纬度/经度,则可以用PHP计算距离,从而避免计算表中所有点的距离。这有意义吗

使用数据库查找正方形边界框内的所有内容,然后使用PHP过滤超出所需半径的点