使用空间点类型在MySQL中存储Lat Lng值

bat*_*_ap 36 mysql geospatial

使用的技术:MySQL 5.1和PHP 5.3

我只是为我正在写的网站设计一个新的数据库.我正在寻找现在存储Lat和Lng值的最佳方法.

在过去,我一直在使用DECIMAL并在表单中使用PHP/MySQL select:

SQRT(POW(69.1 * (fld_lat - ( $lat )), 2) + POW(69.1 * (($lon) - fld_lon) * COS(fld_lat / 57.3 ), 2 )) AS distance
Run Code Online (Sandbox Code Playgroud)

找到最近的匹配地点.

开始阅读有关新技术的更多内容我想知道是否应该使用Spatial Extensions.http://dev.mysql.com/doc/refman/5.1/en/geometry-property-functions.html

虽然信息很薄,但对如何存储数据有疑问.我现在使用POINT作为数据类型,而不是使用DECIMAL?

此外,一旦存储为POINT,只是为了从中获取Lat Lng值,以便我想在地图上绘制它或者我是否还应该再次将lat lngs存储为DECIMALS?

我知道我应该使用PostGIS,因为这里的大多数帖子都说我只是不想学习新的数据库!

跟进

我一直在玩新的POINT类型.我已经能够使用以下内容添加Lat Lng值:

INSERT INTO spatialTable (placeName, geoPoint) VALUES( "London School of Economics", GeomFromText( 'POINT(51.514 -0.1167)' ));
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用以下方法从Db返回Lat和Lng值:

SELECT X(geoPoint), Y(geoPoint) FROM spatialTable;
Run Code Online (Sandbox Code Playgroud)

这一切看起来都不错,但距离的计算是我需要解决的问题.显然,MySQL有一个距离函数的占位符,但暂时不会发布.在一些帖子中,我发现我需要做类似下面的事情,但是我认为我的代码有点错误:

SELECT
 placeName,
 ROUND(GLength(
  LineStringFromWKB(
   LineString(
    geoPoint, 
    GeomFromText('POINT(52.5177, -0.0968)')
  )
  )
))
AS distance
FROM spatialTable
ORDER BY distance ASC;
Run Code Online (Sandbox Code Playgroud)

在此示例中,geoPoint是使用上面的INSERT输入到DB中的POINT.

GeomFromText('POINT(52.5177, -0.0968)' 是我想要计算距离的Lat Lng值.

更多后续行动

相当愚蠢的是,我只是在没有真正思考的情况下放入SQL的ROUND部分.拿出来给了我:

SELECT
placeName,
(GLength(
LineStringFromWKB(
  LineString(
    geoPoint, 
    GeomFromText('POINT(51.5177 -0.0968)')
  )
 )
))
AS distance
FROM spatialTable
ORDER BY distance ASC
Run Code Online (Sandbox Code Playgroud)

这似乎给了我正确的距离我需要.

我想目前唯一需要回答的问题就是我是否只是通过现在使用Spatial或面向未来的自我来解决自己的生活困难...

Jul*_*ian 8

我认为你应该总是使用容易获得的最高级别的抽象.如果您的数据是地理空间,则使用地理空间对象.

不过要小心.Mysql是最糟糕的地理空间数据库.它可以用于点,但它的所有多边形函数都完全被破坏 - 它们将多边形更改为其边界矩形,然后对其进行回答.

打击我的最糟糕的例子是,如果你有一个代表日本的多边形,你问日本的地方,符拉迪沃斯托克就会进入名单!

Oracle和PostGIS没有这个问题.我希望MSSQL没有,任何使用JTS作为引擎的Java数据库都没有.地理空间好.MySQL Geospatial Bad.

请阅读此处如何使用MySQL空间查询查找X半径内的所有记录?它固定在5.6.1中.

Hoorah!