获得准确的 lat/long 给定当前点、距离和方位
Get accurate lat/long given current point, distance and bearing
给定 lat/long 中的现有点、距离(英寸)和方位角(以度数转换为弧度),我正在尝试计算新的 lat/long。但结果有时不准确,因为我正在尝试为新 lat/long 测量一个小区域。目前,我正在尝试获取下一只脚 lat/long,但有时会出现 1 英寸的误差。我为此实现使用了以下算法。将此线程称为算法 Get lat/long given current point, distance and bearing.
public LatLng calculateLatLangFromDistance(double brng, double distance, LatLng latLng){
double lat1 = Math.toRadians(latLng.getLatitude());
double long1 = Math.toRadians(latLng.getLongitude());
double br = Math.toRadians(brng);
double lat2 = Math.asin(Math.sin(lat1)*Math.cos(distance/r) +
Math.cos(lat1)* Math.sin(distance/r)* Math.cos(br));
double long2 = long1 + Math.atan2(Math.sin(br)*Math.sin(distance/r)*Math.cos(lat1),
Math.cos(distance/r)-Math.sin(lat1)*Math.sin(lat2));
lat2 = Math.toDegrees(lat2);
long2 = Math.toDegrees(long2);
LatLng latLng1 = new LatLng();
latLng1.setLongitude(long2);
latLng1.setLatitude(lat2);
return latLng1;
}
r 定义为 250826771.6535433 // //地球半径(英寸)
我正在使用上述实现生成一个 1 英尺的网格到 mapbox 地图层,但结果网格的一些线是 1 英寸不准确。有什么方法可以改进此实现以获得更好的结果,或者是否有另一种方法可以为此获得准确的 lat/long?
这是生成的网格,我画了一个线图来了解网格中一些线的线长。
您可以使用 Google Maps SDK 的 spherical geometry utilities Android 实用程序库。
您可以使用的具体方法是 computeOffset 方法。在这个link中搜索SphericalUtil就可以看到。
ComputeOffset returns 从指定航向中的原点移动一段距离产生的 LatLng(以从北顺时针方向表示的度数表示)。以下是您需要指定的参数:
from - 开始的 LatLng。
距离 - 行进的距离。
航向 - 从北向顺时针方向的航向。
要使用它,请将实用程序库添加到您的依赖项中:
implementation 'com.google.maps.android:android-maps-utils:0.5'
这是我使用的一行代码示例:
LatLng newCoordinates = SphericalUtil.computeOffset(new LatLng(-25.363, 131.044),30000, 90);
希望对您有所帮助!
给定 lat/long 中的现有点、距离(英寸)和方位角(以度数转换为弧度),我正在尝试计算新的 lat/long。但结果有时不准确,因为我正在尝试为新 lat/long 测量一个小区域。目前,我正在尝试获取下一只脚 lat/long,但有时会出现 1 英寸的误差。我为此实现使用了以下算法。将此线程称为算法 Get lat/long given current point, distance and bearing.
public LatLng calculateLatLangFromDistance(double brng, double distance, LatLng latLng){
double lat1 = Math.toRadians(latLng.getLatitude());
double long1 = Math.toRadians(latLng.getLongitude());
double br = Math.toRadians(brng);
double lat2 = Math.asin(Math.sin(lat1)*Math.cos(distance/r) +
Math.cos(lat1)* Math.sin(distance/r)* Math.cos(br));
double long2 = long1 + Math.atan2(Math.sin(br)*Math.sin(distance/r)*Math.cos(lat1),
Math.cos(distance/r)-Math.sin(lat1)*Math.sin(lat2));
lat2 = Math.toDegrees(lat2);
long2 = Math.toDegrees(long2);
LatLng latLng1 = new LatLng();
latLng1.setLongitude(long2);
latLng1.setLatitude(lat2);
return latLng1;
}
r 定义为 250826771.6535433 // //地球半径(英寸)
我正在使用上述实现生成一个 1 英尺的网格到 mapbox 地图层,但结果网格的一些线是 1 英寸不准确。有什么方法可以改进此实现以获得更好的结果,或者是否有另一种方法可以为此获得准确的 lat/long?
这是生成的网格,我画了一个线图来了解网格中一些线的线长。
您可以使用 Google Maps SDK 的 spherical geometry utilities Android 实用程序库。
您可以使用的具体方法是 computeOffset 方法。在这个link中搜索SphericalUtil就可以看到。
ComputeOffset returns 从指定航向中的原点移动一段距离产生的 LatLng(以从北顺时针方向表示的度数表示)。以下是您需要指定的参数:
from - 开始的 LatLng。 距离 - 行进的距离。 航向 - 从北向顺时针方向的航向。
要使用它,请将实用程序库添加到您的依赖项中:
implementation 'com.google.maps.android:android-maps-utils:0.5'
这是我使用的一行代码示例:
LatLng newCoordinates = SphericalUtil.computeOffset(new LatLng(-25.363, 131.044),30000, 90);
希望对您有所帮助!