Maps 封闭多边形的开放街道地图

Maps 封闭多边形的开放街道地图,maps,openstreetmap,osmdroid,Maps,Openstreetmap,Osmdroid,我正在开发一个Android应用程序,它使用[1]中的OverpassAPI。我的目标是得到所有环绕某个lat-long点的圆形路径 为此,我构建了一个包含位置的矩形请求,然后解析响应XML并运行光线投射算法来过滤包含给定lat long位置的方式。这对于我的应用程序来说太慢了,因为有时候响应有几十或几百MB 是否有任何OSM API,我可以调用它来获取包含某个位置的所有方法?否则,我如何优化流程 谢谢 [1] 据我所知,OSM中没有标准API来实现这一点(这确实是一个非常罕见的用例) 我假设您

我正在开发一个Android应用程序,它使用[1]中的OverpassAPI。我的目标是得到所有环绕某个lat-long点的圆形路径

为此,我构建了一个包含位置的矩形请求,然后解析响应XML并运行光线投射算法来过滤包含给定lat long位置的方式。这对于我的应用程序来说太慢了,因为有时候响应有几十或几百MB

是否有任何OSM API,我可以调用它来获取包含某个位置的所有方法?否则,我如何优化流程

谢谢


[1]

据我所知,OSM中没有标准API来实现这一点(这确实是一个非常罕见的用例)

我假设您将“封闭”定义为表示当前位置的点位于多边形的内部区域内。此外,我假设优化过程可能包括更改算法的整个概念

首先,您需要定义矩形来获取数据。为此,您需要考虑查询太大的矩形会产生太多的数据。据我所知,没有专门的API只用于查询循环方式,即使有,查询过大的矩形也可能被服务器拒绝,因为服务器负载将是巨大的

服务器端预计算/预过滤 因此,我建议进行第一次优化:不要查询不适合您的API,而是使用Android设备上保存的脱机数据库。OsmAnd和其他人离线保存一个国家的整个数据库,但在您的特定用例中,您只需要保存一个预先过滤的循环方式数据库

据我所知,OSM中只有一小部分方法是循环的。因此,我建议编写一个脚本,定期下载OSM转储文件,例如,从、删除非循环方式(例如,您可以检查最后一个节点ID是否等于第一个节点ID,但您需要检查这是否捕获了任何您定义为循环的方式)。您运行它的频率取决于您的用例

此优化解决了以下问题:

  • 下载大量数据的问题
  • 使用大请求重载API的问题
  • 无法请求大数据块的问题
如果这不适合您的用例,我建议在您的服务器上为此构建一个简单的API

将数据重新分块到适当的网格中 但是,您仍然需要过滤大量数据。为了部分解决这个问题,我建议进行第二次优化:重新划分数据块。例如,如果您的当前位置在弗吉尼亚州,则不需要过滤面积不超过德克萨斯州的环形道路。由于按州等进行过滤会受到高度国家依赖性和难度(CPU密集型)的影响,因此我建议选择网格,例如0.05 lat/lon度(我会选择等矩形投影,因为如果已经有lat/lon坐标,则很容易计算)

对该数据进行预处理的脚本将为您想要使用的区域中的任何矩形创建一块数据(可以是一个文件,但我们对您的用例了解不够,无法谈论特定的数据结构)。当且仅当此块中至少有一个节点位于块区域内时,此块中才包含循环方式

然后,您将只请求/过滤您的职位当前所在的特定区块。选择适合您的应用程序的块大小(最好比较小,但这取决于许多因素!)

此优化解决了以下问题:

  • 假设大多数循环方式在其边界矩形方面都非常小,则只需过滤整个方式的一小部分
  • IO被最小化,尤其是当您
滞后启发式 如果前面提到的优化不能充分减少您的计算时间,我建议第三种优化,它取决于您想要找到多少种循环方式(如果您真的需要找到所有的循环方式,它将毫无帮助):使用滞后。保存上一次计算期间您所在的环形通道(假设新的当前位置接近上一个位置),并首先检查它们。如果你的位置没有太大变化,那么在最初的几次光线投射中,你很有可能击中你所在的方向

利用不同循环方式之间的关系 此外,第四个优化也是可能的:将有一些循环方式完全封闭在另一个循环方式中。您可以对程序进行编码,使其了解该关系并首先检查内部循环方式。如果此检查成功,您将自动确定当前位置也包含在外圆方式中。我认为计算信息(服务器端)可能会非常占用CPU,实现它也可能是一项艰巨的任务,因此我建议仅在无法避免的情况下使用此优化


调整这些优化的参数应该足以显著减少计算所需的CPU时间。如果您对这些建议有进一步的疑问,请随时发表评论/询问。

为什么要在Android应用程序中进行如此复杂的分析?或者:你真的想在你的应用程序中实现什么?我需要在地图上显示一个覆盖图,其中包含每当用户单击相应地图上的某个点时可以找到的最小封闭多边形。什么类型的多边形?建筑物、国家……?我最需要的是建筑物/公园/湖泊。@AndreiSfrent我试图在下面的回答中总结我的想法,但如果您能在进一步的问题中补充更多关于您申请的细节,我将不胜感激——有些方面没有详细描述(例如,您是否必须使用立交桥,或者它只是数据采集问题的解决方案