Mapserver, Leaflet, отображение растрового слоя

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
taksadev
Новоприбывший
Сообщения: 8
Зарегистрирован: 18 апр 2018, 18:23
Репутация: 0
Откуда: Земля

Mapserver, Leaflet, отображение растрового слоя

Сообщение taksadev » 18 апр 2018, 18:38

Здравствуйте!

Подскажите, пожалуйста, в чем может быть проблема.

Есть снимок Sentinel-2, который нужно отобразить на веб-карте.

Для этого в map файле есть следующее

Код: Выделить всё

MAP
IMAGETYPE PNG
  NAME 'Web map'
  SIZE 300 300
  UNITS dd
  EXTENT 60.2289530630876442 48.9969740071353286 110.0024212413648002 57.9999999949999889
 OUTPUTFORMAT
	NAME png
	DRIVER "AGG/PNG"
	MIMETYPE "image/png"
	IMAGEMODE RGBA
	EXTENSION "png"

  END
  WEB
    TEMPLATE  '/var/www/html/index1.html'
    IMAGEPATH '/var/www/html/'
    IMAGEURL  '/var/www/html/'
  METADATA
  "wms_enable_request" "*" 
      "wms_title"          'QGIS-MAP'
      "wms_onlineresource"  'http://localhost/cgi-bin/mapserv?map=/var/www/html/map.map&'
      "wms_abstract" "This is the WMS demo from GIS-Lab"
      "wms_srs"             'EPSG:4326'
      "wms_feature_info_mime_type" "text/html"
    "wms_format" "image/png"
    END
  END
   PROJECTION
     "proj=longlat"
    "datum=WGS84"
    "no_defs"
   END

 LAYER
    NAME test
    TYPE RASTER
 	DUMP true
    TEMPLATE fooOnlyForWMSGetFeatureInfo
    EXTENT 60.2289530630876442 48.9969740071353286 110.0024212413648002 57.9999999949999889
    DATA '/var/www/html/output1.tif'

    METADATA
      wms_title 'test'
      wms_abstract 'test'
      "wms_server_version" "1.1.1"
      "wms_srs" "EPSG:4326"

   END
   STATUS ON

 	PROCESSING "RESAMPLE=BILINEAR"
 	PROCESSING "NODATA=0"
    	PROCESSING "SCALE=AUTO" 
 	TRANSPARENCY 100
 	OPACITY 100

   END




END
В JS коде следующее

Код: Выделить всё

<script type="text/javascript">	
        var mymap = L.map('map').setView([53.36056 , 83.76], 8);
        var osm = new L.TileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(mymap);
        var wmsLayer = L.tileLayer.wms('http://localhost/cgi-bin/mapserv?map=/var/www/html/map.map&', {
            layers: 'test',
            crs: L.CRS.EPSG4326,
            version: '1.1.1',
        }).addTo(mymap);
    </script>
Т.е. я формирую карту из двух слоёв openstreetmap и своего растрового

В итоге получаю следующее

Изображение

Растровый слой отображается не корректно и он перекрывает полностью базовый слой.

Я только начинаю осваивать веб-картографию, подскажите, пожалуйста, в чем проблема.
Последний раз редактировалось taksadev 22 апр 2018, 06:21, всего редактировалось 1 раз.

alexandr cherepanov
Гуру
Сообщения: 534
Зарегистрирован: 30 ноя 2006, 13:31
Репутация: 116
Откуда: Moscow

Re: Mapserver, Leaflet, отображение растрового слоя

Сообщение alexandr cherepanov » 18 апр 2018, 18:46

Растр отображается не корректно, наверное потому, что ваш файл output1.tif 16 битный и ваш тайловый сервер генерит каждую 8 битную pngшку по своей линейной функции - отсюда лоскутное одеяло.

taksadev
Новоприбывший
Сообщения: 8
Зарегистрирован: 18 апр 2018, 18:23
Репутация: 0
Откуда: Земля

Re: Mapserver, Leaflet, отображение растрового слоя

Сообщение taksadev » 19 апр 2018, 04:14

я делал преобразование (не знаю правда так ли надо, такой командой)

gdal_translate -scale -ot Byte crop.tif output1.tif

В мета информации, которую я смотрю через QGIS , там указано Byte — 8-битное беззнаковое целое

Получается же что растр 8-ми битный сейчас?

