android - obtener - Añadiendo distancia a una coordenada GPS
tipos de coordenadas geograficas (5)
Estoy tratando de generar algunos puntos a distancias aleatorias de un punto fijo utilizando GPS.
¿Cómo puedo agregar la distancia en metros a una coordenada de GPS? He analizado la conversión de UTM a GPS, pero ¿existe un método más sencillo para lograrlo?
Estoy trabajando en la plataforma Android por si acaso.
Saludos, fgs
Si quieres ir al este o al norte o al oeste o al sur, puedes usar esto:
@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;
}
Este código divide la línea entre dos coordenadas en n segmentos. Reemplace el cálculo delta por su distancia fija
@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);
}
}
Para tomar un cuadrado estoy usando esto:
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;
}
Esto devuelve una matriz con 4 coordenadas, con ellas puedes hacer un cuadrado con tu punto original en el centro.
Se proporciona un resumen detallado en http://www.movable-type.co.uk/scripts/latlong.html .
Si, en algún lugar, necesita interconvertir la longitud / latitud con las coordenadas UTM (las que se usan en el GPS) es posible que desee consultar http://www.uwgb.edu/dutchs/UsefulData/UTMFormulas.htm
- P0 (lat0, lon0): posición inicial (unidad: grados )
- dx, dy: compensaciones aleatorias desde su posición inicial en metros
Puede usar una aproximación para calcular la posición de la posición aleatoria:
lat = lat0 + (180/pi)*(dy/6378137)
lon = lon0 + (180/pi)*(dx/6378137)/cos(lat0)
Esto es bastante preciso siempre que el desplazamiento de la distancia aleatoria sea inferior a 10-100 km
Edición: por supuesto, en Java Math.cos () espera radianes, así que use Math.cos(Math.PI/180.0*lat0)
si lat0 está en grados como se supone anteriormente.