我有一个特定的问题,我发现很难找到解决方案!
使用GPS设备我可以在地球上找到我当前的位置。我需要能够指向一个方向(iPhone或类似设备上的指南针)并找到那个方向上的重要对象(位置)!假设我确实将所有这些位置存储在数据库中。
答案 0 :(得分:1)
假设您有位置和方向,您的目标是在适当的方向上查找数据库中与该位置相邻的项目。
显然,您可以浏览数据库中的每个元素,并为每个元素回答“这是否在该区域?”。真正的魔力是效率;如何索引数据库中的数据,以便您可以回答该问题,而无需检查每条记录。
一个很好的例子是MongoDB。但是它的实现不处理方向,因此您需要过滤结果。您将使用数据库获取x距离内的所有对象,并过滤掉那些不在适当方向的元素。
如果您无法使用具有本机地理空间索引的数据库引擎,则必须自己实现它。正如评论中所提到的,Haversine函数用于计算球体上的距离(在本例中为地球)。您可以从消除任何严重超出范围的元素开始,而不是计算每个点与您自己之间的距离。 (你的纬度+你的搜索距离)< (对象纬度)。然后使用Haversine进一步过滤。您也可以使用地理空间散列函数预先完成大部分工作。
一旦您拥有范围内的所有元素,您就可以将数据库中的x-y坐标转换为极坐标。简而言之:
arctan((item_y - users_y) / (item_x - users_x)) = the angle between the item and the user
如果您为用户的“范围”内的每个项目计算此值,并过滤掉任何不在罗盘角度范围内的元素(例如+/- 20度),您将获得元素需要。
如果效率仍然是一个问题,你可以通过立即使任何元素无效而变得更加聪明,例如,如果用户面向西方,任何x坐标高于用户不可能在他看来)。根据您的编程语言,使用静态的arctans表可能更有效,其准确度低于通常提供的精确度。
如果你特别聪明,你也可以找到按角度索引数据的方法,这将进一步降低所需的计算量。