Как отобразить широту / долготу на искаженную карту? - PullRequest
22 голосов
/ 05 августа 2008

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

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

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

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

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

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

Ответы [ 4 ]

8 голосов
/ 05 августа 2008

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

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

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

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

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

0 голосов
/ 05 августа 2008

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

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

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

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

0 голосов
/ 05 августа 2008

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

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

...