javascript - 如何通过 javascript 将 SLD 样式动态添加到 WMS 层

标签 javascript openlayers geoserver

使用 OPENLAYERS + GEOSERVER + JAVASCRIPT + SERVLET + AJAX

我有一个 servlet,它接收 ajax 调用并返回所有国家/地区的人口。我想以这样的方式添加 SLD,即 WMS 图层将为人口少于 50,000 的国家显示红色,为人口大于 50,000 的国家显示绿色。所以最终我想根据我从 ajax 调用获得的结果在 javascript 中为 WMS 层设计 SLD 样式。是否可以在 javascript 中应用 SLD ..?如果是这样,请提供示例代码。感谢您的耐心等待。

最佳答案

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

首先在你的js代码中定义SLD

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 ,这是一个非常适合此类内容的网站。不要忘记根据您的数据(图层名称、数据属性等)更改 SLD。在食谱中,您还可以看到数据应该是什么样子。

定义 SLD 后,您可以使用它简单地创建一个新的 WMS 层:

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

最后将其添加到 map 中:

map.addLayer(newWmsLayer);

当然,如果这应该更新现有层,您应该先删除旧层。

关于javascript - 如何通过 javascript 将 SLD 样式动态添加到 WMS 层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14187187/

相关文章:

javascript - 无论以前用于绑定(bind)它的库如何覆盖 JavaScript 中的事件?

javascript - 在 OpenLayers 4 中的两个坐标之间画一条线

ubuntu - Geoserver Proxy Base URL 不用于图层预览

javascript - 在 Vue.js 中使用 v-model 进行双向绑定(bind)

javascript - 如何检测是否在 Google Maps API 自动完成列表中选择了项目?

javascript - getBoundingClientRect().width 没有返回正确的宽度

class - 使用 openlayers 和 typescript 类

javascript - Openlayers 3 geojson 与矢量源

Angular4 添加 WMS (openlayers)

javax.imageio.IIOException : Can't create an ImageInputStream in Tomcat 9, OpenJDK 11 和 Geoserver