Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Новые проекции #8

Open
nnngrach opened this issue Oct 26, 2019 · 0 comments
Open

Новые проекции #8

nnngrach opened this issue Oct 26, 2019 · 0 comments

Comments

@nnngrach
Copy link
Owner

nnngrach commented Oct 26, 2019

Я пока еще не успел поучаствовать в open-source и не знаю, как это правильно организовывать. Так что я пока просто поскидываю сюда несколько задач, за которые может взяться кто-нибудь желающий.

Так вот. Меня периодически просят добавить всякие карты в нестандартных проекциях. Например вот несколько карт в проекции LKS 1994 (EPSG 3346).
http://maps.lt/map
https://www.geoportal.lt/map/#

В принципе, можно попробовать написать функцию-конвертер координат для этой проекции. Я когда-то нашел что-то подобное для тайлов Яндекса и адаптировал в свой проект. Можно использовать это в качестве примера. Вот как это выглядело.

На этой страничке в разделе "Круглая или не очень" есть описание принципа работы этого конвертера. Простыми словами и с картинками ))
https://anygis.ru/Web/Html/Description_ru

А вот и код. Работает он в четыре этапа.

  1. Берем номер тайла в стандартной проекции. Получаем координаты его левого-верхнего угла. (Формула взята из osm wiki)
    https://www.jdoodle.com/a/1ECy
    https://github.com/nnngrach/AnyGIS_server/blob/671ef7071332e05741f8b2896492b7124f371ec2/Sources/App/ModelsOfLogic/Coordinate%20Tools/CoordinateTransformer.swift#L48

  2. Берем координаты этой точки. Получаем номер тайла Яндекса, на котором она будет лежать. И количество пикселей, на которые эта точка смещена от его левого-верхнего угла.
    https://www.jdoodle.com/a/1ECz
    https://github.com/nnngrach/AnyGIS_server/blob/671ef7071332e05741f8b2896492b7124f371ec2/Sources/App/ModelsOfLogic/Coordinate%20Tools/CoordinateTransformer.swift#L62

  3. Берем номер тайла Яндекса и шаблон его url адреса. Подставляем цифры на место заглушек типа {x},{y},{z}. Получаем 4 готовых url-адреса для скачивания этого и соседних тайлов.
    https://github.com/nnngrach/AnyGIS_server/blob/671ef7071332e05741f8b2896492b7124f371ec2/Sources/App/ModelsOfLogic/Coordinate%20Tools/URLPatchCreator.swift#L39

  4. Берем полученные 4 адреса и величину смещения. Отправляем post запрос с этими данными на мой микро сервер для обработки изображений. Получив запрос, он скачает эти 4 тайла и склеит их в один большой. А затем отступит от левого-верхнего угла требуемое количество пикселей и вырежет квадрат размером 256х256. Это и будет тайл с нужным нам смещением. Можно возвращать эту картинку пользователю.

Вот пример curl запроса, который можно отправлять на микросервер. Параметры должны называться urlTL, urlTR, urlBL, urlTL, urlBR, xOffset, xOffset. Здеь urlTL - это Top Left, а urlBR - это Bottom Right. Можно использовать сервер для отладки.

curl -X POST
http://68.183.65.138:3000/move
-d 'urlTL=https%3A%2F%2Fvec01.maps.yandex.net%2Ftiles%3Fl%3Dmap%26x%3D619%26y%3D318%26z%3D10%26scale%3D2%26lang%3Dru-RU&urlTR=https%3A%2F%2Fvec04.maps.yandex.net%2Ftiles%3Fl%3Dmap%26x%3D620%26y%3D318%26z%3D10%26scale%3D2%26lang%3Dru-RU&urlBR=https%3A%2F%2Fvec01.maps.yandex.net%2Ftiles%3Fl%3Dmap%26x%3D620%26y%3D319%26z%3D10%26scale%3D2%26lang%3Dru-RU&urlBL=https%3A%2F%2Fvec04.maps.yandex.net%2Ftiles%3Fl%3Dmap%26x%3D619%26y%3D319%26z%3D10%26scale%3D2%26lang%3Dru-RU&xOffset=0&yOffset=232'

А теперь, собственно, что нужно сделать?

Нужно найти подходящую формулу для перевода координат. И написать функцию как в пункте 2. Но для проекции LKS 1994 (EPSG 3346). То есть функцию, которая принимает координаты левого-верхнего угла OSM тайла. (latitude: Double, longitude: Double, zoom: Int).

А возвращать она должна номер LKS1994 тайла, на котором лежит точка левого-верхнего угла OSM тайла. То есть что-то такое (x: Int, y: Int, z: Int, offsetX: Int, offsetY: Int)

Вот. Если вы пишите на Swift, дописывайте свою функцию в файл по ссылке из пункта 2. И присылайте пул реквест.

Ну а если (что более вероятно) вы не знаете, что это вообще за язык такой, то можете просто написать эту функцию на любом удобном для вас языке. И присылать ее сюда. Прямо текстом. А я ее потом уже переведу. Думаю, это будет не сложно. Все равно большая часть работы здесь - это поиск и адаптация формул.

Примерно так. Ну, и если будет желание, то можно потом попробовать поставить это все на поток и написать еще несколько онлайн-конверторов для разных проекций. Чтобы можно было смотреть прямо из навигатора все эти локальные онлайн-карты.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant