以一定的半径在用户周围的地图上放置位置 - android
Posted
技术标签:
【中文标题】以一定的半径在用户周围的地图上放置位置 - android【英文标题】:Put locations on map around user with a certain radius - android 【发布时间】:2011-07-28 08:06:23 【问题描述】:我正在开发一个 GPS 应用程序,并且正在考虑在用户周围放置标记,例如 Zombie Run 和 SpecTrek,但我完全不知道如何找出用户周围的位置。
我一直在查看 Location 类的文档,并将 distanceTo() 函数用于其他事情以及 MapView 的 latitudeSpan()、longitudeSpan() 和 getProjection() 函数,但我想不出如何决定例如,用户周围 100 米的位置。
由于我知道用户的位置,并且我只会放置距离用户约 1 公里的标记,我最多可以将该区域视为平坦区域而不是椭圆体,这样就可以获取用户的经度和纬度和 +/- 从它们周围绘制一个标记(使用一些基本的三角函数,例如 x = cos(radius) 和 y = sin(radius) 将其保持在玩家周围的半径大小的圆圈内)?
我不明白 100long 100lat 与 90long 100lat 相距 10 米的实际标量距离有多长/纬度? (我知道这些值是完全错误的,但只是用它们来说明我的问题)。
感谢您的宝贵时间,
无限化
【问题讨论】:
【参考方案1】:两个经度/纬度点之间的距离是用haversine公式计算的。这是与理论的链接: http://www.movable-type.co.uk/scripts/latlong.html
我会使用你已经提到的 distanceTo 方法来达到你的目的。您拥有当前位置和所有兴趣点。只需为每个兴趣点调用 Location.distanceTo(Poi),如果距离大于 1000 米,您可以将该点绘制到地图上。
如果您没有将 PoI 作为 Location 对象,只需像这样构建它们:
poiLocation = new Location(LocationManager.PASSIVE_PROVIDER);
poiLocation.setLatitude(latitude);
poiLocation.setLongitude(longitude);
我在类似雷达的应用中使用了 distanceTo 方法,效果很好。
【讨论】:
您好,感谢您的回复,但这正是我的问题,我没有 PoI,我想在地图上随意放置“项目”供用户访问,就像使用 Zombie Run 和 Spec Trek 一样.假设用户启动应用程序,它显示他们在地图视图中间的位置以及他们必须访问的 3 个或周围标记,我不知道如何放置这些标记,因为我不知道如何解决说距离用户 10m,然后在那里放置一个标记。所以我有点需要一个 distanceTo() 类型的反向函数,它可以让我指定距离并在该点创建一个标记 long/lat。 我认为没有一种方法可以为您提供定义半径内的每个地理点或位置,但您可以自己计算这些点。只需查看我提供的链接。有一个部分称为“从起点给定距离和方位的目标点”。在那里,您有一个具有给定地理坐标(您当前位置)的公式,您可以提供距离和方位角。使用该公式,您可以计算特定的地理坐标并将其显示在地图上。 啊,非常感谢。如果我更改值,我仍然无法让它工作,无论是在我的应用程序还是在网站上。该网站的问题在于它没有说明地球半径使用什么值。所以把用户的位置(我在英国)和地球的半径作为从***获取的地球的平均半径为 6371,距离为 1 公里,方位为 2(不知道这是否应该只是一个int,但这就是我所做的)它决定1公里外的一个点在秘鲁,显然情况并非如此:-)任何帮助都会得到极大的感激 我尝试在 cos、sin、asin 和 atan2 函数内的所有 lat1、lon1 和 d/R 引用上使用 Math.toRadians() 只是为了看看它是否有帮助,但这会将标记放在经度相同但纬度相反,所以在英格兰离我1公里的地方是在印度尼西亚西海岸附近的印度洋。 :-( 好的,我现在离工作更近了,轴承工作正常,只是距离不正常。该地图正在绘制大约 10000 公里以外的第二个标记,而不是像 2 或 3 那样,它位于英格兰以南约 10000 公里处,位于加纳以南的大西洋中。这让我相信方位正在工作,因为当我的方位为 2(度)但距离明显偏离时,经度有点偏离垂直方向。【参考方案2】:更接近页面底部的公式描述得更好一些。在那里你可以看到他在计算之前转换为弧度。此外,使用正确的数据类型来避免数字的错误四舍五入也很重要。这是一个应该可以工作的小代码sn-p:
double lat1 = 52.104636;
double lon1 = 0.356324;
double R = 6371.0;
double d = 1.0;
double dist = d / R;
double brng = Math.toRadians(1.0);
lat1 = Math.toRadians(lat1);
lon1 = Math.toRadians(lon1);
double lat2 = Math.asin( Math.sin(lat1)*Math.cos(dist) + Math.cos(lat1)*Math.sin(dist)*Math.cos(brng));
double lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(dist)*Math.cos(lat1), Math.cos(dist)-Math.sin(lat1)*Math.sin(lat2));
lon2 = (lon2+3*Math.PI)%(2*Math.PI) - Math.PI;
System.out.println("lat2: " + Math.toDegrees(lat2));
System.out.println("lon2: " + Math.toDegrees(lon2));
【讨论】:
啊,是的,谢谢马里奥,我在下面看到了它并得到了很好的工作(除了它是四舍五入,因为我使用的是浮点数而不是双精度数)但我已经离开了一个星期,我会试试并让它在明天之前工作。非常感谢您的帮助。以上是关于以一定的半径在用户周围的地图上放置位置 - android的主要内容,如果未能解决你的问题,请参考以下文章
Android:如何将地图视图的缩放级别设置为当前位置周围 1 公里半径?