Использование google-maps sdk в приложении для Android с пользовательскими тайлами из GeoServer

Я пытаюсь создать приложение, которое отображает 2D-карту с помощью google-maps sdk и получает плитки от GeoServer. У меня возникла проблема с сервером, возвращающим разные уровни масштабирования не так, как ожидалось, квадраты 1x1, 4x4, 16x16, вместо этого он использует половину тайлов по высоте по сравнению с шириной: 4x2, 16x8 и т. д. Это заканчивается тем, что карта отображается нормально, но половина тайлов вверху пуста, есть ли способ настроить это и мужской работает с такой плиткой?

Сервер использует проекцию EPSG:4326.

Используя смещение, я смог центрировать карту, но при масштабировании она ведет себя не так, как ожидалось...

Вот изображение получившейся карты: https://gph.is/g/E1qQgkw

Вот несколько снимков справа от возвращаемых плиток, а слева — другой слой, который работает так, как ожидалось:

Вот некоторые снимки справа от возвращаемых плиток, а слева - другой слой, который работает должным образом

Есть ли способ настроить google-maps для работы с этой проекцией и тайлами? Я даже готов перейти на другой SDK, если это не так...

Я буду признателен за любую помощь или указатели...


person Andres    schedule 08.11.2019    source источник


Ответы (3)


EPSG 3857, Pseudo-Mercator действительно является «стандартом» клиента для использования тайлов https://epsg.io/3857

и я не знаю ни одного другого SDK, способного потреблять нестандартные тайлы (osmdroid, mapsforge, mabox,..)

Таким образом, ваш экземпляр Geoserver должен будет обслуживать EPSG:3857 либо на лету, либо предварительно сгенерированный.

Я не мог понять, обслуживает ли Geoserver тайлы WMS. В этом случае вы можете передать код EPSG в качестве параметра при запросе тайлов. Взгляните на это дополнение для Карт Google, чтобы узнать, как это делается, https://github.com/shalperin/android-wms

В случае, если Geoserver просто обслуживает кеш предварительно сгенерированных плиток X/Y/Z, вам придется перегенерировать этот кеш.

Тем не менее, вот официальная демонстрация того, как использовать тайлы с помощью TileOverlay https://github.com/googlemaps/android-samples/blob/master/ApiDemos/java/app/src/main/java/com/пример/mapdemo/TileOverlayDemoActivity.java

person LuisTavares    schedule 09.11.2019
comment
Спасибо за ваш ответ! это помогло прояснить вопрос. GeoServer не возвращает тайлы WMS для этого спутникового слоя, это предварительно сгенерированный набор тайлов, и, к сожалению, мне нужно заставить его работать, потому что другие сервисы уже используют эти тайлы, и мы не можем их изменить. Я ищу любой sdk, который мог бы работать с этими плитками ESPG: 4326, или как обрабатывать плитки для генерации EPSG: 3857 на лету на мобильном телефоне, я смог найти некоторые веб-библиотеки, но ничего, что могло бы работать на мобильном телефоне устройство в автономном режиме. - person Andres; 27.11.2019
comment
... единственная возможность на стороне клиента, которая у вас осталась, - это гибрид/сеть. JS-библиотеки Leaflet и Openlayers поддерживают произвольные проекции, например, github.com/idris-maps. /листовка-индивидуальная-проекция - person LuisTavares; 27.11.2019

По умолчанию GeoServer (фактически внутренний GeoWebCache) может предоставить листы, используя 3 связанных, но разных стандарта WMTS, TMS и WMS-C в двух проекциях EPSG:4326 (широта/долгота в градусах) или EPSG:900913 (теперь известная как EPSG 3857, Psuedo Web Mercator).

Какая из этих конечных точек вам нужна, зависит от используемого вами SDK, но, глядя на изображения, которые вы показываете, одно слева имеет формат EPSG: 4326, а правое — EPSG: 3857.

person Ian Turton    schedule 09.11.2019

После долгих исследований мы выясняем проблему и приходим к решению, возможно, это может помочь кому-то в будущем, проблема заключалась в том, что тайлы спутников находились в другой проекции по сравнению с тайлами дорог, ESPG: 4326 против ESPG: 3857 (The наиболее распространенный, также известный как Web Mercator, который используют карты Google и все другие SDK)

Мы не могли вносить какие-либо изменения в плитки, но у нас была возможность внести изменения в сервер, поэтому MapProxy был нашим лучшим вариантом, с помощью этого инструмента мы смогли преобразовать 4326 в 3857 и использовать плитки из мобильного клиента без изменений. это программа на python, которая работает в Windows и действует как прокси-сервер между плитками, которые запрашивает клиент, и сервером, предоставляющим плитки, перепроецируя и открывая их на новой конечной точке.

person Andres    schedule 02.01.2020