2012-03-19 4 views
3

필요한 것은 데이터를 다시 다운로드하지 않고 벡터 레이어 표현을 수정하는 것입니다. GLM 벡터 레이어와 build_style이라는 함수를 정의하여 일부 지형지 물에 따라 지오메트리의 색상을 채색했습니다. GLM 층이 이런 식으로 정의된다openlayers : 데이터를 다시 다운로드하지 않고 벡터 레이어 다시 그리기

function UpdateGlmLayer(info_str) { 
    var v = info_str.split("|"); 
    var filter_column = v[0]; 
    var values = [parseFloat(v[1]), parseFloat(v[2]), parseFloat(v[3])]; 
    glm.styleMap = build_style(filter_column, values); 
    glm.redraw(); 
}; 

:

gml_protocol = new OpenLayers.Protocol.HTTP({ 
    url: "http://localhost:8080/geoserver/ows?service=WFS&version=1.0.0&request=GetFeature&typeName="+info["layer_featurePrefix"]+":"+info["layer_featureType"], 
    format: new OpenLayers.Format.GML() 
}) 

glm = new OpenLayers.Layer.Vector(info["layer_name"], { 
    strategies: [new OpenLayers.Strategy.BBOX({ratio: 3, resFactor: 1})], 
    protocol: gml_protocol, 
    styleMap: build_style(info["filter_property"], info["filter_values"]), 
    srsName: info["layer_srsName"], 
    projection: new OpenLayers.Projection("EPSG:4326"), 
    visibility: true 
}); 

UpdateGlmLayer은 색상이 즉시 변경하는 것 트리거 나는이 방식으로 정의되는 함수의 UpdateGlmLayer를 호출하는 HTML 양식이 그 후 시스템은 초기 페이지로드시 데이터를 다운로드하는 데 걸리는 시간과 거의 동시에 멈 춥니 다. 이 시간 동안 아무 것도 할 수 없습니다. 뭔가 잘못 됐니?

+0

당신은 당신의 build_style 기능을 공유 할 수 있을까요? – drnextgis

+0

사용중인 OpenLayers의 릴리스는 무엇입니까? Fiddler/FireBug 네트 도구를 사용하여 레이어가 실제로 서버에서 두 번째로 요청되고 있는지 확인할 수 있습니까? – AlexC

+0

작전 ... 당신의 용서를 구합니다 ... 나는 UpdateGlmLayer 함수에서 한 줄을 잊어 버렸습니다 ... 지금은 맞습니다. glm.redraw()를 추가했습니다. 끝에 ... – manuele

답변

5

문제는 resFactor를 설정 한 경우입니다. GeoServer GML 벡터를 로딩 한 다음 resFactor 1 설정없이 resylactor 설정을 변경하고 resFactor 1 설정을 사용하여 재구성하는 두 개의 데모 맵을 만들었습니다. 두 번째 데모는 확실히 여러 요청을 전송합니다. resfactor를 1 이상으로 설정하면 이런 현상이 일어나지 않습니다.

3 Restyle Clicks, 1 data request

만 1 데이터 요청 :

3 배의 스타일을 다시 클릭 + NO resFactor 설정은이 결과를 제공합니다. 3 Restyle Clicks, 4 data requests

4 데이터 요청 :

그러나, 3 + 클릭의 모양과 3 번 resFactor 설정은이 결과를 제공합니다.

나는 이것이 당신이보고있는 행동이라고 생각합니다. 설명서가 당신이 한 일이 유효하다고 말하면서 나에게 버그처럼 보입니다. BBOX 전략의 js 파일의 코드를 보면 문제는 코드 것 같다 : 이것은 데이터를 다시로드해야하는지 여부를 계산하기 위해 .redraw() 함수에서 실행중인

var ratio = this.resolution/this.layer.map.getResolution(); 
invalid = (ratio >= this.resFactor || ratio <= (1/this.resFactor)); 

. 비율을 변경하면 맵을 다시 그릴 때 비율이 항상 1로 설정되기 때문에 (해상도가 변경되지 않았으므로 this.layer.map.getResolution()) invalid는 항상 true와 같아 지므로 레이어가 다시로드됩니다 .

resFactor 이전 기능이 유효 요청이있을 경우 결정하는 데 사용

{플로트} 선택적 요소. 설정하면 resFactor는 현재지도 해상도에 대한 이전 요청의 해상도와 비교됩니다. resFactor> (이전/신규) 및 1/resFactor < (이전/신규) 인 경우 resFactor를 1로 설정하면 해상도가 변경 될 때마다 데이터가 요청됩니다. resFactor를 3으로 설정하면 이전 해상도가 새 해상도의 3 배이거나 새 이미지의 3 배가 오래된 경우 데이터가 요청됩니다. 이전 경계에 새 경계가없는 경우 새 데이터는 항상 (resFactor 고려 여부에 관계없이) 요청됩니다.

나는 다음과 같은 방식으로 restyles을하고있는 중이 야 :

var style1, style2; 


style1 = new OpenLayers.Style({ 
       strokeColor: "yellow", 
       strokeWidth: 10 }); 


style2 = new OpenLayers.Style({ 
       strokeColor: "blue", 
       strokeWidth: 5 }); 

function restyle1() 
{ 
    layer.styleMap = style1; 
    layer.redraw(); 

} 

function restyle2() 
{ 
    layer.styleMap = style2; 
    layer.redraw(); 

} 
+0

위대한! resFactor가 내 문제를 해결하지 못했습니다. 정말 대단히 고마워! – manuele

+0

@manuele : 답글을 upvoting하고 체크 표시를 클릭하여 질문에 대한 답변으로 수락하면 크레딧을 제공하십시오. – capdragon

+0

@capdragon : done! :) – manuele