在我的Grails 1.3.7应用程序中,我有一个具有Double纬度和Double经度的Building实体。 我正在实现一个简单的搜索引擎,以便找到用户所在点的给定距离(十进制度的经度和纬度)的所有Building实例。 我发现这个http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL这很好,因为我使用的是MySQL数据库。边界框近似对于我来说非常好,因为我需要执行额外的过滤和计算,而我只需要一个查找器来缩小我正在过滤的实例的数量。 我的问题是:有人已经在Grails环境中实现了这种搜索,以及如何实现?通过距离参考点的距离查找全部
0
A
回答
1
我已经实现了一些具有类似需求的东西,并且我使用了HQL查询。这是前一段时间,我记得我花了很长一段时间来阅读和弄清楚,所以希望能为你节省一些时间。
这会根据当前位置(简单的经纬度长的容器对象)和“名称”(startswith)进行选择。它选择域对象(地点)以及距离当前位置的里程。它按照上行数英里排序。注意我添加了一个“道路因素”软糖来近似道路距离。
def getVenuesInArea(venueName, location, miles, optionsMap)
{
def max = optionsMap?.max ?: 10
def offset = optionsMap?.offset ?: 0
if (venueName == null) venueName = ""
venueName += '%'
double roadFactor = 1.20 // add 20% for the roads, instead of as crow flies...
def query
def results
def countQuery = """ select count(distinct v)
from Venue as v
WHERE
v.name like :venueName AND
(acos
(
sin(radians(:lat))
* sin(radians(v.location.latitude))
+ cos(radians(:lat))
* cos(radians(v.location.latitude))
* cos(radians(v.location.longitude) - radians(:lon))
) * 3956.1676 * :roadFactor < :distance
)
"""
def count = Venue.executeQuery(countQuery, [venueName:venueName, lat:location.latitude, lon:location.longitude, distance:miles, roadFactor:roadFactor])[0]
query = """ select distinct v,
(
acos
(
sin(radians(:lat))
* sin(radians(v.location.latitude))
+ cos(radians(:lat))
* cos(radians(v.location.latitude))
* cos(radians(v.location.longitude) - radians(:lon))
)
* 3956.1676 * :roadFactor
) as milesAway
from Venue as v
WHERE
v.name like :venueName AND
(acos
(
sin(radians(:lat))
* sin(radians(v.location.latitude))
+ cos(radians(:lat))
* cos(radians(v.location.latitude))
* cos(radians(v.location.longitude) - radians(:lon))
) * 3956.1676 * :roadFactor < :distance
)
order by
(
acos
(
sin(radians(:lat))
* sin(radians(v.location.latitude))
+ cos(radians(:lat))
* cos(radians(v.location.latitude))
* cos(radians(v.location.longitude) - radians(:lon))
)
* 3956.1676 * :roadFactor
)
asc,
v.name
"""
results = Venue.executeQuery(query, [venueName:venueName, lat:location.latitude, lon:location.longitude, distance:miles, roadFactor:roadFactor, max:max, offset:offset])
def venues = []
MathContext mc = new MathContext(2)
results.each
{ result ->
VenueWithDetails venueDetails = new VenueWithDetails( venue:result[0], milesFrom:new BigDecimal(result[1]).round(mc) )
venues.add(venueDetails)
}
return [venues:venues, count:count]
}
这是在grails 1.3.4版本上完成的,但很确定它对1.3.7应该可以正常工作。
希望有帮助, 克里斯。
相关问题
- 1. 参考“距离”是暧昧
- 2. 找到距离地点最小总距离的点的算法
- 3. 使用MySQL查找距离的点数
- 4. CLLocationCoordinate2D点之间的查找距离
- 5. 距离Cell塔的距离
- 6. Postgresql:在距离海岸的距离内找到道路端点
- 7. 距离点3D
- 8. 蛇的头部距离身体有几点距离(C++游戏)
- 9. 不同的参考距离的Process.Start
- 10. 查找曼哈顿距离中两组之间的距离
- 11. 地图点过滤距离
- 12. AS3:查找旋转距离
- 13. 查找接近距离GPS
- 14. 查找距离标记
- 15. Django TastyPie Geo距离查找
- 16. 使用地点ID查找距离
- 17. 从nearSphere返回距离查询点的距离
- 18. 查询距离
- 19. 单点的距离
- 20. 如何查找距某点X距离的经度和纬度?
- 21. 如何通过Haversine计算短距离和长距离?
- 22. Fmod距离参数
- 23. 距离某一点的线段距离上的点
- 24. 根据距离原点的距离排序2d点
- 25. 沿着距离两个给定点的距离找到一条中间点
- 26. filepicker.io安全距离的jsfiddle
- 27. 计算距离位置的距离 - iPhone
- 28. 如何计算距离cellID的距离?
- 29. 获取距离边缘的距离3
- 30. 距离
您是否考虑过MySQL空间数据支持(http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html)?你可以使用Criteria和SqlRestriction(http://grails.org/doc/latest/api/grails/orm/HibernateCriteriaBuilder.html#sqlRestriction(java.lang.String)。 – 2011-05-07 20:37:16