Приветствую профи 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 не идеально точен. Из-за этого, естественно проблемы.
Я уже начинаю запутываться и, конечно, сомневаюсь что здесь помогут, но оооочень на это надеюсь. Спасите, Братья!
Зря вы навводили эти коэффициенты, и я там не вижу ни где косинуса, раз вы используете Меркатор.
Вообще я делал подобное, брал за основу UnitySlippyMap.
Всё накладывается отлично:
freeExec, обидно мне брать чужую нароботку, когда я свою уже 2 месяца делаю и осталось совсем ничего. Раньше бы узнать)
Мне бы формулу. И я не представляю что делать с косинусом. А вы?
И вообще, разве OSM на WGS84 стоит? Я брал на сайте openstreetmap.org класс MercatorProtection
Судя по первому посту вы там что-то пытаетесь эмпирически вычислить, вместо взятия оригинальной математической модели. Поэтому ваш велосипед состоит из одного колеса, возможно проще всё же взять готовый или хотя бы разобраться в его схеме.
Что же до косинуса, то есть это даже вики https://en.wikipedia.org/wiki/Mercator_projection#Small_element_geometry . Где важно для вас, что коэффициент по широте есть 1/косинус(широта)
В приведённом же мной проекте трансформируют всё в метры проекции 900913, с этим удобней работать, чем с градусами.
Картинок не видно, поэтому сложно сказать. Могу только предположить, что не работает постулат о едином масштабном коэффициенте на весь мир. Не зря проекцию назвали “псевдомеркатор” т.к. она неконформная (чем севернее, тем больше расходятся масштабы по широте и долготе).
Ну и такие вот перлы
почему это не написать в виде размер = 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, раз у них на сайте формулы эти.
И поэтому сделал вывод, что если буду рисовать дома через эти формулы, значит дома и тайлы сойдутся.
Но почему это не так? Что-то странно как-то…