使用的技术:MySQL 5.1 和 PHP 5.3
我正在为网站设计一个新的数据库。我正在考虑最好的方法来存储经纬度值。
过去,我一直使用 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
寻找最近匹配的地点。
开始阅读更多新技术,我在想是否应该使用空间扩展。http://dev.mysql.com/doc/refman/5.1/en/geometry-property-functions.html
然而,相关信息相当稀少,我有一个关于如何存储数据的问题。是否可以使用 POINT 作为数据类型而不是 DECIMAL?
此外,一旦存储为 POINT,如果我想在地图上绘制它,是否很容易从中获取纬度和经度值,还是我还需要将纬度和经度再次存储为 DECIMALS?
虽然这里的大多数帖子都说我应该使用 PostGIS,但我不想学习一个新的数据库!
跟进问题:
我已经尝试使用新的 POINT 类型。我已经能够使用以下方式添加纬度和经度值:
INSERT INTO spatialTable (placeName, geoPoint) VALUES( "London School of Economics", GeomFromText( 'POINT(51.514 -0.1167)' ));
我可以使用以下代码从数据库中获取纬度和经度数值:
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命令输入到数据库中的一个点。
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会让自己变得更加困难,还是为未来考虑...