兄弟姐妹们,如果从数据库中提取多个地点,均含坐标,进行距离比对,是不是很慢?

2014-07-13 10:43:28 +08:00
 konakona
=..= 哼哼,我来说下实际情况:
数据表中含有a城市的8000条景点和7000个景点。每条数据都有lon和lat(百度坐标你们懂得)。
假设正在访问景点a,要获得该景点lat和lon附近,最近的其他5个景点。

=,= 尼玛这个是不是特别慢……首先需要全表查询,有没有什么最优办法?
4406 次点击
所在节点    程序员
16 条回复
xiaojj
2014-07-13 10:59:05 +08:00
where lon>当前景点lon-附近范围距离 and lon<当前景点lon+附近范围距离 and lat>当前景点lat-附近范围距离 and lat<附近范围距离+lat
nighca
2014-07-13 11:10:24 +08:00
kd-tree~
nighca
2014-07-13 11:12:30 +08:00
当然,如果需求以及数据库基本不会变动的话,直接把所有点的最近5个点事先算出来,查的时候就是O(1)。。
againstodds
2014-07-13 11:14:20 +08:00
把景点数据放到elasticsearch 然后用geo query找出附近的景点
zhzhwcn
2014-07-13 11:22:28 +08:00
我想到了Ingress
whuhacker
2014-07-13 11:29:14 +08:00
最简单快速的方法就是 1 楼
不必纠结于以当前点为圆心画一个圈来找“最近 5 个点”,用矩形也可以的

如果对结果的正确性要求非常高,那只好用 Geo Search 了。如果是用 MySQL 需要转换数据格式
http://dev.mysql.com/doc/refman/5.1/zh/spatial-extensions-in-mysql.html
fasling
2014-07-13 11:43:22 +08:00
你需要postgis
Ricepig
2014-07-13 11:53:45 +08:00
推荐一个库,叫ANN

你遇到的是一类典型问题:the k-th nearest neighbours
Ricepig
2014-07-13 11:56:24 +08:00
另外,经纬度之间算距离是没有意义的,如果要精确,还需要对坐标进行投影。

如果仅仅需要距离排序,直接用经纬度勉强可以。
shiny
2014-07-13 12:29:05 +08:00
最简单的做法就是geohash
min
2014-07-13 12:58:35 +08:00
自己算是个笨办法,应该去找支持geography的数据库
mulog
2014-07-13 13:17:52 +08:00
试试geohash?
或者按一楼那样 不过就像@Ricepig说的 需要处理一下
我之前有一个小demo里写过一个非常非常不精确的
(参数的range_km是要搜索的范围(单位公里) 返回是对应的经度和纬度范围)


<script src="https://gist.github.com/mulog1990/ceec153585ee27ef49ca.js"></script>
NCE
2014-07-13 13:33:54 +08:00
sql server专门有类型支持这个
ChiChou
2014-07-13 16:09:18 +08:00
楼上的代码咋贴的?这样?

https://gist.github.com/mulog1990/ceec153585ee27ef49ca
lamtin
2014-07-13 16:25:44 +08:00
geohash
54xiaobin
2014-07-14 15:13:39 +08:00
geohash +1

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/122380

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX