Android 将距离添加到 GPS 坐标
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2839533/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Adding distance to a GPS coordinate
提问by fgs
I'm trying to generate some points at random distances away from a fixed point using GPS.
我正在尝试使用 GPS 在距固定点的随机距离处生成一些点。
How can I add distance in meters to a GPS coordinate? I've looked at UTM to GPS conversion but is there a simpler method to achieve this?
如何将距离以米为单位添加到 GPS 坐标?我看过 UTM 到 GPS 的转换,但有没有更简单的方法来实现这一点?
I'm working on Android platform just in case.
我正在 Android 平台上工作以防万一。
Cheers, fgs
干杯,fgs
回答by Stéphane
- P0(lat0,lon0) : initial position (unit : degrees)
- dx,dy : random offsets from your initial position in meters
- P0(lat0,lon0) :初始位置(单位:度)
- dx,dy :以米为单位的初始位置的随机偏移量
You can use an approximation to compute the position of the randomized position:
您可以使用近似值来计算随机位置的位置:
lat = lat0 + (180/pi)*(dy/6378137)
lon = lon0 + (180/pi)*(dx/6378137)/cos(lat0)
This is quite precise as long as the random distance offset is below 10-100 km
只要随机距离偏移量低于 10-100 公里,这是非常精确的
Edit: of course in Java Math.cos() expects radians so do use Math.cos(Math.PI/180.0*lat0)
if lat0 is in degrees as assumed above.
编辑:当然在 Java Math.cos() 中需要弧度,所以Math.cos(Math.PI/180.0*lat0)
如果 lat0 是上面假设的度数,请使用。
回答by Bruno Pinto
To take a square I'm using this:
要取一个正方形,我正在使用它:
private double[] getBoundingBox(final double pLatitude, final double pLongitude, final int pDistanceInMeters) {
final double[] boundingBox = new double[4];
final double latRadian = Math.toRadians(pLatitude);
final double degLatKm = 110.574235;
final double degLongKm = 110.572833 * Math.cos(latRadian);
final double deltaLat = pDistanceInMeters / 1000.0 / degLatKm;
final double deltaLong = pDistanceInMeters / 1000.0 / degLongKm;
final double minLat = pLatitude - deltaLat;
final double minLong = pLongitude - deltaLong;
final double maxLat = pLatitude + deltaLat;
final double maxLong = pLongitude + deltaLong;
boundingBox[0] = minLat;
boundingBox[1] = minLong;
boundingBox[2] = maxLat;
boundingBox[3] = maxLong;
return boundingBox;
}
This returns an array with 4 coordinates, with them you can make a square with your original point in center.
这将返回一个具有 4 个坐标的数组,您可以使用它们制作一个以原始点为中心的正方形。
回答by Ashish Jindal
A detailed outline is given at http://www.movable-type.co.uk/scripts/latlong.html.
http://www.movable-type.co.uk/scripts/latlong.html提供了详细的大纲。
If you, somewhere, need to interconvert longitude/latitude to UTM coordinates (the ones used in GPS) you may want to have a look at http://www.uwgb.edu/dutchs/UsefulData/UTMFormulas.htm
如果您在某处需要将经度/纬度相互转换为 UTM 坐标(GPS 中使用的坐标),您可能需要查看http://www.uwgb.edu/dutchs/UsefulData/UTMFormulas.htm
回答by Ersin Gülbahar
If you want to go east or north or west or south you can use this:
如果你想向东、向北、向西或向南走,你可以使用这个:
@SuppressLint("DefaultLocale")
public static double go_mock_loc(double xx_lat,double xx_long,double xx_dinstance,String Direction)
{
// double xx_lat= 45.815005;
// double xx_long= 15.978501;
// int xx_dinstance=500;
int equator_circumference=6371000;
int polar_circumference=6356800;
double m_per_deg_long = 360 / polar_circumference;
double rad_lat=(xx_lat* (Math.PI) / 180);
double m_per_deg_lat = 360 / ( Math.cos(rad_lat) * equator_circumference);
double deg_diff_long = xx_dinstance * m_per_deg_long;
double deg_diff_lat = xx_dinstance * m_per_deg_lat;
double xx_north_lat = xx_lat + deg_diff_long;
//double xx_north_long= xx_long;
double xx_south_lat = xx_lat - deg_diff_long;
//double xx_south_long= xx_long;
//double xx_east_lat = xx_lat;
double xx_east_long= xx_long + deg_diff_lat;
//double xx_west_lat = xx_lat;
double xx_west_long= xx_long - deg_diff_lat;
if (Direction.toUpperCase().contains("NORTH")) {
return xx_north_lat;
} else if (Direction.toUpperCase().contains("SOUTH"))
{
return xx_south_lat;
} else if (Direction.toUpperCase().contains("EAST"))
{
return xx_east_long;
} else if (Direction.toUpperCase().contains("WEST"))
{
return xx_west_long;
}
else
return 0;
}
回答by jpereira
This code splits the line between two coordinates in n segments. Replace the delta calculation by your fixed distance
此代码将两个坐标之间的线分割为 n 段。用您的固定距离替换增量计算
@Override
public void split(Coordinates p1, Coordinates p2, int segments) {
double φ1 = Math.toRadians(p1.getLat());
double λ1 = Math.toRadians(p1.getLon());
double φ2 = Math.toRadians(p2.getLat());
double λ2 = Math.toRadians(p2.getLon());
double xDelta = (φ2 - φ1) / segments;
double yDelta = (λ2 - λ1) / segments;
for (int i = 0; i < segments; i++){
double x = φ1 + i * xDelta;
double y = λ1 + i * yDelta;
double xc = Math.toDegrees(x);
double yc = Math.toDegrees(y);
System.out.println(xc+","+yc);
}
}