2010-11-03 75 views
1

我有一个特定的问题,我发现很难找到解决方案!通过指向方向查找对象

使用GPS设备我可以在地球上找到我目前的位置。我需要能够指向一个方向(iPhone或类似设备上的指南针),并找出朝哪个方向重要的物体(位置)!假设我确实将所有这些位置存储在数据库中。

+0

您需要提供比这更多的信息。你是否通过一些API访问设备?那样的话,哪个API?或者你的应用程序直接从设备读取'$ GPRMC'语句? – 2010-11-03 23:59:44

+0

我正在开发一个Android应用程序,该应用程序使用本地SQLite数据库,在该应用程序中存储有关“地标”的信息。每个地标都有其经纬度。现在我想用我的内置指南针,它会告诉我我指向哪个方向的设备,并告诉我哪个物体朝着那个方向。所以Java或C#代码可能会有所帮助。 – user496607 2010-11-04 00:07:37

+0

当我想确定两个物体之间的距离时,我已经使用了Haversine。我认为答案是三角学,尽管我对该领域的知识非常谦虚! – user496607 2010-11-04 00:12:40

回答

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坐标的元素比用户不可能在他看来)。根据您的编程语言,使用比通常提供的准确度更低的arctan静态表也可能更高效。

如果您特别聪明,您还可以找到按角度对数据进行索引的方法,这将进一步降低所需的计算量。

+0

谢谢扎克这个彻底的答案。我将开始实施此解决方案,并使用我的发现/源代码发布更新。 – user496607 2010-11-04 09:12:43