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