Как продвинуть X расстояние (в метрах) между двумя точками широты и долготы? - PullRequest
1 голос
/ 20 апреля 2020

Я моделирую ломаную линию с различными остановками в Java, у меня есть расстояние в метрах между этими двумя точками, проблема в том, что мне нужно go из точки A в точку B со скоростью 1 до 3 метров в секунду, и мне нужно будет принимать текущие координаты я каждые 15 минут более или менее, как я могу это сделать?

Путь между точками - это прямые линии, и все это моделируется, не происходит на карте или чем-то еще, мне просто нужно печатать эту информацию каждый раз X, любая помощь?

Пример:

У меня есть координаты:

LAT: 51.504870000000004 LNG: -0.21533000000000002

, и мне нужно go на этой скорости:

LAT: 51.50475 LNG: -0.21571

Итак, я должен смоделировать это Я go от А до В со скоростью 3 метра в секунду, и мне нужно знать свою позицию (широта / долгота), пока я двигаюсь между этими двумя точками

Есть еще один вопрос , который более или менее то же самое, разница в том, что я не могу сделать это с android, это приложение Java.

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Итак, вы знаете latA, lngA, latB, lngB. Из вашего вопроса я предполагаю, что вы знаете скорость, она постоянна, v = 3 м / с. Вы можете получить время начала LocalDateTime tA = LocalDateTime.now(); Вы хотите знать свои координаты в какой-то момент времени tX.

Чтобы сделать это, я бы ввел коэффициенты coefLat и coefLng для преобразования координат в метры и обратно. Они используют средний радиус Земли и переводят градусы в радианы:

double coefLat = 180 / Math.PI / 6371000;
double coefLng = coefLat / Math.cos(Math.PI * (latA + latB) / 360);

Затем рассчитывают расстояния по осям широты и Lng и полное расстояние в метрах:

double distLat = (latB - latA) / coefLat;
double distLng = (lngB - lngA) / coefLng;
double dist = Math.sqrt(distLat * distLat + distLng * distLng);

enter image description here

double fullTime = dist / v; // Full time needed to pass from A to B in seconds

После некоторого времени перемещения найдите длительность и получите текущие координаты:

LocalDateTime tX = LocalDateTime.now(); // get current time
long dT = Duration.between(tA, tX).getSeconds(); // in seconds
double ratio = dT / fullTime;

double latX = latA + coefLat * ratio * distLat;
double lngX = lngA + coefLng * ratio * distLng;

Пожалуйста, также посмотрите этот ответ

Полный код:

public class GetCurrentCoords {

    public static void main(String[] args) {

        LocalDateTime tA = LocalDateTime.now();
        double latA = 51.504870000000004;
        double lngA = -0.21533000000000002;
        double latB = 51.50475;
        double lngB = -0.21571;

        double coefLat = 180 / Math.PI / 6371000;
        double coefLng = coefLat / Math.cos(Math.PI * (latA + latB) / 360);

        double distLat = (latB - latA) / coefLat; // meters
        double distLng = (lngB - lngA) / coefLng; // meters

        double dist = Math.sqrt(distLat * distLat + distLng * distLng);
        System.out.println("distLat = " + distLat + "m; distLng = " + distLng + "m; full dist from A to B = " + dist + "m");
        double v = 3;

        double fullTime = dist / v; // seconds
        System.out.println("full time from A to B = " + fullTime + "s");

        // let's move for 4 seconds
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException ex) {
            Logger.getLogger(GetCurrentCoords.class.getName()).log(Level.SEVERE, null, ex);
        }

        LocalDateTime tX = LocalDateTime.now(); 
        long dT = Duration.between(tA, tX).getSeconds();
        double ratio = dT / fullTime;

        double latX = latA + coefLat * ratio * distLat;
        double lngX = lngA + coefLng * ratio * distLng;

        System.out.println("Moving " + dT + " seconds; latX = " + latX + "; lngX = " + lngX);
     }
}
0 голосов
/ 20 апреля 2020

Я не совсем понял вопрос, но если вы хотите что-то сделать после определенного расстояния, вы можете использовать этот подход

LatLng startPoint=new LatLng(51.504870000000004,-0.21533000000000002);
LatLng endPoin=new LatLng(51.50475,-0.21571);
Location loc1 = new Location("");
loc1.setLatitude(startPoint.latitude);
loc1.setLongitude(startPoint.longitude);
Location loc2 = new Location("");
loc2.setLatitude(endPoint.latitude);
loc2.setLongitude(endPoint.longitude);
float distance = loc1.distanceTo(loc2);
//instead of if you can use for loop
if (distance <= 100) {
//do something, like get the coordinates
} else {
 //do something
}
...