【发布时间】:2011-06-27 02:18:11
【问题描述】:
使用的技术:MySQL 5.1 和 PHP 5.3
我只是为我正在编写的网站设计一个新数据库。我正在寻找现在存储 Lat 和 Lng 值的最佳方式。
过去我一直使用 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
不过,实际信息非常少,并且对如何存储数据存在疑问。我现在不使用 DECIMAL,而是使用 POINT 作为数据类型吗?
此外,一旦存储为 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)' ));
然后我可以使用以下方法从 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 值。
更多跟进
相当愚蠢,我只是在没有真正考虑的情况下放入了 SQL 的 ROUND 部分。把它拿出来给我:
SELECT
placeName,
(GLength(
LineStringFromWKB(
LineString(
geoPoint,
GeomFromText('POINT(51.5177 -0.0968)')
)
)
))
AS distance
FROM spatialTable
ORDER BY distance ASC
这似乎给了我所需的正确距离。
我想目前唯一需要回答的问题是,我是否只是通过现在使用 Spatial 让自己过上困难,还是让自己适应未来……
【问题讨论】:
-
非常有用的信息。
-
不,你确实需要它。如果您想使用 MySQL 并(快速)搜索某个点附近的地方,则需要空间索引。
-
距离是用哪个单位计算的?
-
是的,距离是用什么单位计算的?
标签: mysql geospatial