【发布时间】:2011-10-21 23:38:40
【问题描述】:
在我的网站上,我正在尝试获取附近的位置。
我正在尝试为此使用 Haversine 公式。
- http://en.wikipedia.org/wiki/Haversine_formula
- MySQL Great Circle Distance (Haversine formula)
- Calculate zipcodes in range
我正在使用以下查询来获取 25 公里半径内的所有位置。
SELECT id, ( 6371 * acos( cos( radians(51.8391) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(4.6265) ) + sin( radians(51.8391) ) * sin( radians( lat ) ) ) ) AS distance
FROM shops
HAVING distance < 25
ORDER BY name asc
但是我认为某些功能可能只是 MySQL,因为我收到以下错误:
警告:PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42883]: Undefined function: 7 ERROR: function radians(text) does not exist LINE 1: ...id, ( 6371 * acos( cos ( radians(51.8391) ) * cos( radians( l... ^ 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。在 ...
或者这可能与我必须更改查询中的文本 lat 有关。但我不知道应该是什么。
51.8391 和 4.6265 是我的“起点”点的经纬度。
非常感谢任何帮助,因为我不知道要更改什么:-)
编辑
看来问题出在我尝试做的地方:radians(lat)。
lat 是我表中的一列。
当我按照 hakre 的建议尝试使用 rad() 时,错误更改为:function rad(numeric) does not exist
编辑 2
现在我们正在取得进展。
确实设置为文本的列的数据类型(如 mu 所建议的那样太短)。
我已将其更改为双精度。
但是现在我得到另一个错误:
警告:PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42703]: Undefined column: 7 ERROR: column "distance" does not exist LINE 1: ...adians( lat ) ) ) AS distance FROM 商店距离 <... in ...>
但我以为我在选择中创建了别名。有什么想法吗?
另外,如果你们认为这应该放在另一个问题中,请告诉我,我会关闭这个问题。
【问题讨论】:
-
@hakre: 不走运。见编辑
-
只是一个快速的镜头(对不起,它没有工作:)),看看如何在 postgresql 中定义函数,这样你就可以更容易(更快)在查询中应用它(也可以看看@ 987654324@).
-
注意:这不是Haversine 公式——这是更简单的基于余弦的公式。 Haversine 要复杂得多,但除非使用高精度(例如双精度)算术,否则会更准确。
-
我个人认为新问题应该是一个单独的问题,但这里已经有很多关于“拥有与在哪里”的问题
标签: php postgresql pdo haversine