web-dev-qa-db-ja.com

OpenLayers:マップビューが完全にロードされていることを検出する方法は?

OpenLayers3を使用してマップエクスポート機能を実装しています。

ただし、問題が1つあります。それは、マップビューが完全に読み込まれているか、いくつかのタイルがまだ欠落しているかを判断できないことです。

そのようなAPIやイベントはないようです。最も近いのはtileloadstart-tileloadendペアです。ただし、OpenLayersはタイルを非同期でロードし、タイルが実際にロードされる前に、tileloadstartは起動されません。つまり、タイルキューにキューイングされているタイルは、実際にロードされる前にイベントを起動しません。

ホットマップビューが完全にロードされていることを検出できますか?

8
zeodtr

最終的には、エクスポート機能を正常に実装しました。以下は大まかな説明です。

  1. ol.source.on()を使用して_ol.source_ sにtileloadstarttileloadendtileloaderrorイベントハンドラーを登録し、タイルのロードカウントの管理を開始します。
  2. ol.Map.once()を使用して、postcomposeイベントハンドラーを_ol.Map_に登録します。
  3. ol.Map.renderSync()を呼び出します。これによりタイルの読み込みがトリガーされるため、タイルの読み込みがない場合は、すべてのタイルが読み込まれたことを意味します。
  4. postcomposeイベントハンドラーで、event.context.canvas.toDataURL()を使用して_event.context_からマップコンテンツをキャプチャし、event.frameState.postRenderFunctions.Push()を使用してpostrender関数を登録します(少しハッキー)。
  5. 登録されたポストレンダー関数で、タイルのロードカウントを確認します(これは_tileload*_イベントハンドラーで管理できます)。カウントがゼロでない場合は、キャプチャされたコンテンツを破棄します。それ以外の場合は、キャプチャが実行されます。
  6. tileloadendおよびtileloaderrorで、タイルのロードカウントがゼロになった場合は、上記の手順3から再試行してください。
4
zeodtr

postrenderイベントは、次のようにトリックを実行するようです。

map.once('postrender', function(event) {
    doyourmagic();
});

少なくともOpenLayers3.8.2からは機能します。良い答えがあります そこに 主題について。

5
BartBiczBoży

その間 、OpenLayersは 非常に求められているrendercompleteイベントを提供します。これは便利かもしれません。

2
Christallkeks

基本的に、すべてがマップ上にレンダリングされていることを確認するには、マップ上にある各レイヤーのロードエンドイベントをリッスンする必要があります。 wmsおよびwfsレイヤーの場合、これは明らかであり、その方法を知っていると思います。タイルレイヤーについては、この例を確認してください ここ

1
pavlos