Как отобразить широту / долготу на искаженную карту?

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

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

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

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

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

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

5.08.2008 04:55:28
ты пробовал trimaps.com ?
Gilbou 14.11.2014 15:16:21
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)

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

8
7.08.2008 21:46:19

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

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

0
5.08.2008 05:24:16

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

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

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

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

0
5.08.2008 05:36:52

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

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

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

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

2
5.08.2008 15:47:51