一尘不染

MySQL纬度和经度表设置

mysql

我想将位置的纬度和经度值存储在mysql数据库表中。考虑到未来,我将希望能够在特定位置的特定半径内找到这些位置。话虽如此,我应该将纬度和经度值存储在哪些数据类型中?请给我提供一个用于创建列的创建表脚本,如下所示:

place_id  |  lat  |  long

上表中是否可能缺少我会为我提供当前可能看不到的其他信息的列?

谢谢你的帮助。


阅读 959

收藏
2020-05-17

共1个答案

一尘不染

您应将这些点存储在数据类型的单列中,Point该列可以用索引建立SPATIAL索引(如果表类型为MyISAM):

CREATE SPATIAL INDEX sx_place_location ON place (location)

SELECT  *
FROM    mytable
WHERE   MBRContains
               (
               LineString
                       (
                       Point($x - $radius, $y - $radius),
                       Point($x + $radius, $y + $radius)
                       )
               location
               )
        AND Distance(Point($x, $y), location) <= $radius

这将大大提高查询的速度,例如“在给定半径内查找所有对象”。

请注意,最好使用简单的TM公制坐标(东和北),而不是极坐标(纬度和经度)。对于小半径,它们足够精确,并且计算也大大简化了。如果您所有的点都在一个半身中并且远离极点,则可以使用单个中央子午线。

当然,您仍然可以使用极坐标,但是用于计算MBR和的公式将更加复杂。

2020-05-17