如何根据坐标列表与当前位置的距离进行搜索并显示? (Windows 电话 7)
Posted
技术标签:
【中文标题】如何根据坐标列表与当前位置的距离进行搜索并显示? (Windows 电话 7)【英文标题】:How to search through a list of coordinates and display, depending on the distance between it and current location? (Windows Phone 7) 【发布时间】:2012-04-11 15:37:50 【问题描述】:我已经收集了大约 60 个爱尔兰各地电影院位置的地理坐标,我想在我的 WP7 应用中使用它们来显示离您当前位置最近的电影院。
我以为我会将它们保存在 XML 文件中,但我认为这不适用于我想要实现的目标,即能够搜索整个坐标列表并显示其中出现的任何电影院(例如)他们所在位置的 25 公里。
我找到了一些链接来帮助找到两点之间的距离,这样那部分就不会太糟糕了。
关于如何实现这一目标的任何想法? 提前致谢
【问题讨论】:
您当前如何存储地理坐标?列表我创建了一个类似的服务。
首先,正如 Shedal 所指出的,考虑将位置托管在外部服务中。当您需要添加更多位置时,这将使您的生活更轻松。 (App Hub中的更新应用服务最长可能需要10天,如果您需要快速修复错误的位置,这个时间会很长)
其次,一旦您加载了位置列表,就可以轻松地循环遍历它们并找到最近的电影院。您可以使用Haversine 公式计算两个地理位置之间的距离(此公式考虑到地球是圆的,而不是平坦的——与勾股定理不同)。幸运的是,WP GeoLocation
类附带了一个名为 GetDistanceTo
的内置函数,您可以使用它。
现在的问题只是一个简单的 Linq 查询:
List<GeoCoordinate> cinemaLocations = new List<GeoCoordinate>();
GeoCoordinate myLocation = new GeoCoordinate();
var closestCinemas = cinemaLocations.OrderBy(s => s.GetDistanceTo(myLocation));
var closestCinema = closestCinemas.FirstOrDefault();
【讨论】:
【参考方案2】:电影院列表不应该不时更新吗?如果是这样,我会在某处托管一个网络服务并从您的应用程序中调用它以获取最新的电影院列表。
关于距离的计算,就是勾股定理。
D = sqrt(abs(x2 - x1) + abs(y2 - y1))
【讨论】:
其实这不是正确的公式。应该使用Haversine 公式 我完全同意。但顺便说一句,这对于在爱尔兰找到最近的电影院会有很大的不同吗?【参考方案3】:我会将它们存储在 SQL 服务器中(SQL lite 可以在 WP7 应用程序中运行)。然后我会根据您当前的位置使用某个值的 +/- 来查询 lat 和 lon。现在你需要确保补偿接近 0 度轴,但这会给你一个正方形区域来减少你的结果。一旦你有了这个,你就可以遍历结果集,寻找到每个点的距离,然后丢弃位于这个正方形角落的结果,创建一个在所有方向上都具有定义的最大容差的结果集。当然我不必解决这个确切的问题(我倾向于依赖像 Neo4J Spacial 这样的项目,它可以自动处理这样的事情(而且非常好)
【讨论】:
以上是关于如何根据坐标列表与当前位置的距离进行搜索并显示? (Windows 电话 7)的主要内容,如果未能解决你的问题,请参考以下文章