如何设置透明叠加WMS图层的样式

时间:2011-11-30 02:43:29

标签: google-maps google-maps-api-3 gis wms sld

我在谷歌地图v3中成功overlayed a WMS layer,因为有关瓷砖的信息在透明时是黑色的,但在深色背景(如卫星地图)上看不到,请参阅一些瓷砖,例如:

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=

This was the WMS link检索该图块)

问题:如何修改上面的WMS请求以将前景色(当前为黑色)更改为某些自定义颜色(例如红色)?换句话说,如何设置图层样式?服务器显然能够为此层执行此操作,因为可以通过their web map application(仅在IE中工作)来执行此操作,您可以在其中选择颜色。例如,请参见此地图图片:

enter image description here

The following link用于检索图像 - 请注意它包含比例和徽标,因此它不是合适的图块。)

不幸的是,这个Web应用程序不使用WMS来获取这个样式化的地图,所以我不能只将样式参数复制到WMS请求。 我必须通过WMS请求进行样式化(因为这个其他请求格式是专有的,检索整个地图 - 不是为瓷砖设计的 - 它似乎不支持WGS坐标) - 如何我应该这样做吗?

我试图:

  1. 查看WMS documentation,尤其是version 1.1.1
  2. 看看SLDs,但抓住它似乎相当复杂......
  3. 查看WMS服务器的GetCapabilites command output
  4. 此外,查看我所需图层(HLMCR)的DescribeLayerGetStyles命令输出后,我甚至不知道该图层是否支持WMS样式...
  5. 我迷路了,如果你指出了正确的方向,我将不胜感激 - 如果它甚至可以在WMS中解决(对于这一层),我将不胜感激。

    “这不可能”对我来说也是一个有用的答案!

    提前致谢。

3 个答案:

答案 0 :(得分:2)

乍一看,看起来这是一个Mapserver 5.x实现,并且getCapabilities注意到在地图级别启用了 UserDefinedSymbolization SupportSLD =“1”,IIRC意味着所有图层都应该继承它。

因此理论上你应该能够在GET请求或某个文件中提供SLD,并将SLD的URL提供给GET请求,并且全部设置完毕。

编写SLD将是令人烦恼的一点,但如果您认为某些SLD应该可以工作但不能,请将其粘贴到此处。

答案 1 :(得分:0)

使用包装器脚本从WMS读取图像并重新标记它:

包装

以下是用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。不要忘记,作为参数传递的链接必须是urlencoded才能正常工作(所有特殊字符都用其%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并立即返回

如果您希望WMS内容随时间发生变化:还要检查缓存图像的创建日期,如果它们太旧(例如一个月左右)则清除它们。因此,在最长一个月的时间后,对WMS地图的任何更改都会波及您的系统。

答案 2 :(得分:-1)

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

(请注意,空白是必需的)。 其编码表示的是:

R%20G%20B

因为%20 是网址中空间的编码方式。