Название: Трансформация карт Отправлено: Vladimir от Май 05, 2015, 12:04 Доброго дня! Есть задача похожая на http://www.prog.org.ru/topic_24274_0.html, но мне нужно трансформировать существующие тайлы гугловских карт на 2D плоскости! Т.е. есть такая проблема: если собрать тайлы в одну картинку QImage для z8 масштаба скажем и по координатам гугла выставить какую-либо видимую отметку (скажем пересечение дорог), то она не совпадет с пересечением дорог на карте, отметка будет смещена. Таким образом мне нужно трансформировать карту, чтобы координаты отметок точно совпадали с картой. В выше приведенной статье был предложен алгоритм, если его модифицировать подойдет ли он мне:
- каждый тайл представить в виде сетки точек I x J. - для каждой точки 1. выполнить преобразование из проекции Меркатора на геоид WGS84 2. выполнить преобразование из геоида WGS84 в 2D декартовые координаты Если такой алгоритм правильный для моей задачи, то может кто подскажет формулы пересчета и как это реализовывать, т.е. необходимо попиксельно пересчитывать картинку из одних координат в другие? Название: Re: Трансформация карт Отправлено: Kurles от Май 05, 2015, 12:58 Вроде у гугла нумерация координат и уровней зума совпадает с OSM. Посмотри в сторону расчёта координат для Slippy map (http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames). По ссылке даны формулы для координат целых тайлов, но их не сложно привести к конкретным пикселям в нужном тайле.
Название: Re: Трансформация карт Отправлено: Vladimir от Май 05, 2015, 14:26 Вроде у гугла нумерация координат и уровней зума совпадает с OSM. Посмотри в сторону расчёта координат для Slippy map (http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames). По ссылке даны формулы для координат целых тайлов, но их не сложно привести к конкретным пикселям в нужном тайле. Так у меня по формулам из целых тайлов картинка и собирается, просто рассчитывается место каждого тайла на экране и он достается из нужной папки "/z%1/%2/x%3/%4/y%5.png" без всяких модификаций! Просто получается, что чем дальше от экватора в северном (южном) направлении находится точка стояния, тем больше погрешность получается (картинка вроде как должна сжиматься сверху и расширятся снизу, для северного направления), а здесь она остается просто прямоугольником, собранным из отдельных тайлов. Карты гугла вроде как в проекции Меркатора, а данная проекция искажает площади, поэтому видимо для правильного отображения необходимо делать пересчеты в другую систему координат.. вопрос в какую и как? Название: Re: Трансформация карт Отправлено: Kurles от Май 05, 2015, 14:49 Вроде у гугла нумерация координат и уровней зума совпадает с OSM. Посмотри в сторону расчёта координат для Slippy map (http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames). По ссылке даны формулы для координат целых тайлов, но их не сложно привести к конкретным пикселям в нужном тайле. Так у меня по формулам из целых тайлов картинка и собирается, просто рассчитывается место каждого тайла на экране и он достается из нужной папки "/z%1/%2/x%3/%4/y%5.png" без всяких модификаций! Просто получается, что чем дальше от экватора в северном (южном) направлении находится точка стояния, тем больше погрешность получается (картинка вроде как должна сжиматься сверху и расширятся снизу, для северного направления), а здесь она остается просто прямоугольником, собранным из отдельных тайлов. Карты гугла вроде как в проекции Меркатора, а данная проекция искажает площади, поэтому видимо для правильного отображения необходимо делать пересчеты в другую систему координат.. вопрос в какую и как? Название: Re: Трансформация карт Отправлено: Vladimir от Май 05, 2015, 15:29 минимальный проект, будет сложновато сделать..проект большой, чтобы оттуда выдрать все нюансы! вот функция загрузки карты. по сути в ней вся работа с тайлами карты!
Код: void CThreadLoadMap::load() На картинке пример смещения точек. Черная - это то место, где хотелось бы видеть отметку, а красная - это точка вбитая по координатам гугла (то место где должно быть пересечение дорог). Название: Re: Трансформация карт Отправлено: Kurles от Май 05, 2015, 16:24 Посмотрел мельком код - слишком у тебя лишнего вроде нагорожено, для получения тайловых координат из широты и долготы достаточно следующей процедуры:
Код Что бы узнать координаты пикселя внутри тайла - достаточно дробную часть умножить на 256. Ну и до кучи процедуры для обратного преобразования: Код Процедуры проверенные, по крайней мере для OSM карт работают на ура. Название: Re: Трансформация карт Отправлено: Vladimir от Май 05, 2015, 17:58 Функция написана давно и не мной, черт ногу сломит, что там делается! но в целом она работает, за исключением того что вылез касяк со смещением.. и не понятно то ли это тайлы не совсем правильно размещаются на экране, то ли нужно в целом пересчитывать картинку по другому, ибо сами карты того требуют (Меркатор -> WGS84).. Kurles а что по вашему там лишнее?
Название: Re: Трансформация карт Отправлено: Kurles от Май 06, 2015, 08:54 Функция написана давно и не мной, черт ногу сломит, что там делается! но в целом она работает, за исключением того что вылез касяк со смещением.. и не понятно то ли это тайлы не совсем правильно размещаются на экране, то ли нужно в целом пересчитывать картинку по другому, ибо сами карты того требуют (Меркатор -> WGS84).. Kurles а что по вашему там лишнее? Посмотрел немного внимательнее - всё равно не очень понятно, что там делается. Эта процедура пытается всю карту планеты загрузить в картинку? Может проще самому эту часть переписать? И вполне возможно, что действительно тайлы не правильно размещаются на экране, так как смещение не только до широте, но и по долготе.Название: Re: Трансформация карт Отправлено: Vladimir от Май 06, 2015, 16:02 Посмотрел немного внимательнее - всё равно не очень понятно, что там делается. Эта процедура пытается всю карту планеты загрузить в картинку? Может проще самому эту часть переписать? И вполне возможно, что действительно тайлы не правильно размещаются на экране, так как смещение не только до широте, но и по долготе. Нет не всю.. с начала создается временный буфер для склейки выбранных тайлов с диска Код: int sizeN = w*h*4; Код: //10-20=4;30-50=3;60-100=2;110-200=1;210-400=0 здесь видимо считается масштабный коэффициент, соотношение точки на мировой карте для данного масштаба и широты к точке на экране.. Код: Zoom = 8 + index; здесь идет расчет координат тайлов и их количества в временном буфере Код: // координаты на растровом массиве данного уровня в пикселах, от верхнего левого угла массива Здесь по рассчитанным координатам достаем тайлы с диска и помещаем в буфер Код: int* dest = (int*)buf2N; последнее преобразование это, копирование из буфера в картинку, которая рисуется на экране Код: for(int y = 0; y < h; y++) Пока писал сам немного понял :) но все равно не понятно, где и в чем может быть косячина.. Название: Re: Трансформация карт Отправлено: Kurles от Май 07, 2015, 09:50 Посмотрел немного внимательнее - всё равно не очень понятно, что там делается. Эта процедура пытается всю карту планеты загрузить в картинку? Может проще самому эту часть переписать? И вполне возможно, что действительно тайлы не правильно размещаются на экране, так как смещение не только до широте, но и по долготе. ... Пока писал сам немного понял :) но все равно не понятно, где и в чем может быть косячина.. Название: Re: Трансформация карт Отправлено: Vladimir от Май 08, 2015, 13:09 Что то где-то у тебя не правильно считается. Не поленился и тестовое приложение по-быстрому сварганил, всё ок. Спасибо БОЛЬШОЕ! Буду разбираться.. |