我是新来的,分数很差,所以我只能提供50点的赏金。
假设我有一个应用程序搜索某个位置10英里范围内的所有加油站。然而,这个位置的一侧被山脉环绕,您必须开车50英里才能到达。你不想要从山的另一边返回结果。有哪些好的算法/技术可以解决这个问题?我知道点对点搜索你可以使用路径成本,但我不确定半径搜索的技术是什么。
以下是一个例子:
红线是半径圆上的一个和弦,从40,-74到41,-72 lat长(不准确就是说)用户在40,-73执行地理半径搜索,同时包含跨越区域的区域康涅狄格州的LI声音是不切实际的。该算法应该知道存在与搜索圆完全相交的和弦而不返回该和弦另一侧的结果。因此,只有绿色区域的点才会返回。
如果程序员定义了这些边界线,这应该可以在没有任何道路网络分析的情况下完成。例如,在某些国家/地区可能存在通过危险区域的区域,您可能希望该区域两侧的人员仅限于该区域。或者是国际边界等我只是问这个,因为我很确定人们这样做。
答案 0 :(得分:8)
虽然最佳解决方案是使用例如ArcGIS的网络分析师计算沿着道路网络的距离(而不是直线距离),但是肮脏的黑客将是在您的半径中心和每个站点之间创建直线,然后计算沿该配置文件的总高程增益(自动执行此操作的脚本here)。然后,您可以设置一个阈值,以拒绝总高程增益高于某个值的那些阈值(那些需要越过山脉才能达到的值)。
编辑由于您似乎没有使用网络分析,为什么不创建一个栅格成本映射,其中值对应于遍历该地形的难度?这可以基于其他数据(即水体,海拔,土地覆盖等)。然后,您可以使用成本映射返回成本最低的工作站或执行select by属性...
另一种选择是创建一个多边形矢量图层,显示不可通过的区域(山脉,水体等),然后在您的位置和半径内的所有工作站之间创建一条线。使用按位置选择,您可以查看该线是否与任何不可通过的多边形相交;如果是,请取消选择电台。
该任务的最佳工具仍然是网络分析...
答案 1 :(得分:1)
您应该更改指标,“接近”意味着什么。在你的例子10英里附近的meams 10英里直线。但是,您可能更愿意查询任何加油站,其中最短的街道路径不超过10英里。
您还可以组合两种方法并首先查询所有周围点,然后过滤它们,即通过计算路线长度。
如果您更喜欢算法,我建议您查看用于导航助手的寻路算法。
答案 2 :(得分:1)
可能更接近您要求的解决方案是获取区域中所有加油站的位置,添加圆与您的禁区边界线之间的交点,然后对结果中的节点集进行拓扑排序。维度空间。在给定区域中的条目进行排序的情况下,查找特定区域内的加油站将像返回属于给定范围的值集一样简单。
有关详细信息,请参阅Steven Skienn'a“算法设计手册”中的第5.10.1和15.2章。 Boost图库提供拓扑排序算法的实现。
我仍然认为这严格来说是图形问题所以“10英里半径”并不是你的算法用于查找匹配的东西,而是道路距离。良好的解决方案还应包括诸如道路限速,单行道等因素,并允许用户在成本函数中包含最佳匹配。