Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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