我在谷歌地图v3中成功overlayed a WMS layer,因为有关瓷砖的信息在透明时是黑色的,但在深色背景(如卫星地图)上看不到,请参阅一些瓷砖,例如:
(This was the WMS link检索该图块)
问题:如何修改上面的WMS请求以将前景色(当前为黑色)更改为某些自定义颜色(例如红色)?换句话说,如何设置图层样式?服务器显然能够为此层执行此操作,因为可以通过their web map application(仅在IE中工作)来执行此操作,您可以在其中选择颜色。例如,请参见此地图图片:
(The following link用于检索图像 - 请注意它包含比例和徽标,因此它不是合适的图块。)
不幸的是,这个Web应用程序不使用WMS来获取这个样式化的地图,所以我不能只将样式参数复制到WMS请求。 我必须通过WMS请求进行样式化(因为这个其他请求格式是专有的,检索整个地图 - 不是为瓷砖设计的 - 它似乎不支持WGS坐标) - 如何我应该这样做吗?
我试图:
我迷路了,如果你指出了正确的方向,我将不胜感激 - 如果它甚至可以在WMS中解决(对于这一层),我将不胜感激。
提前致谢。
答案 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()方法执行此操作。
以下是使用您的链接和我服务器上的上述包装器的工作示例:
这是生成的图像(半透明版):
recolor_png2.png http://www.digilog.de/pub/stackoverflow/recolor_png2.png
没有半透明输出的相同包装器(从代码中删除imagesavealpha):
由此产生的不透明图像:
recolor_png.png http://www.digilog.de/pub/stackoverflow/recolor_png.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
产生以下内容:
Mapserver中的注释颜色表示
RGB三元组必须在请求中按如下方式编写:
R G B
(请注意,空白是必需的)。 其编码表示的是:
R%20G%20B
因为%20 是网址中空间的编码方式。