拜托,你能解释一下earth_box功能的这种行为......或者我做错了什么?
使用的数据
40.749276, -73.985643 = Empire State Building - is in my table
40.689266, -74.044512 = Statue of Liberty - is my current position in select - 8324m far from Empire State Building
我的桌子
=> select id, latitude, longitude, title from requests;
id | latitude | longitude | title
----+-----------+------------+-----------------------
1 | 40.749276 | -73.985643 | Empire State Building
从帝国大厦到自由女神像的距离
=> SELECT id, latitude, longitude, title, earth_distance(ll_to_earth(40.689266, -74.044512), ll_to_earth(latitude, longitude)) as distance_from_current_location FROM requests ORDER BY distance_from_current_location ASC;
id | latitude | longitude | title | distance_from_current_location
----+-----------+------------+-----------------------+--------------------------------
1 | 40.749276 | -73.985643 | Empire State Building | 8324.42998846164
我现在的位置是远离帝国大厦超过8000米的Libery雕像,但是 选择返回行,ID为1,即使半径仅为5558m!你能解释一下这种行为或出了什么问题吗?
=> SELECT id,latitude,longitude,title FROM requests WHERE earth_box(ll_to_earth(40.689266, -74.044512), 5558) @> ll_to_earth(requests.latitude, requests.longitude);
id | latitude | longitude | title
----+-----------+------------+-----------------------
1 | 40.749276 | -73.985643 | Empire State Building
扩展版本和postgresql
=> \dx
List of installed extensions
Name | Version | Schema | Description
---------------+---------+------------+-------------------------------------------------------------- cube | 1.0 | public | data type for multidimensional
cubes earthdistance | 1.0 | public | calculate great-circle
distances on the surface of the Earth plpgsql | 1.0 |
pg_catalog | PL/pgSQL procedural language
=> select version();
version
-------------------------------------------------------------------------------------------------------------------------------------- PostgreSQL 9.4beta2 on x86_64-apple-darwin13.3.0, compiled by Apple
LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn), 64-bit
谢谢你
NOE
答案 0 :(得分:7)
这里的问题是earth_box获得了Statute Miles。 8324.42998846164米附近有5.172560986623845法定里程 Unit Converter
解决方案:将半径转换为法定里程单位
earth_box(ll_to_earth(40.689266, -74.044512), 5558/1.609) //doesn't return results
earth_box(ll_to_earth(40.689266, -74.044512), 9000/1.609) //does.
答案 1 :(得分:0)
根据doc,默认情况下,半径以米为单位。
我刚刚进行了测试,从文档中可以看出,您需要在WHERE子句语句中同时使用earth_box和earth_distance。
因此,您需要同时使用earth_box和earth_distance才能获得正确的结果。
在Earth_box函数描述中的doc中,它还说:
此框中的某些点比指定的大圆圈更远 与位置的距离,因此请使用earth_distance进行第二次检查 应该包含在查询中。
因此以下内容将返回结果
SELECT earth_distance(ll_to_earth(40.749276, -73.985643), ll_to_earth(40.689266,-74.044512)) distance
FROM (SELECT 1) test
WHERE
(earth_box(ll_to_earth(40.749276, -73.985643), 9000) @> ll_to_earth(40.689266,-74.044512))
AND earth_distance(ll_to_earth(40.749276, -73.985643), ll_to_earth(40.689266,-74.044512)) <= 9000
order by distance desc
但这不会,因为实际距离大约为8324.429988461638米
SELECT earth_distance(ll_to_earth(40.749276, -73.985643), ll_to_earth(40.689266,-74.044512)) distance
FROM (SELECT 1) test
WHERE
(earth_box(ll_to_earth(40.749276, -73.985643), 6000) @> ll_to_earth(40.689266,-74.044512))
AND earth_distance(ll_to_earth(40.749276, -73.985643), ll_to_earth(40.689266,-74.044512)) <= 6000
order by distance desc