Визуальные данные OSM + тайлы = единое целое

Приветствую профи OSM.
Пишу карту на C# в Unity3d.
Остался 1 момент. Не получается точь-в-точь соединить данные и тайлы.
Какое у них соотношение размеров?

Т.е. если взять карту из тайлов, и нарисовать поверх домики, координаты которых преобразованы из GPS в мировые по формулам Mercator, то они не будут сходиться. Дома на тайлах будут больше чем графические элементы домов.

Я вот придумал формулу:

float CONST = 2/height; //Это константа зависимая от высоты экрана. Нужна для того, чтобы текстура тайла отображалась на экране пиксель в пиксель в 3D.
float Labs = 76;//Длина тайла в мировых координатах, при 19 увеличении
= 152;//При 18
= 304://При 17, и т.д.

int sizeTile = 256;//Размер тайла.

int numberForZoom = 1;//Коэффициент умножение зума, при 19
= 2://При 18
= 4;//При 17
= 8;//При 16, и т.д.

Слой тайлов всегда имеет размер - (1/CONST).

Слой же данных(домики) имеет размер:

float T = (CONST)/(sizeTile/(Labs/numberForZoom));
float dataSize = 1/(T*numberForZoom);

Вот только этот dataSize не идеально точен. Из-за этого, естественно проблемы.

Я уже начинаю запутываться и, конечно, сомневаюсь что здесь помогут, но оооочень на это надеюсь. Спасите, Братья!

NovaEiz

  1. Откуда вы взяли таблицу констант Labs и как она соотносится с координатами меркатора и WGS84 ?
  2. По каким формулам пересчитываются WGS84 → Web Mercator.

Зря вы навводили эти коэффициенты, и я там не вижу ни где косинуса, раз вы используете Меркатор.
Вообще я делал подобное, брал за основу UnitySlippyMap.
Всё накладывается отлично:

chnav, преобразовываем координаты текущего тайла, где находится точка gps в Point1, и соседнего по горизонтали в Point2.
Labs = Point2.x - Point1.x

maxZoom = 19;
numberForZoom = Math.Pow(2, (maxZoom - currentZoom));

freeExec, обидно мне брать чужую нароботку, когда я свою уже 2 месяца делаю и осталось совсем ничего. Раньше бы узнать)
Мне бы формулу. И я не представляю что делать с косинусом. А вы?

И вообще, разве OSM на WGS84 стоит? Я брал на сайте openstreetmap.org класс MercatorProtection

Судя по первому посту вы там что-то пытаетесь эмпирически вычислить, вместо взятия оригинальной математической модели. Поэтому ваш велосипед состоит из одного колеса, возможно проще всё же взять готовый или хотя бы разобраться в его схеме.
Что же до косинуса, то есть это даже вики https://en.wikipedia.org/wiki/Mercator_projection#Small_element_geometry . Где важно для вас, что коэффициент по широте есть 1/косинус(широта)

В приведённом же мной проекте трансформируют всё в метры проекции 900913, с этим удобней работать, чем с градусами.

Хм. Возможно меня недопоняли.
Я знаю как преобразовать GPS в мировые через Mercator.
Вот отсюда формулы http://wiki.openstreetmap.org/wiki/Mercator

Мне же надо мир, состоящий из данных OSM установить таким размером, чтобы он сходился с миром тайлов.

Мир тайлов имеет размер = 1/(2/height).
А мир данных имеет динамический размер, который зависит от зума, и высчитывается по моим формулам.

Но результат не совсем точен. Настолько, что в центре мира в unity слои стакаются, а дальше начинают постепенно расходится.

http://pixs.ru/showimage/1png_6453725_24411367.png

Картинок не видно, поэтому сложно сказать. Могу только предположить, что не работает постулат о едином масштабном коэффициенте на весь мир. Не зря проекцию назвали “псевдомеркатор” т.к. она неконформная (чем севернее, тем больше расходятся масштабы по широте и долготе).

Ну и такие вот перлы

почему это не написать в виде размер = height/2 и не ломать голову. А значит и в других местах могут быть подобные навороты, которые сложно понять, легко пропустить ошибку…

Я дал ссылку на картинку. Она ниже картинки.

Так оно потому, что тайлы имеют размер 256. Игровым объектам тоже задается размер 256, думаю не надо объяснять зачем, да и сложно мне. А потом размер 256 делится на (2/height). Тем самым мы получаем идеально точную картинку, где пиксель текстуры имеет ровно пиксель на экране. Понятно? Иначе никак, height/2 не получится.

А почему мир имеет размер 1/(2/height)? Ну потому что внутри него тайлы имеют размер 256. Т.е. я не каждому тайлу размер 256 делю на 2/height, а просто общий объект уменьшил, у которого размер 1

Да и есть другая причина не брать чужую наработку.
Во-первых чужой код.
Во-вторых там 100% нет того, что мне надо, чтобы сделать идеальную карту как гугл. Ну как обычно, надо делать всё самому.

Там сдвиг в пару пикселей. Смените тип с float на double. Если это тот float которыё 32 bit то его хватит для хранения максимум 16 зума, а с каждой дополнительной формулой ошибки дополнительно накапливаются.

Попробовал, не изменилось ничего.
А если я буду конвертировать GPS не через Mercator, а другим способом, то будет нормально?
И какой есть другой способ?

Думаю вам стоит это прочитать, а то получился набор слов.

Я считал что OSM тайлы спроецированы через Mercator, раз у них на сайте формулы эти.
И поэтому сделал вывод, что если буду рисовать дома через эти формулы, значит дома и тайлы сойдутся.
Но почему это не так? Что-то странно как-то…

Если у вас на экваторе и в Австралии одинаковая ошибка в пару пикселей, то значит неправильно подобрали свои коэффициенты.

Логично.
На экваторе тоже самое(
http://pixs.ru/showimage/2png_9658396_24417902.png

У меня даже идей нет, в чем может быть проблема…

А камеру ортометрическую пробовали?

Ортографическая и стоит , иначе никак.

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

Хоть какую-нибудь подсказку, куда двигаться.