给定起点和终点之间的路线,如何在此路线上有效地找到兴趣点(POI)(由它们的长/纬度坐标给出),最大距离为D_max?
一种天真的方法是沿着这条路线移动一个半径为D_max的圆圈,并在这个圆圈内寻找POI;但是如果圆圈没有重叠,我们可能会忘记POI,如果它们重叠,我们会多次找到相同的POI,因此效率不高。
什么是更好的方法?
(注意:我不知道SO是否是此问题的最佳位置,或者我是否应将其发布在CS,软件工程或其他地方?)
答案 0 :(得分:2)
您需要在纬度/经度坐标和给定点找到折线的距离,并将其与最大距离进行比较。
每个路段都可以获得跨轨道距离(图片中的 GI )from here:
Formula: dxt = asin( sin(δ13) ⋅ sin(θ13−θ12) ) ⋅ R
where δ13 is (angular) distance from start point to third point
θ13 is (initial) bearing from start point to third point
θ12 is (initial) bearing from start point to end point
R is the earth’s radius
JavaScript: var dXt = Math.asin(Math.sin(d13/R)*Math.sin(θ13-θ12)) * R;
以及沿着轨道的距离(图中的 BI ):
Formula: dat = acos( cos(δ13) / cos(δxt) ) ⋅ R
where δ13 is (angular) distance from start point to third point
δxt is (angular) cross-track distance
R is the earth’s radius
JavaScript: var dAt = Math.acos(Math.cos(d13/R)/Math.cos(dXt/R)) * R;
并将沿轨道距离与起始距离进行比较(如果它是负数或更大,那么最近的点是分段结束 - BH 在图片中的情况,此处HC是最小距离BC段)
轴承和距离计算在同一页上。
如果您使用的是某些地理库,则它们应包含此类任务的功能。
答案 1 :(得分:1)
假设您在某些空间分区数据结构中将POI点索引为k-d树或四叉树,实现find-points-near-polyline
算法应该不会太困难。