2

ベクターレイヤーで使用しようとしているハッシュテーブルがあるので、これが私が作ったものです:

var make = [], remove = [];
for (var key in data) {
  var val = data[key];
  if (featureCache[key]) {
    if (val._ts > featureCache[key]._ts) {
      var geom = featureCache[key].getGeometry();

問題はここから始まります。これまでにわかったことから、次の 2 つのオプションがあります。

      geom.setCoordinates(latlng([val.Latitude, val.Longitude]));
      geom.flatCoordinates = latlng([val.Latitude, val.Longitude]);

ただし、最初のものはバブルアップしてマップをレンダリングします。1500 を超える機能があり、さらに使用する予定があるため、これは問題です。2行目でアサーションが失敗したことがわかり、デバッグ方法がわかりません。

      featureCache[key]._ts = val._ts;
    }
  } else {
    make.push(featureCache[key] =
      new ol.Feature({
        geometry: new ol.geom.Point(latlng([val.Latitude,val.Longitude]))
      })
    );
    featureCache[key]._ts = val._ts;
  }
}
source.addFeatures(make);

データをできるだけリアルタイムにしたいので、これは1秒おきに実行する必要があります。

そして、これが本当にばかげた方法である場合は、それも知りたいです。

4

1 に答える 1

2

新しい API でどのようにできるかわかりませんが、これを試すことができます。

  1. 古いジオメトリを複製して更新し、それぞれに対してこれを行います
  2. OLが認識していないコレクションにクローンを追加します(マップのレンダリング/更新を回避します)
  3. そのコレクションの準備ができたら、OL から古いコレクションを削除し、新しい (バッチ) を設定します。

数千のアイテムに対してこれを行うと、一度設定するだけなので、「最新の」ブラウザーではかなり高速に動作するはずです。重要な点は、各エントリを更新するときに更新をトリガーしないようにすることです。

バブリング/イベントを回避してバッチ更新を可能にする方法があるかもしれません (変更ごとにマップレンダリングをトリガーしません)。

于 2014-10-23T09:31:15.223 に答える