2016-10-29 18 views
1

Openlayers 2からol3へのマップアプリケーションを移行しており、エクステントが変更されたときにサーバーにリクエストを送信しました。私はリフレッシュ戦略(force:true)を使用し、サーバーはカスタムフォーマットを使用して処理するオブジェクトの配列を返します。Openlayers 2のBBOX戦略からOpenlayersへ3

var refreshStrategy = new OpenLayers.Strategy.Refresh({ 
    force: true 
}); 

OpenLayers.Format.GTFS = OpenLayers.Class(OpenLayers.Format, { 
    read: function(body) { 
    var stops = JSON.parse(body), point, features = []; 

    for(var i=0,l=stops.length; i<l; i++) { 
     point = new OpenLayers.Geometry.Point(stops[i].stop_lon, stops[i].stop_lat); 
     features.push(new OpenLayers.Feature.Vector(point, stops[i])); 
    } 
    return features; 
    } 
}); 

var layer = new OpenLayers.Layer.Vector('Stops', { 
    projection: new OpenLayers.Projection('EPSG:4326'), 
    visibility: true, 
    strategies: [ 
    new OpenLayers.Strategy.BBOX({resFactor: 1.2}), 
    refreshStrategy 
    ], 
    protocol: new OpenLayers.Protocol.HTTP({ 
    format: new OpenLayers.Format.GTFS(), 
    url: '/api/v1/stops.json' 
    }) 
}); 

refreshStrategy.activate(); 

ol.source.Vectorは、1つの戦略しかサポートしていません。私はBBOX戦略を使用してみましたが、機能のマーカーが点滅し、データがのを取得し、私は私が何か間違ったことをやっていると、リフレッシュが遅くなるように見えるような特徴のコレクションの

var stopFeatures = new ol.Collection(); 

var source = new ol.source.Vector({ 
    features: stopFeatures, 
    loader: function(extent, resolution, projection) { 
     extent = ol.extent.applyTransform(extent, ol.proj.getTransform("EPSG:3857", "EPSG:4326")); 
     var url = '/api/stops.json?bbox=' + extent.join(','); 
     $http.get(url).then(function (res) { 
      var features = _.map(res.data, function (stop) { 
       var stopFeature = new ol.Feature(stop); 
       stopFeature.setGeometry(new ol.geom.Point(ol.proj.transform([stop.stop_lon,stop.stop_lat], 
        'EPSG:4326', 'EPSG:3857'))); 
       return stopFeature; 
      }); 
      stopFeatures.clear(); 
      stopFeatures.extend(features); 
     }); 
    }, 
    projection: 'EPSG:4326', 
    strategy: ol.loadingstrategy.bbox, 
}); 

クリアとリセットが感じるパンたびに再読み込み。

map.on('moveend',...これをol3で実装する方法はありますか?

+0

実際、OpenLayers 3.xの 'ol.loadingstrategy.bbox'はOpenLayers 2の' OpenLayers.Strategy.BBOX'とまったく同じことをします。あなたはそれを "違ったモンスター"だと思いますか? – ahocevar

+0

@ahocevar私はコードを読み、あなたが意味することを理解します。あまり目立たないのは、ol2が後続のリクエストのデータをどのようにマージしていたのか、今はフィーチャコレクションを使用しなければならないということです。私は再挿入される可能性が高い機能をクリアしていますが、おそらくそれが遅くなる原因と思われます。これに注意を払ってくれてどうもありがとう、私はもっと多くの詳細を追加しました。 –

答えて

1

フィーチャーコレクションでclear()extend()を呼び出してはいけません。その代わりに、JSONの各機能の一意のIDのようなものを用意する必要があります。そうしないと、緯度と経度から作成されたハッシュを使用できます。 IDを取得したら、stopFeature.setId(id)を使用してIDを設定します。その後、source.addFeatures(features)に電話してください。この戦略では、フィーチャIDと既存のフィーチャのIDを内部的に比較し、ソースにないIDを持つフィーチャのみを挿入します。

+0

IDを設定するとより見栄えがよくなります。ポートの欠落部分は**リフレッシュ戦略**部分です。古いマップでは、サーバが限られた量を取得し、小さいbboxが新しいものを表示するので、ズームインするとリクエストがトリガされ、実際にはより多くの機能がロードされます。 ol3には単なる 'strategy'属性があり、ol2には配列引数があります。 –

関連する問題