Сведения о вопросе

Henry

16:03, 1st July, 2020

Теги

Как сопоставить широту / долготу с искаженной картой?

Просмотров: 416   Ответов: 4

У меня есть куча пар широта / долгота, которые сопоставляются с известными координатами x / y на карте (географически искаженной).

Тогда у меня есть еще одна пара широта/долгота. Я хочу построить его на карте как можно лучше. Как мне это сделать?

Сначала я решил создать систему линейных уравнений для трех ближайших точек lat/long и вычислить преобразование из них,но это совсем не работает. Поскольку это линейная система,я не могу использовать больше соседних точек.

Вы не можете предположить, что Север вверх: все, что у вас есть, - это существующие сопоставления lat/long->x/y.

Это не проекция Меркатора или что-то в этом роде. Это произвольно искажено для удобства чтения (подумайте о карте метро). Я хочу использовать только ближайшие 5-10 отображений, чтобы искажение на других частях карты не влияло на отображение, которое я пытаюсь вычислить.

Кроме того, вся карта находится в очень маленькой географической области, поэтому нет необходимости беспокоиться о том, что предположения globe--flat-earth достаточно хороши.



  Сведения об ответе

LIZA

18:03, 1st July, 2020

Есть ли еще какие-то конкретные детали относительно вида искажения? Если, например, ваши широты и долготы являются "distorted" на вашей карте 2D с помощью проекции Меркатора, математика преобразования легко доступна .

Если карта искажена действительно произвольно, есть много вещей, которые вы можете попробовать, но самым простым, вероятно, будет вычисление средневзвешенного значения из ваших существующих точечных отображений. Ваши веса могут быть квадратом, обратным расстоянию x/y от вашей новой точки до каждой из существующих точек.

Какой-то псевдокод:

estimate-latitude-longitude (x, y)

    numerator-latitude := 0
    numerator-longitude := 0
    denominator := 0

    for each point,
        deltaX := x - point.x
        deltaY := y - point.y
        distSq := deltaX * deltaX + deltaY * deltaY
        weight := 1 / distSq

        numerator-latitude += weight * point.latitude
        numerator-longitude += weight * point.longitude
        denominator += weight

    return (numerator-latitude / denominator, numerator-longitude / denominator)

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


  Сведения об ответе

+-*/

18:03, 1st July, 2020

Хорошо. С теоретической точки зрения, учитывая, что искажение равно "arbitrary", и любое решение требует от вас моделирования этого произвольного искажения, вы, очевидно, не можете получить "answer". Однако любое решение будет включать в себя навязывание (обычно неявно) некоторой модели искажения, которая может отражать или не отражать реальность ситуации.

Поскольку вас, похоже, больше всего интересуют модели, предполагающие некоторую локальную непрерывность отображения искажений, наиболее очевидным выбором является тот, который вы уже пробовали: линейная интерполяция между ближайшими точками. Выход за эти рамки потребует более сложных знаний в области математического и численного анализа.

Однако вы ошибаетесь, предполагая, что не можете расширить это до большего количества пунктов. Вы можете использовать метод наименьших квадратов ошибок. Найдите линейный ответ, который минимизирует погрешность других точек. Это, пожалуй, самое прямолинейное расширение. Другими словами, Возьмите 5 ближайших точек и попробуйте придумать линейное приближение, которое минимизирует погрешность этих точек. И воспользуйся этим. Я хотел бы попробовать это в следующий раз.

Если это не сработает, то предположение о линейности над областью N точек будет нарушено. В этот момент вам нужно будет перейти на квадратичную или кубическую модель. В этот момент математика будет очень напряженной.


  Сведения об ответе

SILA

18:03, 1st July, 2020

проблема в том, что сфера может быть искажена несколькими способами, и наличие всех этих точек, известных на экваторе, скажем, не поможет вам построить карту точек дальше.

Вам нужно больше 'close' точек, тогда вы можете предположить, что эти три точки находятся на плоскости с четвертой и сделать интерполяцию, зная, что расстояние между долями-это функция, а не константа.


  Сведения об ответе

ASER

18:03, 1st July, 2020

МММ... Может быть, я чего-то не понимаю в этом вопросе, но если у вас есть информация о long/lat, у вас также есть направление на север?

Похоже, вам нужно сопоставить геодезические координаты с проекционной системой координат. Например, osgb до wgs84.

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

Примечание: пост душ отредактирован.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться