2015-01-11 3 views
1

내 웹 응용 프로그램이 잘 작동하고 예상대로 Geoserver 2.6.0을 통해 PostGIS와에서 OpenLayers지도,에 WMS 층을 제공에서 자바 스크립트와 WMS 층. 사용자는 HTML의 드롭 다운 상자를 통해 속성에 따라 WMS 계층의 특정 요소를 필터링하고 예상대로 레이어를 업데이트 할 수 있습니다. 추가 드롭 다운 상자 값에 따라 WMS 계층의 스타일을 변경하는 추가 드롭 다운 상자를 추가하고 싶습니다. 추가 드롭 다운의 스타일 옵션은 'normal'또는 'highlight'중 아주 간단합니다. 나는 자바 스크립트에서 단순한 'if else'문을 사용하면이 두 스타일 중 하나에서 레이어를 그릴 것이라고 생각했습니다. 그러나 불행하게도 사용자가 새 스타일을 선택하고 업데이트 버튼을 클릭하면 스타일이 업데이트되지 않으며이 날과 씨름하는 날이 지나면 완전히 멈추게됩니다.동적으로 스타일 Geoserver

스타일이 개별적으로 잘 작동 층 그들은 단지 이런 식으로 함께 작동하지 않습니다 (그들은 Gesoserver 인터페이스에서 확인)에 대한 SLD 구문은, 첫 번째 스타일은 남아있다.

나는이 두 가지가 유사한 게시물의 측면에서 발견 가장 가까운,하지만이 내 문제

https://gis.stackexchange.com/questions/64113/how-to-dynamically-change-sld-style-of-wms-layer-being-served-by-geoserver-from

http://osgeo-org.1560.x6.nabble.com/dynamic-SLD-with-openlayers-td3806595.html

모든 아이디어를 해결하지 않는 것? 미리 감사드립니다. 코드는 다음과 같습니다.

되는 HTML에 대한 코드 ..

<p>Country filter:</p> 
 
<select id="cql1"> 
 
    <option value="country LIKE 'england'">england</option> 
 
    <option value="country LIKE 'wales'">wales</option> 
 
</select> 
 

 
<p>Road type filter:</p> 
 
<select id="cql2"> 
 
    <option value="road LIKE 'a-road'">main road</option> 
 
    <option value="road LIKE 'b-road'">minor road</option> 
 
</select> 
 

 
<p>Status filter:</p> 
 
<select id="cql3"> 
 
    <option value="status LIKE 'in use'">in use</option> 
 
    <option value="status LIKE 'under construction'">under construction</option> 
 
</select> 
 

 
<p>Line style:</p> 
 
<select id="line_style"> 
 
    <option value="normal">Normal</option> 
 
    <option value="highlight">Highlight</option> 
 
</select> 
 

 
<input type="submit" value="update" onclick="updateFilter(this);">

자바 스크립트 코드 ...

var roads; 
 

 
// function that updates the WMS layer following user selection 
 
function updateFilter() { 
 
    var cql1 = document.getElementById("cql1"); 
 
    var cql2 = document.getElementById("cql2"); 
 
    var cql3 = document.getElementById("cql3"); 
 
    var line_style = document.getElementById("line_style"); 
 
    var format = new OpenLayers.Format.CQL(); 
 
    if (roads.params.CQL_FILTER) { 
 
    delete roads.params.CQL_FILTER; 
 
    } 
 
    var filter1; 
 
    var filter2; 
 
    var filter3; 
 

 
    try { 
 
    filter1 = format.read(cql1.value); 
 
    filter2 = format.read(cql2.value); 
 
    filter3 = format.read(cql3.value); 
 

 
    } catch (err) { 
 
    if ((cql1.value != "") || (cql2.value != "") || (cql3.value != "") || (line_style.value != "")) { //if cannot read one of the values 
 
     alert("One of the filters cannot be processed"); 
 
    } 
 
    } 
 
    if ((filter1) || (filter2) || (filter3) & (line_style.value = 'normal')) { 
 
    layer.clearGrid(); // This gets rid of the previous WMS display... 
 
    layer.mergeNewParams({ 
 
     'STYLES': "layer_normal", 
 
     'CQL_FILTER': cql1.value + " AND " + cql2.value + " AND " + cql3.value 
 
    }) 
 
    } else { 
 
    layer.clearGrid(); // This gets rid of the previous WMS display... 
 
    layer.mergeNewParams({ 
 
     'STYLES': "layer_highlight", 
 
     'CQL_FILTER': cql1.value + " AND " + cql2.value + " AND " + cql3.value 
 
    }) 
 
    } 
 
    layer.redraw({ 
 
    force: true 
 
    }); 
 
    return false; 
 
} 
 

 
// Details of the WMS layer itself 
 
roads = new OpenLayers.Layer.WMS(
 
    "Filter Selection", 
 
    "http://www.example.com/geoserver/roads/wms", { 
 
    LAYERS: 'data:roads', 
 
    format: 'image/png', 
 
    srs: 'ESPG:3857', 
 
    transparent: true 
 
    }, { 
 
    transitionEffect: null, 
 
    buffer: 1, 
 
    visibility: true, 
 
    isBaseLayer: false 
 
    } 
 
);

답변

0

나는 결국 그것을 해결하기 위해 관리 - 나는 'if'문으로 문제가되는 것은 단순화해야한다는 점에서 그렇습니다. 다음으로는 관련 (작업) 자바 스크립트 ...

\t if (line_style.value == "normal") { 
 
    layer.clearGrid(); // This gets rid of the previous WMS display... 
 
    layer.mergeNewParams({ 
 
         'STYLES': "layer_normal", 
 
         'CQL_FILTER':cql1.value+" AND "+cql2.value+" AND "+cql3.value+" AND "+cql4.value 
 
         }) 
 
} 
 
else { 
 
    layer.clearGrid(); // This gets rid of the previous WMS display... 
 
    layer.mergeNewParams({ 
 
         'STYLES': "layer_highlight", 
 
         'CQL_FILTER':cql1.value+" AND "+cql2.value+" AND "+cql3.value+" AND "+cql4.value 
 
         }) 
 
    } 
 
layer.redraw({force:true});