2013-01-06 49 views
2

用的OpenLayers + GEOSERVER + JAVASCRIPT + SERVLET + AJAX如何动态地通过JavaScript SLD样式添加到WMS层

我有resceives AJAX调用和返回所有国家的人口的servlet。我想添加SLD的方式是,WMS图层对于人口少于50,000人的国家和对于人口超过50,000人的国家使用绿色显示红色。所以最终我想根据我从ajax调用中获得的结果为JavaScript中的WMS Layer设计SLD样式。是否可以在JavaScript中应用SLD ..?如果是这样,请提供示例代码。感谢耐心。

+0

您应该将此问题迁移到gis.stackexchange –

回答

4

我还没有尝试过自己,但这里是它如何工作的:

首先定义SLD在你的js代码

var sld = '<?xml version="1.0" encoding="ISO-8859-1"?>'; 
sld += '<StyledLayerDescriptor version="1.0.0"'; 
sld += ' xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" '; 
sld += ' xmlns="http://www.opengis.net/sld" '; 
sld += ' xmlns:ogc="http://www.opengis.net/ogc" '; 
sld += ' xmlns:xlink="http://www.w3.org/1999/xlink" '; 
sld += ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'; 
sld += ' <NamedLayer>'; 
sld += ' <Name>Attribute-based polygon</Name>'; 
sld += ' <UserStyle>'; 
sld += '  <Title>SLD Cook Book: Attribute-based polygon</Title>'; 
sld += '  <FeatureTypeStyle>'; 
sld += '  <Rule>'; 
sld += '   <Name>SmallPop</Name>'; 
sld += '   <Title>Less Than 200,000</Title>'; 
sld += '   <ogc:Filter>'; 
sld += '   <ogc:PropertyIsLessThan>'; 
sld += '    <ogc:PropertyName>pop</ogc:PropertyName>'; 
sld += '    <ogc:Literal>200000</ogc:Literal>'; 
sld += '   </ogc:PropertyIsLessThan>'; 
sld += '   </ogc:Filter>'; 
sld += '   <PolygonSymbolizer>'; 
sld += '   <Fill>'; 
sld += '    <CssParameter name="fill">#66FF66</CssParameter>'; 
sld += '   </Fill>'; 
sld += '   </PolygonSymbolizer>'; 
sld += '  </Rule>'; 
sld += '  <Rule>'; 
sld += '   <Name>MediumPop</Name>'; 
sld += '   <Title>200,000 to 500,000</Title>'; 
sld += '   <ogc:Filter>'; 
sld += '   <ogc:And>'; 
sld += '    <ogc:PropertyIsGreaterThanOrEqualTo>'; 
sld += '    <ogc:PropertyName>pop</ogc:PropertyName>'; 
sld += '    <ogc:Literal>200000</ogc:Literal>'; 
sld += '    </ogc:PropertyIsGreaterThanOrEqualTo>'; 
sld += '    <ogc:PropertyIsLessThan>'; 
sld += '    <ogc:PropertyName>pop</ogc:PropertyName>'; 
sld += '    <ogc:Literal>500000</ogc:Literal>'; 
sld += '    </ogc:PropertyIsLessThan>'; 
sld += '   </ogc:And>'; 
sld += '   </ogc:Filter>'; 
sld += '   <PolygonSymbolizer>'; 
sld += '   <Fill>'; 
sld += '    <CssParameter name="fill">#33CC33</CssParameter>'; 
sld += '   </Fill>'; 
sld += '   </PolygonSymbolizer>'; 
sld += '  </Rule>'; 
sld += '  <Rule>'; 
sld += '   <Name>LargePop</Name>'; 
sld += '   <Title>Greater Than 500,000</Title>'; 
sld += '   <ogc:Filter>'; 
sld += '   <ogc:PropertyIsGreaterThan>'; 
sld += '    <ogc:PropertyName>pop</ogc:PropertyName>'; 
sld += '    <ogc:Literal>500000</ogc:Literal>'; 
sld += '   </ogc:PropertyIsGreaterThan>'; 
sld += '   </ogc:Filter>'; 
sld += '   <PolygonSymbolizer>'; 
sld += '   <Fill>'; 
sld += '    <CssParameter name="fill">#009900</CssParameter>'; 
sld += '   </Fill>'; 
sld += '   </PolygonSymbolizer>'; 
sld += '  </Rule>'; 
sld += '  </FeatureTypeStyle>'; 
sld += ' </UserStyle>'; 
sld += ' </NamedLayer>'; 
sld += '</StyledLayerDescriptor>'; 

这是从the Geoserver SLD cookbook straigt拍摄,这是一个非常这种东西的好网站。不要忘记根据数据更改SLD(图层名称,数据属性等)。在食谱中,你也可以看到数据应该是什么样子。

当你有SLD定义,你可以用它简单地创建一个新的WMS层:

newWmsLayer = new OpenLayers.Layer.WMS.Post(layerName, wmsUrl, 
    { 
     layers: layerName, 
     sld_body: sld 
    }); 

,并最终将其添加到地图:

map.addLayer(newWmsLayer); 

当然,如果,这应该更新现有的图层应先移除旧图层。

+0

谢谢martin。有效。 – DileepKumar

+0

当然,有一个库可以比手动创建XML字符串更好地处理这个问题吗? –

相关问题