4

我成功地在谷歌地图 v3 中覆盖了一个 WMS 图层,但是,由于瓷砖上的信息在透明时是黑色的,所以在深色背景(如卫星地图)上看不太清楚,例如看一些瓷砖:

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&宽度=256&高度=256&样式=

是检索该图块的 WMS 链接)

问题:如何修改上述WMS请求,将前景色(当前为黑色)更改为某种自定义颜色(例如红色)?换句话说,如何设置图层样式?服务器显然可以为该图层执行此操作,因为可以通过他们的 web 地图应用程序(仅在 IE 中工作)来执行此操作,您可以在其中选择颜色。例如,请参阅此地图图像:

在此处输入图像描述

以下链接用于检索图像 - 请注意它包含比例和徽标,因此它不是正确的图块。)

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

我尝试过了:

  1. 查看WMS 文档,尤其是1.1.1 版
  2. 看看SLD,但掌握起来似乎很复杂......
  3. 查看WMS 服务器的GetCapabilites 命令输出
  4. 此外,查看了我想要的图层(HLMCR)的DescribeLayerGetStyles命令输出,我什至不知道该图层是否支持 WMS 上的样式...

我迷路了,如果你指出我正确的方向,我将不胜感激 - 或者如果它甚至可以在 WMS 中解决(对于这一层),我将不胜感激。

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

提前致谢。

4

3 回答 3

2

乍一看,这是一个 Mapserver 5.x 实现,getCapabilities 指出 在 Map 级别启用了UserDefinedSymbolization SupportSLD="1",IIRC 意味着所有图层都应该继承它。

因此,理论上您应该能够在 GET 请求中或在某个文件中提供 SLD,并将 SLD 的 URL 提供给 GET 请求,然后一切就绪。

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

于 2012-01-04T02:07:55.120 回答
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
(来源:digilog.de

没有半透明输出的相同包装器(从代码中删除了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
(来源:digilog.de

我会将这些包装器留在网上几天供您测试。

缓存

由于这种转换是处理器密集型的,因此向包装器添加一些缓存代码可能是明智的:

  • 从给定的 URL 创建一个哈希码,例如:$hash=md5($url)
  • 检查存储子文件夹中是否存在名为 $hash.png 的图像
  • 如果是这样:从文件中读取图像并返回它
  • 否则:创建图像,将其保存为子文件夹中的 $hash.png 并立即返回

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

于 2011-11-30T23:57:16.430 回答
-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

产生以下内容:

绿色风格的请求

Mapserver 中关于 rgb 颜色表示的注释

RGB 三元组必须在请求中编写如下:

R G B

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

R%20G%20B

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

于 2011-12-03T10:37:11.153 回答