wms根据sld,sld_body请求地图

一 正常加载wms

var wmsLayer=new ol.layer.Tile({
        source: new ol.source.TileWMS({
            url: 'http://192.168.0.103:8090/geoserver/nkstarTax/wms',
            params: {'FORMAT': 'image/png',
                'VERSION': '1.1.1',
                tiled: true,
                LAYERS: 'nkstarTax:jgnsr',
                style:''

            }
        })
    });

点图层默认的geoserver中样式是红色的。

二 根据sld_body加载

function get_sld(layername){
var sld='<?xml version="1.0" encoding="UTF-8"?>'+
'<sld:StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:sld="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" version="1.0.0">'+
        '<sld:UserLayer>'+
   '<sld:LayerFeatureConstraints>'+
    '<sld:FeatureTypeConstraint/>'+
    '</sld:LayerFeatureConstraints>'+
    '<sld:Name>'+layername+'</sld:Name>'+ //举个例子而已,可以对sld中变量通过参数注入的形式修改,即动态的sld
    '<sld:UserStyle>'+
    '<sld:Title/>'+
    '<sld:FeatureTypeStyle>'+
    '<sld:Name>group 0</sld:Name>'+
    '<sld:FeatureTypeName>Feature</sld:FeatureTypeName>'+
    '<sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>'+
    '<sld:SemanticTypeIdentifier>simple</sld:SemanticTypeIdentifier>'+
    '<sld:Rule>'+
    '<sld:Name>default rule</sld:Name>'+
    '<sld:PointSymbolizer>'+
    '<sld:Graphic>'+
    '<sld:Mark>'+
    '<sld:WellKnownName>circle</sld:WellKnownName>'+
    '<sld:Fill>'+
    '<sld:CssParameter name="fill">#FFFFFF</sld:CssParameter>'+
    '<sld:CssParameter name="fill-opacity">0.4</sld:CssParameter>'+
    '</sld:Fill>'+
    '<sld:Stroke>'+
    '<sld:CssParameter name="stroke">#0080FF</sld:CssParameter>'+
    '<sld:CssParameter name="stroke-width">1.2</sld:CssParameter>'+
    '</sld:Stroke>'+
    '</sld:Mark>'+
    '<sld:Size>5</sld:Size>'+
    '</sld:Graphic>'+
    '</sld:PointSymbolizer>'+
   '</sld:Rule>'+
    '</sld:FeatureTypeStyle>'+
    '</sld:UserStyle>'+
    '</sld:UserLayer>'+
    '</sld:StyledLayerDescriptor>';
return sld;
}

wmsLayer=new ol.layer.Tile({
    source: new ol.source.TileWMS({
        url: 'http://192.168.0.103:8090/geoserver/nkstarTax/wms',
        params: {'FORMAT': 'image/png',
            'VERSION': '1.1.1',
            tiled: true,
            sld_body:get_sld('nkstarTax:v_wggl_jgnsr')
        }
    })
});
注意:sld_body,sld请求时,与 layer,style参数不能共用,在提交sld_body时,已经没有wms的layer,style参数了,细心朋友发现,get_sld()方法里,<name></name>中绑定了图层名称了。
效果如下;

三 根据sld加载

3.1 在geoserver中发布一个sld,发布成功后,通过url,sld是可以访问的,如下图:
注意:发布的 sld的<name>标签已经绑定了图层名称了。
 wmsLayer=new ol.layer.Tile({
        source: new ol.source.TileWMS({
            url: 'http://192.168.0.103:8090/geoserver/nkstarTax/wms',
            params: {'FORMAT': 'image/png',
                'VERSION': '1.1.1',
                tiled: true,
                sld:'http://192.168.0.103:8090/geoserver/styles/jgnsr.sld'
            }
        })
    });

注意:同样是有sld地址,没有layer和style参数。

效果如下:

四 三种方式请求对比

正常wms的getMap请求,传入layer和style,如果要设置好样式sld文件,就要在geoserver上把发布的图层绑定这个sld。如果在某些情况下,希望同样的数据图层在不同情况下显示两套样式,只能把数据发布两遍,分别绑定一个sld。  结论:只适合底图,不适合变化图层,因为比较死板冗余。

sld_body:可以在前台以字符串形式拼写sld,具有极大的灵活性。举个例子,我某个数据有一月,二月,三月利润金额字段,现在需要点击a按钮显示一月专题图,点击b按钮显示二月专题图等。非常灵活。数据就一套,前台根据业务不同,提交不同的sld_body即可。  缺点,前台拼写基于js的限制,容易拼写错误,且新手不好找错哪了。最好生成一个正常的,在js上变字符,参数空出来,不要自己写。
sld:同样一套数据只发布一遍,只需要多发布几个sld文件,根据业务绑定这个sld文件即可。灵活性比sld_body稍微差点,但是xml的格式非常清晰,在geoserver发布,可以让服务器检查,预览,不太出错。

转载自:https://blog.csdn.net/freeland1/article/details/49447405

You may also like...