Допустим, что координаты, на которых загрузились тайлы, это красная метка, которая на картинке. Преобразуем координаты в мировые unity через Mercator и присвоим их переменной с названием startPositionWorld.
Далее, координаты точек зданий преобразовываются также в мировые и из каждой еще вычитаются координаты startPositionWorld.
Таким образом мы получаем то, что дом встанет на свое место при условии, если объекту mapData установить правильный scale.
Ах, да. Надо сказать, что я узнаю пиксель внутри тайла. Это нужно чтобы сдвинуть мир тайлов. Почему тайлов? Потому что миров данных может быть много, а мир тайлов всегда 1.
Просто я себе это представлял не так как вы. Не представлял себе это как нахождение пикселя внутри тайла, поэтому непонятка вышла.
Давайте проясним, чтобы не было непоняток: как вы скачиваете и склеиваете одиночные тайлы, по TMS-запросу ? Потому-что каждый тайл 256x256 каждого зума имеет фиксированные координаты. Возможно это глупый вопрос т.к. я не знаю возможностей Unity3D, может там всё по-другому.
Когда загружается любая карта, допустим гугл, ему же надо дать координаты, в которых показать картинку? Вот они и являются красной меткой в нашем случае.
Я потому и спрашиваю, что в программе, которая читает тайлы по TMS, эти произвольные координаты в URL ни о чем не говорят. Это обманка (запрос высокого уровня) для leaflet, который сам решит какие тайлы (запросы низкого уровня, по номерам) скачать, склеить и сдвинуть. Нарисуйте на бумажке сетку тайлов, она фиксированная для каждого зума, и от неё пляшите.
Дак я же написал, что получаю тайлы с сервера OSM. Он естественно на 1 запрос мне выдает 1 тайл.
Я сам написал программу высокого уровня, которая при вызове 1 строчки кода мне выдает полностью работоспособную карту, с перемещением, плавным зумом и т.п.
Обратился сюда, чтобы разобраться с последней проблемой и завершить.
В посте #41 объяснил как у меня устроена работа карты, и подвел к тому, что проблема в scale. Потому что до этого говорили про градусы, потом про пиксель в тайле. Вот я и пытаюсь довести суть.
Выходит что все-таки надо узнать сколько градусов между центральным тайлом, в который входит startPositionWorld, и соседним.
И что-то с этим градусом сделать. Что именно? Да и как получить градусы между координатами до сих пор не понятно.
Правильно понимаю?
угловая-градусная, EPSG:4326, в которой есть широта и долгота;
плоскостной сферический меркатор, EPSG:3857, в котором есть юниты, которые почти метры, но не совсем (совпадают только по экватору из-за искажений);
тайловая сетка - нарезанный на кусочки по 256 пикселей EPSG:3857. Границы мира получить просто - берёте [-180, 180] в градусах по экватору, перепроецируете в EPSG:3857 из EPSG:4326, получаете диапазон по оси x и y.
экранные пиксели - линейно отмасштабированный EPGS:3857. Матрица трансформации есть у вас в UI.
Дак а смысл переписывать? Получиться ровно тоже самое - проблема в scale мира данных. И я снова обращусь сюда с этим же вопросом, но только еще потрачу кучу времени на переписывание того же самого.
Komяpa, наверно вы не читали все посты.
На протяжении всей темы я дал понять, что использую всё необходимое для правильного отображения карты.
Все ваши пункты мной используются, кроме определения границ мира.
Чем ближе к северному полюсу, тем в один пиксель тайла влазиет больше метров земной поверхности. И изменяется по закону cos(широты).
А в вашем коде всё неправильно, не должно быть ни каких магических чисел. Из констант только размер тайла в 256px. А по уму вообще не должно быть зависимости от проекции, и в любой момент заменив в коде ToMercator на ToAlbers не чего не должно сломаться. И я бы вам советовал воспользоваться ProjNet, а не конструировать велосипед.
У меня нет никаких констант. Константа только размер тайла 256.
Скажите, что вы считаете у меня константой, кроме размера тайла, и я объясняю как оно высчитывается.
Никаких велосипедов нет, я же все формулы беру официальные.
Мы уже начинаем идти по второму кругу.
Оно и не сломается, если Albers будет выдавать тот же результат, а если другой, то оно в любом случае сломается.
Проверил ProjNet. Дает другой результат.
Во-первых, работает в 2.5 раз дольше класса, который дан в вики OSM. И это просто ужасно. В 2.5 раза!
Во-вторых, дает точнее результат. Но, также осталась проблема со scale. Только вот теперь на экваторе я не вижу этой не точности, а к полюсу неточностью увеличивается.
Что делать со scale?
Да и использовать эту библиотеку я просто не могу. Скорость работы уж слишком медленная.
Получается что scale к северному полюсу должен быть больше. Но как это расчитать? Cos возвращает слишком большое число, чтобы чу-чуть изменить scale.
Да и теперь уже 2 проблемы:
Scale зависит от широты.
Неточность конвертации Mercator в вики OSM. Как его сделать точнее? К сожалению не могу скоростью пренебречь. На сайте OSM всё быстро работает, мне и так не догнать их по скорости. А этот ProjNet вообще опускает сильно…
Ввел координаты в таблицу, пересчитал в метры меркатора, перевел в пиксельные координаты по соглашению slippy map (с верхнего левого угла). Далее посчитал номер тайла и координаты пиксела в тайле.
Конечно. Естественно единичная точка совпадет и у меня. И совпадает. Всегда.
Но проблема в том, что я рисую дома, а вы нет.
Проблема в scale мира данных, который содержит дома. В котором очень много точек.
И я только что расписал разница между ProjNet и формулами OSM.
Центральная точка, в которой у меня открывается карта всегда идеально точна. Но чем дальше от этого центра, тем больше зависимости от scale.