Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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_Gis_Postal Code - Fatal编程技术网

如何在Mysql中有效地利用经度/纬度值?

如何在Mysql中有效地利用经度/纬度值?,mysql,gis,postal-code,Mysql,Gis,Postal Code,多亏了维基解密,在英国,我们现在可以访问每个重要邮政编码的经纬度坐标。请勿在公共应用程序中使用此数据-有人担心这些数据已被故意破坏,您可能被认为违反了版权法。试着像这样使用来自开源站点的数据 现在,可以使用以下计算方法计算每个点之间的距离(最初来自fine book Pro Mysql): 两点(x1,y1)和(x2,y2)之间的距离d可以通过以下等式计算得出(只要x值是纬度,y值是经度(弧度),r是球体的半径(3956英里): d=acos(sin(x1)*sin(x2)+cos(x1)*co

多亏了维基解密,在英国,我们现在可以访问每个重要邮政编码的经纬度坐标。请勿在公共应用程序中使用此数据-有人担心这些数据已被故意破坏,您可能被认为违反了版权法。试着像这样使用来自开源站点的数据

现在,可以使用以下计算方法计算每个点之间的距离(最初来自fine book Pro Mysql):

两点(x1,y1)和(x2,y2)之间的距离d可以通过以下等式计算得出(只要x值是纬度,y值是经度(弧度),r是球体的半径(3956英里):

d=acos(sin(x1)*sin(x2)+cos(x1)*cos(x2)*cos(y2-y1))*r

现在,这是否足够好,或者我应该使用新的GIS数据类型和函数,如果是,如何将经度和纬度参照转换为点数据类型?我意识到,因为地球不是一个完美的球体,所以我上面引用的距离计算是不完美的;不过,这对我来说已经足够好了。使用新的地理信息系统功能a)可以更快地计算距离b)可以更精确地计算距离吗?

好吧,为了回答你的“b”问题,因为你的方程假设了一个完美的球体,所以你会有一点偏离(最有可能的是,两个点之间的距离越远,情况就越糟)。如果地理信息系统考虑到了这一点,那么距离计算就会更加精确

至于从lat/long到point的转换,我可以发誓这是在中提供的。(参见参考资料。)

关注(a):

过去,我对零件进行了预计算,存储了lat、long、xaxis、yaxis和zxais,其中x、y和z的定义如下:

xaxis = cos(radians(Lat)) * cos(radians(Lon))
yaxis = cos(radians(Lat)) * sin(radians(Lon))
zaxis = sin(radians(Lat))
然后,可以使用类似于
的SQL计算距离(acos(xaxis*$xaxis+yaxis*$yaxis+zaxis*$zaxis)*6367.0/1.852)
(其中以$开头的部分将以与上述相同的方式预计算相关起点)


以这种方式进行的预计算将相对昂贵的触发器推送到一次性事件,并简化了查询。

太棒了-我一直热衷于数据存储的非规范化,因为它有助于计算时间。谢谢有趣的是,您使用6367作为地球半径的数字(以公里为单位)——根据不同的来源,这个数字似乎在6356和6378之间变化。不管怎样,我把这个标记为已接受answer@DBMarcos99平均半径(此处使用)通常定义为
((2*SemiMajorAxis)+SemiMajorAxis)/3.0
,可以为您的Oh找到值,当然,既然有人问了这个问题,军械测量局已经同意了。谢谢。我真的在寻找Mysql中的选项,但是使用API接口可能是一个有用的选择。