MySQL纬度和经度表设置

Mar*_*tin 9 mysql spatial latitude-longitude

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

place_id  |  lat  |  long
Run Code Online (Sandbox Code Playgroud)

上表中是否有一个我缺少的专栏,它将为我提供我目前可能看不到的其他信息?

谢谢你的帮助.

Qua*_*noi 21

您应该将点存储在数据类型的单一列中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
Run Code Online (Sandbox Code Playgroud)

这将极大地提高查询速度,例如"在给定半径内查找全部".

请注意,最好使用普通的TM度量坐标(东向和北向)而不是极坐标(纬度和经度).对于小半径,它们足够精确,并且计算得到了极大的简化.如果你的所有点都在一个半边形并远离两极,你可以使用一个中央子午线.

当然,您仍然可以使用极坐标,但计算MBR距离和距离的公式会更复杂.

  • @Martin:`INSERT INTO mytable VALUES(Point(51.484804,0.296631))`.对于早期版本的`MySQL`(`5.0`和可能早期的`5.1`),这可能需要`WKT`这样的翻译:`INSERT INTO mytable VALUES(GeomFromText('POINT(51.484804,0.296631)'))`.如果您的所有积分都在英国,我建议在区域"30"中使用"UTM"坐标. (2认同)