6

私のコードは GeoJSON のマーカーを表示しています。ズーム レベル 10 にズームすると、GeoJSON ファイルが読み込まれますが、同じマーカーを再出力しないようにするにはどうすればよいですか? 特定の場所にマーカーが既に存在するかどうかを確認する方法はありますか? コード

map.events.register("zoomend", null, function(){

      if(map.zoom == 10)
      {
        var bounds = map.getExtent();
        console.log(bounds);
        var ne = new OpenLayers.LonLat(bounds.right,bounds.top).transform(map.getProjectionObject(),wgs84);
        var sw = new OpenLayers.LonLat(bounds.left,bounds.bottom).transform(map.getProjectionObject(),wgs84);
        var vectorLayer = new OpenLayers.Layer.Vector();
        map.addLayer(vectorLayer);
        $.getJSON('ajax.php?a=markers&type=json&sw=('+sw.lon+','+sw.lat+')&ne=('+ne.lon+','+ne.lat+')',function(data){
        //$.getJSON('test.json',function(data){
            var geojson_format = new OpenLayers.Format.GeoJSON({
                'externalProjection': wgs84,
                'internalProjection': baseProjection
                });
            vectorLayer.addFeatures(geojson_format.read(data));
        });
        }
    });
4

2 に答える 2

4

BBOX Strategy[1]を使用しないのはなぜですか?

それはあなたが必要とすることを行い、確かにパフォーマンスが向上します(既存の機能を削除し、新しい機能を再ロードしますzoomend)。フィーチャを比較して新しく追加するには、多くの比較が必要であり、マップ上にフィーチャが多すぎる状態で終了する可能性があります。

サンプルの js ソースを確認してください。

HTH、

1 - http://openlayers.org/dev/examples/strategy-bbox.html

編集: より少ないコードを変更したい場合は、vectorLayer.removeAllFeatures()追加する前に を呼び出すと問題が解決します...機能を範囲外に保つ必要は本当にありますか?

于 2011-10-21T12:01:50.003 に答える
0

最初に、map.getLayersByName などを使用してマップからレイヤーを取得する必要があります。次に、layer.features を繰り返し処理して、追加する機能を探すことができます。

BBOX を使用するようにバックエンドを変更できる場合は、ズーム レベルと投影設定を使用した BBOX 戦略が多くのことを処理してくれます。

于 2011-10-22T21:39:01.780 に答える