マップ自体の外側のチェックボックスに基づいて、マップ内の特定のマーカーを非表示にするコードをいくつか作成しました。ただし、これらのマーカーにもベクトルフィーチャがあります(実際には別々のレイヤーにあります)が、フィーチャを破棄するのではなく、非表示にしたいだけです。 display(false)を使用しようとしましたが、エラーが発生します。ベクトルを隠す機能はありますか?
OpenLayers.Feature.Vector
インスタンスのstyle
プロパティを変更します。 display
属性をnone
に設定するか、visibility
属性をhidden
に設定します。その後、レイヤーを再描画します。
OpenLayers コードのコメントによると:
display-{String} displayが「none」に設定されている場合、シンボライザーは効果がありません。他のすべての値は効果がありません。
layer
と呼ばれる特定のOpenLayersレイヤー変数について、次のようにすべての機能を非表示にすることができます。
var features = layer.features;
for( var i = 0; i < features.length; i++ ) {
features[i].style = { visibility: 'hidden' };
}
layer.redraw();
これにより、レイヤー内のすべての機能が繰り返され、非表示にする特定の機能を完全に制御できます。
私はOpenLayersと何度か格闘し、同じレイヤー内の機能を希望どおりに表示しようと試みました。 @igortiのソリューションは、機能のすべてのスタイルプロパティをオーバーライドするため、後で機能を再表示する理由がない限り、このアプローチはお勧めしません(この場合、removeFeatures()
メソッドがおそらくより良い方法です。とにかくこれを行うために)。
これを行う方法は、フィーチャのスタイル表示を手動でnone
に設定してから、レイヤーを再描画することです。機能を再度表示する必要がある場合は、displayプロパティをblock
に設定します。ものすごく単純:
function hideFeatures() {
var features = layer.features;
for (var i = 0; i < features.length; i++) {
var feature = features[i];
if (!isVisible(feature)) {
feature.style.display = 'none';
}
}
layer.redraw();
}
隠された機能を再表示することは、状況によっては少し注意が必要です。いくつかの可能性については、 スタイリングに関するOpenLayersのドキュメント をご覧ください。ただし、通常、機能を再度表示する必要がある場合は、機能のスタイル属性をnull
に設定します。これにより、OpenLayersレンダラーがdrawFeature
関数を実行するときに、レイヤーのstyleMapから事前構成されたスタイルが再描画されます。
// from OpenLayers drawFeature()
if (!style) {
style = this.styleMap.createSymbolizer(feature, renderIntent);
}
したがって、表示関数は次のようになります。
function displayFeatures() {
var features = layer.features;
for (var i = 0; i < features.length; i++) {
var feature = features[i];
if (isVisible(feature)) {
feature.style = null; //redraw the feature
}
}
layer.redraw();
}
これを行うには、他にもいくつかのアプローチがあります。次のように、機能のfillOpacityとstrokeOpacityを0に設定できます。
function displayFeatures() {
var features = layer.features;
for (var i = 0; i < features.length; i++) {
var feature = features[i];
if (isVisible(feature)) {
feature.style.fillOpacity = 1;
feature.style.strokeOpacity = 1;
}
else {
feature.style.fillOpacity = 0;
feature.style.strokeOpacity = 0;
}
}
layer.redraw();
}
このアプローチの欠点は、アクティブなマップコントロールが引き続き「非表示」機能と対話できるため、ユーザーが誤って機能をクリックまたはホバーした場合でも、これらのイベントが発生することです。
上記の2つの方法のいずれかを使用して、レイヤーのstyleMap内にhiddenと呼ばれるスタイルを作成することもできます。次に、機能を非表示にするには、機能のrenderIntentをhidden
に変更するだけです。
最後に、機能のサブセットを別々のレイヤーに追加し、レイヤーのsetVisibility
メソッドをfalseに呼び出すことができます。これは、マップの最上位レイヤーのコントロールのみがアクティブになるため、すべての機能を同時に操作する必要がない場合にのみ適したオプションです。 (使用する方法はいくつかあります 複数のレイヤーのコントロール ですが、ジャグリングがさらに多く含まれるため、絶対に必要な場合を除いて、お勧めしません)
機能を非表示にするには
for( var i = 0; i < features.length; i++ ) {
features[i].style = { display: 'none' };
}
layer.redraw();
非表示の機能を表示するには
for( var i = 0; i < features.length; i++ ) {
features[i].style = null;
}
layer.redraw();
1つの機能を非表示にするには
var feature = vectorlayer.getFeatureByFid(fid);
feature.style = { display: 'none' };
vectorLayer.removeFeatures(feature);
vectorLayer.addFeatures(feature);
Styleプロパティでdisplay: 'none'を設定できます。機能が表示されないように
すでに試したかどうかは質問からは明らかではありませんでしたが、試したことがない場合は、setVisibility()メソッドを試すことができます。
同じニーズがありましたが、各機能を個別に非表示にしたり、CSSスタイルで遊んだりしたくなかったので、この問題に対して最終的に行ったことは次のとおりです。
私はあなたがどこかに次のようなものを持っていると仮定します:
myVector = new OpenLayers.Layer.Vector(...
次に、このコードをボタンまたは必要なイベントにリンクします。
if( myVector.getVisibility() && myVector.features.length > 0 ) {
myVector.setVisibility(false);
} else {
myVector.setVisibility(true);
}
getVisibility()/ setVisibility()参照はベクター部分にありませんが、レイヤードキュメントにあります。