XY расстояние от долготы и широты - PullRequest
0 голосов
/ 11 июля 2020

У меня есть два набора долготы и широты, я отчаянно пытаюсь выяснить, на сколько метров точка A смещена от точки B по горизонтали и вертикали.

Моя цель - +/- X и +/- значения Y - у меня уже есть кратчайшее расстояние между двумя точками через Location.distanceBetween () .... я подумал, что могу использовать это с Location.bearingTo (), чтобы найти значения, которые я ищу через basi c тригонометрия.

Я думал, что могу использовать азимут как угол A, 90 градусов как угол C и длину стороны C (distanceBetween), чтобы вычислить длину стороны A (ось x) и B (ось y), но результаты, мягко говоря, не впечатляют. lol это на расстоянии 10-100 м, всегда на 64.xxxxxxx, и только последние несколько десятичных знаков действительно меняются.

Все онлайн-ссылки, которые я всегда могу найти хорошо при вычислении кратчайшего пути, и хотя этот удивительный сайт ссылается на позиции x и y, он всегда заканчивается тем, что снова объединяет их в кратчайшее расстояние

СУПЕР оценил бы любые указатели в правильном направлении!

Ответы [ 4 ]

0 голосов
/ 12 июля 2020

На этот вопрос нет правильного ответа, пока вы не определите, в какой проекции.

Азимут «прямой» линии меняется вдоль маршрута, если вы не едете точно на юг или на север. Вы можете рассчитать только углы в каждом узле или азимут в определенной c точке маршрута. Сумма углов в узлах не составит 180 °, потому что вы имеете в виду эллипсоидальный треугольник, а вычисление эллипсоидального треугольника - это многоэтапный процесс, который, честно говоря, лучше оставить библиотекам, например OSGEO.

Если вы хотите подогнать геометрию под декартовую плоскость, обычно используется проекция Ламберта для областей, в основном протяженных в восточном и западном направлениях, и поперечная проекция Меркатора для более длинных проекций с севера на юг. Вся Земля нанесена на карту в UTM (универсальная поперечная проекция Меркатора), которая даст вам декартовы координаты в любом месте, но ни в коем случае вы не получите идеальную евклидскую геометрию при работе с геодезией. Например, если вы go на 10 миль к югу, поверните налево на 90 ° и go на восток на 10 миль, снова поверните налево на 90 °, вы можете оказаться где угодно от 10 миль от начальной точки до точного возврата туда, откуда вы начали. , если эта точка оказалась на Северном полюсе. Таким образом, у вас может быть математически красивый азимут на координатной плоскости UTM, но на земле вы не можете повернуть те же углы, которые указывает геометрия UTM, и следовать по тому же пути на земле. Вы будете следовать либо по прямой линии на земле, либо по изогнутой линии на декартовой плоскости, или наоборот.

Вы можете определить расстояние между двумя точками на одном и том же северном направлении и отдельно, на одном и том же восточном направлении и получить расстояние на север и на восток. Однако на самом деле углы этого треугольника будут иметь смысл только на бумаге, а не на земном шаре. Если бы самолет взлетел по пеленгу, рассчитанному по такому треугольнику, он прибыл бы не на тот континент.

0 голосов
/ 12 июля 2020

Если ваши точки достаточно близки, вы можете легко вычислить x-y расстояния по широте / долготе, если вы знаете, что 1 градус широты равен 111 км, а один градус долготы равен 111km * cos(latitude):

y_dist = abs(a.lat - b.lat) * 111000;
x_dist = abs(a.lon - b.lon) * 111000 * cos(a.lat);

Для небольших расстояний мы могли бы легко проигнорировать тот факт, что Земля не совсем сфера, ошибка составляет примерно 0,1-0,2% в зависимости от вашего точного местоположения.

0 голосов
/ 12 июля 2020

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

Что могло бы быть лучше, так это вот. Допустим, у ваших 2 известных точек A и B есть широта и долгота latA, longA и latB, longB.

Теперь вы можете ввести две дополнительные точки C и D с lat C = latA, long C = longB и latD = latB, longD = longA, поэтому точки A, B, C, D образуют прямоугольник на поверхности земли.

Теперь вы можете просто использовать distanceBetween (A, C) и distanceBerween (A, D) для получения требуемых расстояний.

0 голосов
/ 12 июля 2020

Можно использовать Location.distanceBetween () , если выполняются следующие условия,

  1. точки расположены далеко от полярных регионов и
  2. расстояние достаточно небольшое (по сравнению с радиусом Земли).

Путь очень простой. Просто зафиксируйте долготу или широту и измените только другое. Затем рассчитайте расстояние.

Location location1 = new Location("");
Location location2 = new Location("");

location1.setLatitude(37.4184359437);
location1.setLongitude(-122.088038921);
location2.setLatitude(37.3800232707);
location2.setLongitude(-122.073230422);

float[] distance = new float[3];
Location.distanceBetween(
    location1.getLatitude(), location1.getLongitude(),
    location2.getLatitude(), location2.getLongitude(),
    distance
);

double lat_mid = (location1.getLatitude() + location2.getLatitude()) * 0.5;
double long_mid = (location1.getLongitude() + location2.getLongitude()) * 0.5;

float[] distanceLat = new float[3];
Location.distanceBetween(
    location1.getLatitude(), long_mid,
    location2.getLatitude(), long_mid,
    distanceLat
);
float[] distanceLong = new float[3];
Location.distanceBetween(
    lat_mid, location1.getLongitude(),
    lat_mid, location2.getLongitude(),
    distanceLong
);

double distance_approx = Math.sqrt(
    Math.pow(distanceLong[0], 2.0) + Math.pow(distanceLat[0], 2.0)
);

Сравните расстояние [0] и distance_approx, проверьте, соответствует ли точность вашим требованиям.

...