Java двигаться под углом между двумя GPS-координатами - PullRequest
0 голосов
/ 29 марта 2019

У меня есть случай, когда мне нужно сгенерировать GPS-координаты, чтобы покрыть определенную область (отмеченную списком или GPS-координатами).

Так что мне нужно сгенерировать координаты.У меня есть следующие проверенные и реализованные функции:

//determines wether a Waypoint is inside the specified area
public boolean isInsideArea(Waypoint waypoint)

 public double distanceInKmBetweenGPSCoordinates(Waypoint from, Waypoint to)

 public double[] calculateCoordinatesAfterMove(Waypoint waypoint, double dx, double dy)

Вот моя наивная реализация того, как генерировать координаты для квадрата (или приблизительно квадрата):

public static List<drone.Waypoint> addAutoGeneratedWaypoints(List<Waypoint> polygon_lat_long_pairs) {
        List<Waypoint> waypoints = new ArrayList<>();

        AreaTester tester = new GPSPolygonTester(polygon_lat_long_pairs);
        GPSCoordinateCalculator coordinateCalculator = new GPSCoordinateCalculator();
        CustomGPSMapper mapper = new CustomGPSMapper();

        boolean finish = false;
        String mode = "r";
        Waypoint prev = polygon_lat_long_pairs.get(0);
        int count = 0;
        double distanceDown = mapper.distanceInKmBetweenGPSCoordinates(polygon_lat_long_pairs.get(2), polygon_lat_long_pairs.get(3));
        double travelledDown = 0;
        while (!finish) {
            if (mode.equals("r")) {
                double[] nextA = coordinateCalculator.calculateCoordinatesAfterMove(prev.getPosition().getLatitude(), prev.getPosition().getLongitude(), 5.0, 0.0);
                Waypoint next = new DefaultWaypoint(nextA[0], nextA[1]);
                if (tester.isInsideArea(next)) {
                    System.out.println("Waypoint was in area");
                    waypoints.add(next);
                    prev = next;
                } else {
                    System.err.println("Left area, switching position");
                    mode = "l";
                    double[] nextB = coordinateCalculator.calculateCoordinatesAfterMove(prev.getPosition().getLatitude(), prev.getPosition().getLongitude(), 0.0, -3.0);
                    Waypoint next2 = new DefaultWaypoint(nextB[0], nextB[1]);
                    waypoints.add(next2);
                    travelledDown += mapper.distanceInKmBetweenGPSCoordinates(prev, next);
                    prev = next2;
                }
                count++;
            } else {
                double[] nextA = coordinateCalculator.calculateCoordinatesAfterMove(prev.getPosition().getLatitude(), prev.getPosition().getLongitude(), -5.0, 0.0);
                Waypoint next = new DefaultWaypoint(nextA[0], nextA[1]);
                if (tester.isInsideArea(next)) {
                    waypoints.add(next);
                    prev = next;
                } else {
                    System.out.println("Left are, switching");
                    mode = "r";
                    double[] nextB = coordinateCalculator.calculateCoordinatesAfterMove(prev.getPosition().getLatitude(), prev.getPosition().getLongitude(), 0.0, -3.0);
                    Waypoint next2 = new DefaultWaypoint(nextB[0], nextB[1]);
                    waypoints.add(next2);
                    travelledDown += mapper.distanceInKmBetweenGPSCoordinates(prev, next);
                    prev = next2;
                }
                count++;
            }
            if (travelledDown >= distanceDown) {
                finish = true;
            }
        }

        List<de.dhbw.drone.waypoints.Waypoint> mapped = waypoints.stream().map(p -> new de.dhbw.drone.waypoints.Waypoint(p)).collect(Collectors.toList());
        return mapped;

Я останавливаюалгоритм, когда он прошел вниз по правой / левой стороне квадрата.

Однако я борюсь, если форма отмеченной области не квадратная и имеет наклонные линии.

Поэтому мне пришлось бы двигаться с подшипником, как показано на этом рисунке:

Fly with slope

Когда я мог бы добавить этот угол кмое движение, я мог бы использовать этот алгоритм для каждой формы области, в результате чего следующий путь:

Desired path

Может кто-нибудь помочь мне, как переместить расстояниев метрах под этим конкретным углом и как рассчитать этот угол между двумя GPS-координатами и как рассчитать угол после поворота стороны?(справа налево вместо слева направо и наоборот).Или это можно решить путем вычисления угла (точка1, точка2) и угла (точка2, точка1)?

1 Ответ

0 голосов
/ 29 марта 2019

Чтобы вычислить азимут от одной координаты к другой и указать на заданном расстоянии, вы можете использовать формулы из длинная страница (bearing и destination point сечения)


Вы можетеиспользовать тот же подход, который обычно применяется в растеризации 2d полигонов.

Горизонтальные линии изображения непрерывны в памяти, поэтому заполнение горизонтальных линий является наиболее надежным способом.

В вашем случае вы можете использовать, например, линии на постоянной широте.

Сортировка вершин вашего многоугольника Земли по широте и разделение диапазонов между значениями широты вершин, затем заполнение результирующих «трапеций» точечными последовательностями ( пример плоскости )

Иногда (сложныйполигон и т. д.) было бы проще использовать метод отклонения - генерировать точки сетки в описанном прямоугольнике и игнорировать точки вне полигона.

...