在 Android 中将 LatLng 偏移一定米数
Offset LatLng by some amount of meters in Android
我有一个 LatLng
对象,我想将它的坐标向东移动 500 米。我找不到为此的内置方法。我见过 https://gis.stackexchange.com/a/2964,但我的结果太不准确(大约 15%),无法实际使用。我怎样才能精确转换米数?
注意:我不是想移动Google地图相机,我知道怎么做。
我试过:
static final double KILOMETERS_PER_DEGREE = 111.111;
static LatLng offsetLongitude(LatLng initialCoords, float horizontalOffsetInMeters){
double degreeOffset = 1.0 / KILOMETERS_PER_DEGREE * horizontalOffsetInMeters / 1000.0;
double longitudeOffset = Math.cos(initialCoords.latitude * Math.PI / 180.0) * degreeOffset;
return new LatLng(initialCoords.latitude, initialCoords.longitude + longitudeOffset);
}
public static LatLngBounds boundsForSpanWidth(LatLng midpoint, float targetSpanWidth){
LatLng east = offsetLongitude(midpoint, -targetSpanWidth);
LatLng west = offsetLongitude(midpoint, targetSpanWidth);
LatLngBounds newBounds = new LatLngBounds(west, east);
return newBounds;
}
但是,当我用一个目标跨度为 5000 米的点(不靠近两极或任何其他东西)调用它时,我得到两个大约 6170 米的点[=25= 】 分开。为什么?
无法从纬度和经度获得以米为单位的精确偏移量。这会假设地球是一个完美光滑的球体,这是不正确的。
如果你想减少你的错误你应该根据你的纬度调整每度的公里数。您链接的答案估计每度 111 公里,但这会根据您的纬度(特别是经度方向)而有所不同。见 table:
Lat 1°Lat≃ 1°Lon≃
0° 110.574 km 111.320 km
15° 110.649 km 107.550 km
30° 110.852 km 96.486 km
45° 111.132 km 78.847 km
60° 111.412 km 55.800 km
75° 111.618 km 28.902 km
90° 111.694 km 0.000 km
参考:wikipedia :P
希望对您有所帮助!
您可以使用 Google 地图中的 computeOffset
方法 Android API 实用程序库 (https://developers.google.com/maps/documentation/android-api/utility/):
public static LatLng computeOffset(LatLng from, double distance, double heading)
Returns the LatLng resulting from moving a distance from an origin in the specified heading (expressed in degrees clockwise from north).
Parameters:
- from - The LatLng from which to start.
- distance - The distance to travel.
- heading - The heading in degrees clockwise from north.
您的情况(距离参数以米为单位):
LatLng east = SphericalUtil.computeOffset(midpoint, 500, 90); // Shift 500 meters to the east
LatLng west = SphericalUtil.computeOffset(midpoint, 500, 270); // Shift 500 meters to the west
我有一个 LatLng
对象,我想将它的坐标向东移动 500 米。我找不到为此的内置方法。我见过 https://gis.stackexchange.com/a/2964,但我的结果太不准确(大约 15%),无法实际使用。我怎样才能精确转换米数?
注意:我不是想移动Google地图相机,我知道怎么做。
我试过:
static final double KILOMETERS_PER_DEGREE = 111.111;
static LatLng offsetLongitude(LatLng initialCoords, float horizontalOffsetInMeters){
double degreeOffset = 1.0 / KILOMETERS_PER_DEGREE * horizontalOffsetInMeters / 1000.0;
double longitudeOffset = Math.cos(initialCoords.latitude * Math.PI / 180.0) * degreeOffset;
return new LatLng(initialCoords.latitude, initialCoords.longitude + longitudeOffset);
}
public static LatLngBounds boundsForSpanWidth(LatLng midpoint, float targetSpanWidth){
LatLng east = offsetLongitude(midpoint, -targetSpanWidth);
LatLng west = offsetLongitude(midpoint, targetSpanWidth);
LatLngBounds newBounds = new LatLngBounds(west, east);
return newBounds;
}
但是,当我用一个目标跨度为 5000 米的点(不靠近两极或任何其他东西)调用它时,我得到两个大约 6170 米的点[=25= 】 分开。为什么?
无法从纬度和经度获得以米为单位的精确偏移量。这会假设地球是一个完美光滑的球体,这是不正确的。
如果你想减少你的错误你应该根据你的纬度调整每度的公里数。您链接的答案估计每度 111 公里,但这会根据您的纬度(特别是经度方向)而有所不同。见 table:
Lat 1°Lat≃ 1°Lon≃
0° 110.574 km 111.320 km
15° 110.649 km 107.550 km
30° 110.852 km 96.486 km
45° 111.132 km 78.847 km
60° 111.412 km 55.800 km
75° 111.618 km 28.902 km
90° 111.694 km 0.000 km
参考:wikipedia :P
希望对您有所帮助!
您可以使用 Google 地图中的 computeOffset
方法 Android API 实用程序库 (https://developers.google.com/maps/documentation/android-api/utility/):
public static LatLng computeOffset(LatLng from, double distance, double heading)
Returns the LatLng resulting from moving a distance from an origin in the specified heading (expressed in degrees clockwise from north).
Parameters:
- from - The LatLng from which to start.
- distance - The distance to travel.
- heading - The heading in degrees clockwise from north.
您的情况(距离参数以米为单位):
LatLng east = SphericalUtil.computeOffset(midpoint, 500, 90); // Shift 500 meters to the east
LatLng west = SphericalUtil.computeOffset(midpoint, 500, 270); // Shift 500 meters to the west