Как оформить прозрачный оверлейный слой WMS - PullRequest
4 голосов
/ 30 ноября 2011

Я успешно наложил слой WMS в картах Google v3, однако, поскольку информация на плитках черная на прозрачном, она плохо видна на темном фоне (например, на спутниковой карте), см. Некоторые плитки для пример:

http://geoportal2.uhul.cz/wms_oprl/?SERVICE=WMS&REQUEST=GetMap&SERVICE=WMS&VERSION=1.1.1&LAYERS=HMLCR&FORMAT=image/png;%20mode=24bit&FGCOLOR=0xFF0000&TRANSPARENT=TRUE&SRS=EPSG:4326&BBOX=16.58935546875,49.37522008143603,16.600341796875,49.38237278700955&WIDTH=256&HEIGHT=256&STYLES=

( Этот был ссылкой WMS для извлечения этого фрагмента)

Вопрос: как изменить вышеуказанный WMS-запрос, чтобы изменить цвет переднего плана (в настоящее время черный) на какой-либо другой пользовательский цвет (например, красный)? Другими словами, как стилизовать слой? Сервер, по-видимому, может сделать это для этого слоя, поскольку это возможно сделать через их приложение веб-карты (которое работает только в IE), где вы можете выбрать цвет. Посмотрите на это изображение карты, например:

enter image description here

( Следующая ссылка использовалась для извлечения изображения - обратите внимание, что оно содержит масштаб и логотип, поэтому это неправильная плитка.)

К сожалению, это веб-приложение не использует WMS для получения этой карты стиля, поэтому я не могу просто скопировать параметры стиля в запрос WMS. Я должен выполнить стилизацию с помощью запроса WMS (поскольку этот другой формат запроса является проприетарным, извлекает всю карту - не предназначенную для плиток - и кажется, что она не поддерживает координаты WGS) - как Я делаю это?

Я пытался:

  1. посмотрите документацию WMS , особенно версия 1.1.1
  2. посмотрите на SLD , но это кажется довольно сложной вещью ...
  3. посмотрите на вывод команды GetCapabilites для сервера WMS
  4. Кроме того, глядя на DescribeLayer и GetStyles выходных данных команды для моего желаемого слоя (HLMCR), я даже не знаю, будет ли этот слой поддерживать стилизацию поверх WMS ...

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

«Это невозможно» - тоже полезный ответ для меня!

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 04 января 2012

На первый взгляд, похоже, что это реализация Mapserver 5.x, и getCapabilities отмечает, что UserDefinedSymbolization SupportSLD = "1" включен на уровне карты, что означает, что IIRC должен наследовать все уровниit.

Таким образом, теоретически вы должны быть в состоянии предоставить SLD либо в GET-запросе, либо где-нибудь в файле и предоставить URL-адрес вашего SLD для GET-запроса, и все будет готово.

Запись SLD будет раздражающим моментом, но если вы считаете, что у вас есть какой-то SLD, который должен работать, но не работает, вставьте его сюда.

0 голосов
/ 03 декабря 2011

Ссылка WMS уже имеет несколько пользовательских параметров, которые позволяют вам делать именно то, что вы просите. Ссылка следующая:

  http://geoportal2.uhul.cz/mapserv/php/mapserv3.php?project=oprl_2011&mode=map&mapsize=256%20256&layers=HMLCR%20&x=1322616184548&map_SMO_class_0_color=0%200%200&map_HMLCR_class_0_color=255%200%200&mapext=-679915.1258015268%20-1062651.2224427482%20-679660.3694656485%20-1062461.062442748

Если вы проверите его, вы заметите, что между всеми закодированными параметрами URL есть интересный параметр: map_HMLCR_class_0_color

Если вы измените его значение, скажем, на зеленый (чей код RGB равен 0,255,0), слои отображаются зеленым цветом. Цвет выражается в виде кода RGB. Есть также еще один параметр map_SMO_class_0_color , но я не понимаю, что это делает. Возможно, это стилизация какой-то функции, которая не видна в этом запросе?

Пример для зеленого цвета:

 http://geoportal2.uhul.cz/mapserv/php/mapserv3.php?project=oprl_2011&mode=map&mapsize=256%20256&layers=HMLCR%20&x=1322616184548&map_SMO_class_0_color=0%20100%20200&map_HMLCR_class_0_color=0%20255%200&mapext=-679915.1258015268%20-1062651.2224427482%20-679660.3694656485%20-1062461.062442748