alexandr cherepanov
Гуру
Сообщения: 534
Зарегистрирован: 30 ноя 2006, 13:31
Репутация: 116
Откуда: Moscow

Re: Mapserver, Leaflet, отображение растрового слоя

Сообщение alexandr cherepanov » 19 апр 2018, 08:23

В целом да, получите 8 битное (пусть и не очень красивое). Можно еще добавить ключ

Код: Выделить всё

 -a_nodata 0
Если нужна ручная подстройка цветов, то можете это сделать в Qgis и получить на выходе RGBA 8 бит на канал.

Удалите строку в map файле

Код: Выделить всё

PROCESSING "SCALE=AUTO" 
или исправьте на

Код: Выделить всё

PROCESSING "SCALE=0,255" 

taksadev
Новоприбывший
Сообщения: 8
Зарегистрирован: 18 апр 2018, 18:23
Репутация: 0
Откуда: Земля

Re: Mapserver, Leaflet, отображение растрового слоя

Сообщение taksadev » 19 апр 2018, 18:29

большое спасибо за помощь, вот я сейчас делаю преобразование при помощи
gdal_translate -scale -ot Byte -a_nodata 0 4326.tif map.tif и я это делаю с композитом (отдельных каналов на компьютере нет.). Но мне кажется что что-то неправильно,т.к. изображение получается тёмное и при отрисовки на веб-карте и в Qgis. Правильно я понимаю, что нужно преобразовывать отдельные каналы, а не композит?

Вот пример

Изображение

alexandr cherepanov
Гуру
Сообщения: 534
Зарегистрирован: 30 ноя 2006, 13:31
Репутация: 116
Откуда: Moscow

Re: Mapserver, Leaflet, отображение растрового слоя

Сообщение alexandr cherepanov » 19 апр 2018, 23:13

Оно примерно таким и получается с линейной функцией на весь диапазон значений. С отдельными каналами или синтезом, это никак не влияет на результат. Проще сразу работать и настраивать отображение того синтеза, который нужен.
Откройте свое 16 битное изображение Qgis. В свойствах слоя настройте Прозрачность -> Значение "нет данных": 0.
Настройте отображение на вкладке Стиль или через панель Инструменты для работы с растровыми данными.
Как получите результат на экране, который Вас устраивает - на слое правая кнопка мыши -> Сохранить как -Изображение. На выходе получите RGB + Альфаканал в теми цветами, что были на экране.

taksadev
Новоприбывший
Сообщения: 8
Зарегистрирован: 18 апр 2018, 18:23
Репутация: 0
Откуда: Земля

Re: Mapserver, Leaflet, отображение растрового слоя

Сообщение taksadev » 20 апр 2018, 06:02

Спасибо! Получилось прям всё очень круто, вот только последний вопрос (я извиняюсь за навязчивость).

Спутниковый снимок должен быть на базовом слое Open Street Map, сейчас слой MapServer-а полностью перекрывает Open Street Map белым цветом.

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


Изображение

alexandr cherepanov
Гуру
Сообщения: 534
Зарегистрирован: 30 ноя 2006, 13:31
Репутация: 116
Откуда: Moscow

Re: Mapserver, Leaflet, отображение растрового слоя

Сообщение alexandr cherepanov » 20 апр 2018, 08:41

За прозрачность в пределах bbox снимка отвечает альфа маска, и она должна была быть добавлена автоматом при сохранение из QGIS.

Попробуйте добавить в OUTPUTFORMAT

Код: Выделить всё

TRANSPARENT   ON
По картинке порядок каналов в синтезе не совсем правильный, поставьте в QGIS порядок 3,2,1 вместо 1,2,3.

taksadev
Новоприбывший
Сообщения: 8
Зарегистрирован: 18 апр 2018, 18:23
Репутация: 0
Откуда: Земля

Re: Mapserver, Leaflet, отображение растрового слоя

Сообщение taksadev » 22 апр 2018, 06:21

Да, большое спасибо! Можно ещё добавить к ответу, что в JS коде должны быть примерно такие параметры для получения слоя от MapServer-а.

Код: Выделить всё

 				    maxZoom: 12,
                                    format: 'image/png',
				    transparent: true,
                                    layers: 'test',
                                    crs: L.CRS.EPSG4326,
                                    version: '1.1.1',

Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя