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

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

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

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

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

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

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

вы пробовали trimaps.com?

Gilbou 14.11.2014 18:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
25
1
5 892
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

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

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

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

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

Ответ принят как подходящий

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

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