, который производит следующее:

green styled request

Примечание: представление цвета в Mapserver

триплет RGB должен быть записан в запросе следующим образом:

R G B

(обратите внимание, что пробелы обязательны). Чье URl-кодированное представление:

R%20G%20B

потому что % 20 - это то, как пространство кодируется в URL.

0 голосов
/ 01 декабря 2011

Используйте скрипт-обертку, который считывает изображение из WMS и перекрашивает его:

Wrapper

Вот пример, написанный на PHP:

<?php
$url = $_GET['url'];
$im = imagecreatefrompng($url);

if($im && imagefilter($im, IMG_FILTER_COLORIZE, 255, 0, 0, 0)){
    // this line is only needed if original image has transparency (32bit/pixel)
    // and you want to preserve that transparency
    imagesavealpha($im, true);

    header('Content-type: image/png');
    imagepng($im);
}else{
    echo 'Conversion failed.';
}

imagedestroy($im);
exit;
?>

Тогда вместодля вызова вашей ссылки WMS вы вызываете упаковщик и передаете ссылку WMS в качестве параметра (recolor_png.php? url = ...).Оболочка считывает исходное изображение и возвращает новый PNG с раскрашенной версией.Не забывайте, что ссылка, которую вы передаете в качестве параметра, должна быть правильно закодирована (все специальные символы заменены их шестнадцатеричной нотацией% XX).В JavaScript вы можете сделать это, используя метод encodeURIComponent ().

Вот рабочий пример использования вашей ссылки и вышеуказанной оболочки на моем сервере:

http://www.digilog.de/pub/stackoverflow/recolor_png2.php?url=http%3A%2F%2Fgeoportal2.uhul.cz%2Fwms_oprl%2F%3FSERVICE%3DWMS%26REQUEST%3DGetMap%26SERVICE%3DWMS%26VERSION%3D1.1.1%26LAYERS%3DHMLCR%26FORMAT%3Dimage%2Fpng%3B%2520mode%3D24bit%26FGCOLOR%3D0xFF0000%26TRANSPARENT%3DTRUE%26SRS%3DEPSG%3A4326%26BBOX%3D16.58935546875%2C49.37522008143603%2C16.600341796875%2C49.38237278700955%26WIDTH%3D256%26HEIGHT%3D256%26STYLES%3D

Это полученное изображение (полупрозрачная версия):

recolor_png2.png http://www.digilog.de/pub/stackoverflow/recolor_png2.png

Та же самая оболочка без полупрозрачного вывода (imagesavealpha удалено из кода):

http://www.digilog.de/pub/stackoverflow/recolor_png.php?url=http%3A%2F%2Fgeoportal2.uhul.cz%2Fwms_oprl%2F%3FSERVICE%3DWMS%26REQUEST%3DGetMap%26SERVICE%3DWMS%26VERSION%3D1.1.1%26LAYERS%3DHMLCR%26FORMAT%3Dimage%2Fpng%3B%2520mode%3D24bit%26FGCOLOR%3D0xFF0000%26TRANSPARENT%3DTRUE%26SRS%3DEPSG%3A4326%26BBOX%3D16.58935546875%2C49.37522008143603%2C16.600341796875%2C49.38237278700955%26WIDTH%3D256%26HEIGHT%3D256%26STYLES%3D

и полученное непрозрачное изображение:

recolor_png.png http://www.digilog.de/pub/stackoverflow/recolor_png.png

Я оставлю эти обертки в сети на несколько дней, чтобы вы могли их протестировать.

Кэширование

Поскольку это преобразование требует интенсивной работы процессора, возможно, было бы целесообразно добавить некоторый кеширующий код в оболочку:

  • создать хеш-код из заданного URLНапример: $ hash = md5 ($ url)
  • проверить, существует ли изображение с именем $ hash.png в подпапке хранилища
  • , если это так: прочитать изображение из файла и вернуть его
  • в противном случае: создайте изображение, сохраните его как $ hash.png в подпапке, а также верните it немедленно

Если вы ожидаете, что ваш контент WMS изменится со временем: также проверьте дату создания кэшированных изображений и очистите их, если они слишком старые (например, месяц или около того).Таким образом, любые изменения в картах WMS будут распространяться на вашу систему через максимум один месяц.

...