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

StackOverflow https://stackoverflow.com/questions/1908

Вопрос

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

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

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

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

РЕДАКТИРОВАТЬ:это не проекция Меркатора или что-то в этом роде.Он произвольно искажен для удобства чтения (вспомните карту метро).Я хочу использовать только ближайшие 5–10 сопоставлений, чтобы искажения в других частях карты не влияли на сопоставление, которое я пытаюсь вычислить.

Кроме того, вся карта занимает очень небольшую географическую область, поэтому нет необходимости беспокоиться о земном шаре — предположения о плоской Земле достаточно хороши.

Это было полезно?

Решение

Есть ли более конкретные подробности о виде искажений?Если, например, ваши широты и долготы «искажены» на вашей 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)

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

Другие советы

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

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

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

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

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

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

Эммм.Возможно, я что-то упускаю из этого вопроса, но если у вас есть информация о долготе и широте, у вас также есть направление на север?

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top