3

感谢 Wikileaks,在英国,我们现在可以访问每个邮政编码wikileaks postcodes uk IMPORTANT的经度和纬度坐标。请勿在公共应用程序中使用此数据 - 有人担心数据已被故意损坏,您可能会被视为违反版权法。尝试使用来自这个Postcode UK 网站等开源网站的数据

现在,可以使用以下计算来计算每个点之间的距离(最初来自精品书 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 数据类型和函数,如果是,我如何将我的经度和纬度引用转换为 Point 数据类型?我意识到因为地球不是一个完美的球体,所以我上面引用的距离计算并不完美;但是对于我的目的来说已经足够了。是否会使用新的 GIS 功能 a) 更快地计算距离 b) 使距离计算更准确?

4

2 回答 2

2

专注于(一):

过去,我预先计算了部分,存储 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)(其中以 $ 开头的那些以与上述相同的方式预先计算为有问题的起点)

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

于 2009-09-22T18:29:23.357 回答
1

好吧,回答你的“B”问题,因为你的方程假设一个完美的球体,你会有点偏离(而且很可能,两点之间的距离越远,情况就会越差)。如果 GIS 考虑到这一点,那么您将获得更准确的距离计算。

至于从纬度/经度转换为点,我可以发誓这是在Google Maps API中提供的。(请参阅GLatLng参考资料。)

于 2009-09-22T18:26:38.097 回答