Проблема: Лифлет не поддерживает один тайловый слой

Это означает, что если вам нужно отрендерить какой-то динамический кластер, сгенерированный геосервером, вот так:

Листовка вместо этого покажет что-то вроде этого:

Который испорчен.

К счастью, мы (я и Арлиндо Перейра из MPRJ) нашли обходной путь, используя элемент ImageOverlay из Leaflet, который довольно прост, но на его поиск ушло много времени.

React-leaflet — это библиотека, предоставляющая компоненты для работы с листовкой. Таким образом, он предоставляет реагирующие компоненты, такие как Map, TileLayer, WMSTileLayer и так далее. Он также предоставляет ImageOverlay. Чтобы заставить это работать, вам нужно использовать компонент ImageOverlay следующим образом:

<ImageOverlay bounds={imageBounds} url={imageURL} transparent={true}/>

Где imageBounds должен быть объектом Leaflet Bounds, который должен быть границей для текущей видимой части карты, например:

{
 “_southWest”:
 {
 “lat”:-24.27701247166408,
 ”lng”:-46.65893554687501}
 }
 ”_northEast”:
 {
 “lat”:-21.927759064052037,
 ”lng”:-37.86987304687501
 }
}

Параметр imageURL — это URL-адрес службы, которая будет генерировать изображение, и должен быть таким:

let imageURL = `${ENDPOINT}?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&STYLES&LAYERS=${layer.layerName}&SRS=EPSG%3A4326&WIDTH=${clientWidth}&HEIGHT=${clientHeight}&BBOX=${imageBounds._southWest.lng}%2C${imageBounds._southWest.lat}%2C${imageBounds._northEast.lng}%2C${imageBounds._northEast.lat}`

Это вызов WMS. Главное, на что следует обратить внимание, это атрибуты Height, Width и Bbox. Высота и ширина должны быть в пикселях и, так сказать, связаны с размером карты в вашем приложении. Наша карта подходит под html документ, поэтому получилось так:

let clientHeight = document.body.clientHeight
let clientWidth = document.body.clientWidth

А Bbox — это та же самая координата, о которой упоминалось ранее.

Вы можете увидеть, как это было раньше:

А как сейчас:

Или здесь, в прямом эфире: http://apps.mprj.mp.br/sistema/inloco/

Здесь, чтобы увидеть код: https://github.com/MinisterioPublicoRJ/inLoco-2.0

InLoco — это географическая информационная система (ГИС), используемая Ministério Público do Estado do Rio de Janeiro для отображения социальных, институциональных и административных данных, созданных с помощью React и Leaflet, взаимодействующих с общедоступной серверной частью GeoServer. Вы можете отправить вам PR =)