使用的技术:MySQL 5.1和PHP 5.3
我正在为我正在编写的网站设计一个新的数据库。我正在寻找现在存储纬度和经度值的最佳方法。
过去,我一直使用DECIMAL并使用PHP / MySQL选择以下形式:
SQRT(POW(69.1 * (fld_lat - ( $lat )), 2) + POW(69.1 * (($lon) - fld_lon) * COS(fld_lat / 57.3 ), 2 )) AS distance
查找最近的匹配地点。
开始阅读有关新技术的更多信息,我想知道是否应该使用Spatial Extensions。http://dev.mysql.com/doc/refman/5.1/en/geometry-property- functions.html
但是,地面上的信息非常稀少,并且对如何存储数据存在疑问。我现在将POINT用作数据类型,而不是使用DECIMAL?
另外,一旦存储为POINT,就很容易从中获取Lat Lng值,以防万一我想在地图上绘制该Lat Lng值,或者我还应该另外将lat lng存储为DECIMALS?
我知道我应该使用PostGIS,因为这里的大多数帖子都说我只是不想学习新的数据库!
跟进
我一直在玩新的POINT类型。我已经可以使用以下方法添加Lat Lng值:
INSERT INTO spatialTable (placeName, geoPoint) VALUES( "London School of Economics", GeomFromText( 'POINT(51.514 -0.1167)' ));
然后,我可以使用以下命令从Db中获取Lat和Lng值:
SELECT X(geoPoint), Y(geoPoint) FROM spatialTable;
一切看起来不错,但是距离的计算是我需要解决的问题。显然,MySQL具有距离函数的占位符,但暂时不会发布。在几篇文章中,我发现我需要做以下类似的事情,但是我认为我的代码有点错误:
SELECT placeName, ROUND(GLength( LineStringFromWKB( LineString( geoPoint, GeomFromText('POINT(52.5177, -0.0968)') ) ) )) AS distance FROM spatialTable ORDER BY distance ASC;
在此示例中,geoPoint是使用上面的INSERT输入到数据库中的POINT。
GeomFromText('POINT(52.5177, -0.0968)' 是我想计算距离的Lat Lng值。
GeomFromText('POINT(52.5177, -0.0968)'
更多跟进
愚蠢的是,我只是没有真正考虑就把SQL的ROUND部分放进去了。把这个拿出来给我:
SELECT placeName, (GLength( LineStringFromWKB( LineString( geoPoint, GeomFromText('POINT(51.5177 -0.0968)') ) ) )) AS distance FROM spatialTable ORDER BY distance ASC
这似乎给了我所需的正确距离。
我想目前唯一需要回答的就是对我是否只是通过现在使用Spatial或使自己适应未来的想法使自己的生活变得困难…
我认为您应该始终使用容易获得的最高级别的抽象。如果您的数据是地理空间的,则使用地理空间的对象。
但小心点。MySQL是最糟糕的地理空间数据库。对于点来说,它还可以,但是其所有多边形函数都被破坏了-它们将多边形更改为其边界矩形,然后对此进行解答。
打给我的最糟糕的例子是,如果您有一个代表日本的多边形,并且您问日本境内有哪些地方,符拉迪沃斯托克就会进入列表!
Oracle和PostGIS没有这个问题。我希望MSSQL不会,并且使用JTS作为其引擎的任何Java数据库都不会。地理空间优势。MySQL Geospatial错误。
只需在这里阅读如何使用MySQL空间查询查找X半径内的所有记录?在5.6.1中已修复。
哎呀!