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

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

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

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

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

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

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

Ответов (4)

Решение

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

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

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