2012-03-19 17 views
3

私に必要なのは、ベクターレイヤーの表現をデータを再度ダウンロードせずに変更する方法です。 私はGLMベクタ層とbuild_styleという関数を定義して、あるフィーチャに応じてジオメトリをカラー化しました。私はこのように定義された機能UpdateGlmLayerを呼び出すHTMLフォームを持っている: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(); 
}; 

GLM層は、このように定義されていますUpdateGlmLayerがトリガされると

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 
}); 

色はすぐに変更するように見えますその後、システムは、最初のページの読み込み時にデータをダウンロードするのとほぼ同じ時間停止します。この間は何もできません。何か間違っていますか?

+0

あなたbuild_style機能を共有してもらえますか? – drnextgis

+0

あなたはOpenLayersのどのリリースを使用していますか? Fiddler/FireBugネットツールを使用して、レイヤーが実際にサーバーから2回目に要求されていることを確認できますか? – AlexC

+0

ops ...私はあなたの恩赦を請う...私はUpdateGlmLayer関数で1行を忘れました...今は正しいです。 glm.redraw()を追加しました。最後に... – manuele

答えて

5

問題はあなたがresFactorを設定していることです。私は2つのデモ・マップを作成しました.1つはGeoServer GMLベクトルをロードし、resFactor 1設定なしで再フォーマットし、もう1つはresFactor 1設定で、もう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.resolution === 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

素晴らしい! NO resFactorは私の問題を解決しました。どうもうありがとう! – manuele

+0

@manuele:彼の答えをアップアップし、チェックマークをクリックしてあなたの質問に対する答えとしてそれを受け入れることで彼に信用を与える。 – capdragon

+0

@capdragon:done! :) – manuele

関連する問題