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

http://pixs.ru/showimage/3png_4119490_24431393.png
Все объекты(дома) имеют родительский объект mapData.

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

Далее, координаты точек зданий преобразовываются также в мировые и из каждой еще вычитаются координаты startPositionWorld.
Таким образом мы получаем то, что дом встанет на свое место при условии, если объекту mapData установить правильный scale.

Вроде всё нужное расписал.

Ах, да. Надо сказать, что я узнаю пиксель внутри тайла. Это нужно чтобы сдвинуть мир тайлов. Почему тайлов? Потому что миров данных может быть много, а мир тайлов всегда 1.
Просто я себе это представлял не так как вы. Не представлял себе это как нахождение пикселя внутри тайла, поэтому непонятка вышла.

Давайте проясним, чтобы не было непоняток: как вы скачиваете и склеиваете одиночные тайлы, по TMS-запросу ? Потому-что каждый тайл 256x256 каждого зума имеет фиксированные координаты. Возможно это глупый вопрос т.к. я не знаю возможностей Unity3D, может там всё по-другому.

К счастью я напрямую беру по 1 тайлу у OSM с сервера http://tile.openstreetmap.org/

Когда загружается любая карта, допустим гугл, ему же надо дать координаты, в которых показать картинку? Вот они и являются красной меткой в нашем случае.

Для наглядности перейдите по ссылке на OSM карту https://www.openstreetmap.org/search?query=64.53663%2C39.78222
Здесь указаны координаты 64.53663,39.78222. Это красная метка

Так раз scale разный и зависит от широты, то как мои формулы, а может и не мои, сделать зависимыми от неё?

Я потому и спрашиваю, что в программе, которая читает тайлы по TMS, эти произвольные координаты в URL ни о чем не говорят. Это обманка (запрос высокого уровня) для leaflet, который сам решит какие тайлы (запросы низкого уровня, по номерам) скачать, склеить и сдвинуть. Нарисуйте на бумажке сетку тайлов, она фиксированная для каждого зума, и от неё пляшите.

Дак я же написал, что получаю тайлы с сервера OSM. Он естественно на 1 запрос мне выдает 1 тайл.

Я сам написал программу высокого уровня, которая при вызове 1 строчки кода мне выдает полностью работоспособную карту, с перемещением, плавным зумом и т.п.

Обратился сюда, чтобы разобраться с последней проблемой и завершить.

В посте #41 объяснил как у меня устроена работа карты, и подвел к тому, что проблема в scale. Потому что до этого говорили про градусы, потом про пиксель в тайле. Вот я и пытаюсь довести суть.

Выходит что все-таки надо узнать сколько градусов между центральным тайлом, в который входит startPositionWorld, и соседним.
И что-то с этим градусом сделать. Что именно? Да и как получить градусы между координатами до сих пор не понятно.
Правильно понимаю?

Неужели никто меня и отправить никуда не может?

NovaEiz, отправить вас запрещено правилами форума :slight_smile:

У вас есть системы координат:

  1. угловая-градусная, EPSG:4326, в которой есть широта и долгота;
  2. плоскостной сферический меркатор, EPSG:3857, в котором есть юниты, которые почти метры, но не совсем (совпадают только по экватору из-за искажений);
  3. тайловая сетка - нарезанный на кусочки по 256 пикселей EPSG:3857. Границы мира получить просто - берёте [-180, 180] в градусах по экватору, перепроецируете в EPSG:3857 из EPSG:4326, получаете диапазон по оси x и y.
  4. экранные пиксели - линейно отмасштабированный EPGS:3857. Матрица трансформации есть у вас в UI.

Сотрите весь ваш код перепроецирования и перепишите исходя из этих предпосылок.
Все эти переходы есть в коде тут: https://github.com/Komzpa/twms/blob/master/twms/projections.py
вики про меркатор: https://wiki.openstreetmap.org/wiki/EPSG:3857

Не понятно, зачем получать границы мира?

Дак а смысл переписывать? Получиться ровно тоже самое - проблема в scale мира данных. И я снова обращусь сюда с этим же вопросом, но только еще потрачу кучу времени на переписывание того же самого.

freeExec выше писал

Подробней бы про это что-нибудь

Komяpa, наверно вы не читали все посты.
На протяжении всей темы я дал понять, что использую всё необходимое для правильного отображения карты.
Все ваши пункты мной используются, кроме определения границ мира.

Чем ближе к северному полюсу, тем в один пиксель тайла влазиет больше метров земной поверхности. И изменяется по закону cos(широты).

А в вашем коде всё неправильно, не должно быть ни каких магических чисел. Из констант только размер тайла в 256px. А по уму вообще не должно быть зависимости от проекции, и в любой момент заменив в коде ToMercator на ToAlbers не чего не должно сломаться. И я бы вам советовал воспользоваться ProjNet, а не конструировать велосипед.

У меня нет никаких констант. Константа только размер тайла 256.
Скажите, что вы считаете у меня константой, кроме размера тайла, и я объясняю как оно высчитывается.

Никаких велосипедов нет, я же все формулы беру официальные.

Мы уже начинаем идти по второму кругу.

Оно и не сломается, если Albers будет выдавать тот же результат, а если другой, то оно в любом случае сломается.

У ProjNet даже документации нет. 2017 год наносу…

Проверил ProjNet. Дает другой результат.
Во-первых, работает в 2.5 раз дольше класса, который дан в вики OSM. И это просто ужасно. В 2.5 раза!
Во-вторых, дает точнее результат. Но, также осталась проблема со scale. Только вот теперь на экваторе я не вижу этой не точности, а к полюсу неточностью увеличивается.

Что делать со scale?

Да и использовать эту библиотеку я просто не могу. Скорость работы уж слишком медленная.

Погрешность на северном полюсе - http://pixs.ru/showimage/4png_4625947_24441488.png
Без погрешности на экваторе - http://pixs.ru/showimage/5png_2357068_24441494.png

Получается что scale к северному полюсу должен быть больше. Но как это расчитать? Cos возвращает слишком большое число, чтобы чу-чуть изменить scale.

Да и теперь уже 2 проблемы:

  1. Scale зависит от широты.
  2. Неточность конвертации Mercator в вики OSM. Как его сделать точнее? К сожалению не могу скоростью пренебречь. На сайте OSM всё быстро работает, мне и так не догнать их по скорости. А этот ProjNet вообще опускает сильно…

Проверил формулы из Вики в Excel. Взял координату западного угла мавзолея https://www.openstreetmap.org/node/2361011624

Вот этот тайл

Ввел координаты в таблицу, пересчитал в метры меркатора, перевел в пиксельные координаты по соглашению slippy map (с верхнего левого угла). Далее посчитал номер тайла и координаты пиксела в тайле.

Всё совпало до десятых долей.

Конечно. Естественно единичная точка совпадет и у меня. И совпадает. Всегда.

Но проблема в том, что я рисую дома, а вы нет.
Проблема в scale мира данных, который содержит дома. В котором очень много точек.
И я только что расписал разница между ProjNet и формулами OSM.

Центральная точка, в которой у меня открывается карта всегда идеально точна. Но чем дальше от этого центра, тем больше зависимости от scale.

Не может быть погрешности на полюсе в проекции, работающей только до 85° широты. Полюс на меркаторе проецируется в бесконечность.