1

我正在开发一个 GPS 应用程序,并且正在考虑像在Zombie RunSpecTrek中那样在用户周围放置标记的想法,但我完全不知道如何找出用户周围的位置。

我一直在查看 Location 类的文档,并将 distanceTo() 函数用于其他事情以及 MapView 的 latitudeSpan()、longitudeSpan() 和 getProjection() 函数,但我想不出如何决定例如,用户周围 100 米。

因为我知道用户的位置,并且我只会放置距离用户约 1 公里的标记,我最多可以将该区域视为平坦而不是椭圆形,因此可以获取用户的经度和纬度和+/- 从他们周围绘制一个标记(使用一些基本的三角函数,例如 x = cos(radius) 和 y = sin(radius) 将其保持在玩家周围的半径大小的圆圈内)?

我不明白 100long 100lat 与 90long 100lat 相距 10 米的实际标量距离有多长/纬度?(我知道这些值是完全错误的,但只是用它们来说明我的问题)。

谢谢你的时间,

无限化

4

2 回答 2

2

两个经度/纬度点之间的距离是用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 方法,效果很好。

于 2011-04-02T18:27:44.767 回答
1

A little closer to the bottom of the page the formular is described a little bit better. There you can see that he converted to radians before calculating. Also it is crucial that you use the right datatypes to avoid false rounding of numbers. Here is a small code snippet which should work:

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));
于 2011-04-03T08:58:55.823 回答