在地图上画一条线,找出沿线一定宽度的POI点,现在的做法时线上取若干点,用kd树保存,查询一个点是否在沿线时,找到kd树中离改点最近的点,判断距离到改点是否小于指定距离,虽然不是很完美(点要取得足够多才能避免落掉一些点),也不失为解决方法。
kd树(k dimension tree)实际上是决策树,每次找区分度最大(方差最大)的一条轴线进行二分,二分至叶子节点只包含一个点,查找最邻近点时先找到叶子节点,然后回溯其祖先节点以这个点的距离剪枝搜索。
复杂度:建立O(nlogn),查找O(n^(1-1/k)+m)。
有个libkdtree++:http://libkdtree.alioth.debian.org/
套用我另一篇博文的方法:http://blog.csdn.net/jollyjumper/article/details/23588777,切分非常简单,街道直接切分为矩形,这个矩形装在一个对应的水平竖直的矩形里内接,面积不超过大矩形的1/2,找grid问题不大。
过滤阶段标准做法应该是对曲线进行拟合,然后求点到该线的距离,只要距离小于指定距离,可以认定符合要求,但是拟合的曲线点非常多,计算照样是o(n)的,但这样最精确,如果怕复杂度高,而用户画的线一般比较规则的话,应该去掉冗余的点。
参考:
http://baike.baidu.com/link?url=9QAERb8PzCQLhzteD_SjqZitykNSZCIHquRG_7GW2BlqrYxKQyy716MG5IIA-UNR0310BbcajPRfYUZ6T2r1T_