Добавление расстояния к координате GPS - PullRequest
24 голосов
/ 15 мая 2010

Я пытаюсь создать несколько точек на случайном расстоянии от фиксированной точки с помощью GPS.

Как добавить расстояние в метрах к координате GPS? Я смотрел на преобразование UTM в GPS, но есть ли более простой способ добиться этого?

Я работаю на платформе Android на всякий случай.

Ура, FGS

Ответы [ 5 ]

50 голосов
/ 15 мая 2010
  • P0 (lat0, lon0): исходное положение (единица измерения: градусы )
  • dx, dy: случайные смещения от вашей начальной позиции в метрах

Вы можете использовать аппроксимацию для вычисления положения рандомизированной позиции:

 lat = lat0 + (180/pi)*(dy/6378137)
 lon = lon0 + (180/pi)*(dx/6378137)/cos(lat0)

Это довольно точно, если случайное смещение расстояния меньше 10-100 км

Edit: конечно, в Java Math.cos () ожидает радианы, поэтому используйте Math.cos(Math.PI/180.0*lat0), если lat0 в градусах, как предполагается выше.

12 голосов
/ 23 октября 2013

Чтобы взять квадрат, я использую это:

 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;
}

Возвращает массив с 4 координатами, с помощью которого вы можете сделать квадрат с вашей исходной точкой в ​​центре.

5 голосов
/ 15 мая 2010

Подробный план приведен по адресу http://www.movable -type.co.uk / scripts / latlong.html .

Если вам где-то нужно преобразовать долготу / широту в координаты UTM (те, которые используются в GPS), возможно, вы захотите взглянуть на http://www.uwgb.edu/dutchs/UsefulData/UTMFormulas.htm

1 голос
/ 17 июля 2016

Если вы хотите пойти на восток, север, запад или юг, вы можете использовать это:

@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; 

}
0 голосов
/ 17 июля 2017

Этот код разбивает линию между двумя координатами в 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...