Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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
在mysql中高效存储地理位置_Mysql_Indexing_Geolocation - Fatal编程技术网

在mysql中高效存储地理位置

在mysql中高效存储地理位置,mysql,indexing,geolocation,Mysql,Indexing,Geolocation,现在,我将long和lat作为两个十进制索引字段存储在数据库中。 我想知道(没有安装任何bizzare引擎)是否有一个有效的方法来做到这一点,所以索引也将帮助我计算距离。下面是一个示例查询 从long X lat Y用10米无线电给我所有的位置 对纬度和经度使用浮点数据类型。任何更高精度的东西都很可能超出工程范围 除非您的结果需要精确到一米左右,否则float数据类型对于您尝试执行的操作具有足够的精度。如果你在小于一米的分辨率下工作,你需要了解一些投影(球体到平面),比如环球横轴墨卡托和兰伯特

现在,我将long和lat作为两个十进制索引字段存储在数据库中。
我想知道(没有安装任何bizzare引擎)是否有一个有效的方法来做到这一点,所以索引也将帮助我计算距离。下面是一个示例查询

从long X lat Y用10米无线电给我所有的位置


对纬度和经度使用浮点数据类型。任何更高精度的东西都很可能超出工程范围

除非您的结果需要精确到一米左右,否则float数据类型对于您尝试执行的操作具有足够的精度。如果你在小于一米的分辨率下工作,你需要了解一些投影(球体到平面),比如环球横轴墨卡托和兰伯特

当你开始计算时,请记住纬度(从北到南)变化的一分钟(六十分之一度)等于一海里

下面是一位mySql用户关于此搜索的精彩演示

性能优化是在纬度上做一个索引,也可能是经度,然后做这样的搜索(正
半径

其中loctable.lat>=(mylat半径)
和loctable.lat=(mylong半径)

和loctable.long您希望查找空间索引或空间填充曲线。si将2d复杂度降低为1d复杂度。它看起来像四叉树,有点像分形。如果您不介意形状和精确搜索,您希望删除harvesine公式,因为您可以只搜索四叉树瓷砖。当然你需要墨卡托投影。这是迄今为止最快的方法。我经常用希尔伯特曲线。你想看看Nick的hilbert曲线空间索引四叉树博客。

NB:相关问题-如果浮点类型是32位,那么它将没有足够的有效数字用于精确的lat/lon位置,以达到亚英尺精度。您需要至少10个sig图(考虑经度-179.1234567),您可以使用双精度。要提高位置的准确性,只需添加更多的小数位数。UTM和其他投影在描述位置时不会获得任何准确性。对不起,这是错误的。哈弗森大圆距离公式假设地球是球形的。地球不是完全球形的,测量员的预测是正确的。哈弗森公式适用于仓库查找和飞机燃油计算。但是如果你用它来布置你的停车场,你会遇到水坑。你混淆了几个问题。哈弗森说的是距离而不是精度。测量员使用仪器(经纬仪)精确确定横向/纵向位置。你可以用lat/lon精确到纳米级来描述一个位置,但是你的测量仪器可能没有那么精确。试试这个:使用IEEE 754 float,你可以得到7个有效数字()。现在转到google earth并将标记设置为39.0//123.4567。现在,将另一个标记设置为39.0//123.4568,并使用标尺工具测量距离。我大约有8.5米。这意味着,如果对CA lat/lon数据库使用浮点类型,它只能描述8.5米的位置。因此,如果您需要更高的准确性,请使用双精度。
where loctable.lat >=  (mylat-radius)
  and loctable.lat <=  (mylat+radius)
  and loctable.long >= (mylong-radius)
  and loctable.long <= (mylong+radius)
  and haversine_distance(mylat, mylong, loctable.lat, loctable.long) <= radius