AnyGIS_maps icon indicating copy to clipboard operation
AnyGIS_maps copied to clipboard

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

Open nnngrach opened this issue 5 years ago • 0 comments

Я пока еще не успел поучаствовать в 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. И присылайте пул реквест.

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

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

nnngrach avatar Oct 26 '19 17:10 nnngrach