Страница: 1 |
Страница: 1 |
Вопрос: Привязка растра к координатам
Добавлено: 11.07.10 21:35
Автор вопроса: Павел | Web-сайт:
Задача такая. Есть растровое изображение (скажем, скриншот карты). На нём отображен достаточно маленький кусочек местности (небольше 50 км в каждом измерении), так что эту местность можно считать плоскостью.
Его нужно привязать к координатам (градусы широты/долготы).
Для этого у юзера спрашиваются координаты нескольких характерных точек (выбираются юзером произвольно). В изначальной постановке задачи это были 2 точки, возможно потребуется больше.
Т.е. юзер тыкает в какую-то точку картинки и вводит соответствующие ей широту/долготу.
Таким образом, для каждой из этих 2+ точек у нас есть 4 числа:
X экранное (в пикселях)
Y экранное (в пикселях)
Широта (в градусах)
Долгота (в градусах)
Исходя из этих данных нужно:
1. Довернуть на экране картинку так, чтоыб север был сверху. И отмасштабировать её до нужного масштаба.
2. Уметь расчитывать соответствие координат в обе стороны (по заданным координатам экранным находить широту/долготу и наоборот)
Как это сделать?
Просто отобразить широту/долготу в X/Y с поворотом на угол не выйдет, потому что масштабы по осям разные (одинаковые они только на экваторе, а вдали от него уже один градус широты - это совсем не то же самое, что и один градус долготы, если в километрах считать).
Пробовал сконвертировать широту/долготу в UTM и считать там нужные параметры таким образом:
1. Найти проекции отрезка между двумя точками на обе оси (X/Y) в экранных координатах
2. Найти проекции отрезка между теми же точками на обе оси в координатах UTM
3. Найти угол, который составляет эьтот отрезок к горизонтали (или вертикали, хрен его знает) с помощью Atan2 для экранных координат
4. Такой же угол находу для координат UTM
5. Вычисляю разность между углами. По идее - это и есть то, на что нужно довернуть картинку.
Но получается фигня.
UTM находится верно (проверял в хитрых онлайн-сервисах). Но так, на глаз, уже в UTM картинка получается тоже искаженная, похоже тоже масштабы не соблюдаются.
Как еще можно сделать?
МОжно наверное 3 точки задать, и как-то интерполировать координаты. Но как интерполировать? И как вычислить угол, на который картинку довернуть?
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #1
Добавлено: 11.07.10 23:21
Скачай исходники движка карт GMap.NET с codeplex .. Там все это есть применительно к тайлам.. включая пересчет координат в пикселы и обратно, расчет расстояния между точками по широте и долготе и много других фич.. Я уже год юзаю этот движок для своей софтины.
Номер ответа: 2
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #2
Добавлено: 11.07.10 23:26
А если картинка считается плоской, то почему масштабы по осям разные?
Номер ответа: 3
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #3
Добавлено: 11.07.10 23:26
Что касается привязки растра.. то я пошел другим путем.. я свой слой(раст) с помощью MapTailer привязал к координатам, порезал на тайлы и прикрутил к движку карт.. Теперь у меня поверх основного слоя карты выводится мой дополнительный растровый слой..
Номер ответа: 4
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #4
Добавлено: 11.07.10 23:28
не масштабы а расстояния в 1 градусе широты и долготы.. чем дальше от экватора тем больше это искажение.. И все это потому, что земля нифига не круглая а приплюснутая на полюсах где то на 20км с каждой стороны..
Номер ответа: 5
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #5
Добавлено: 11.07.10 23:36
ну тогда наверное можно посчитать разницу углов на севере и на юге и интерполировать координаты. Это не совсем точно, то думаю достаточно.
Номер ответа: 6
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #6
Добавлено: 12.07.10 07:28
Я тут подумал... Если мы далеко от полюса и смотрим небольшой кусок карты, то можно считать, что он плоский и параллели/меридианы составляют прямоугольную сетку.
Тогда остаётся только посчитать, сколько километров в градусе по обеим координатам. Если считать землю шариком, то длина параллели - это 2*pi*Rземли*cosшироты, длина меридиана 2*pi*Rземли километров. Если делим длину параллели на длину меридиана - остается косинус широты.