OpenLayers3を使用してマップエクスポート機能を実装しています。
ただし、問題が1つあります。それは、マップビューが完全に読み込まれているか、いくつかのタイルがまだ欠落しているかを判断できないことです。
そのようなAPIやイベントはないようです。最も近いのはtileloadstart-tileloadendペアです。ただし、OpenLayersはタイルを非同期でロードし、タイルが実際にロードされる前に、tileloadstartは起動されません。つまり、タイルキューにキューイングされているタイルは、実際にロードされる前にイベントを起動しません。
ホットマップビューが完全にロードされていることを検出できますか?
最終的には、エクスポート機能を正常に実装しました。以下は大まかな説明です。
ol.source.on()
を使用して_ol.source
_ sにtileloadstart
、tileloadend
、tileloaderror
イベントハンドラーを登録し、タイルのロードカウントの管理を開始します。ol.Map.once()
を使用して、postcompose
イベントハンドラーを_ol.Map
_に登録します。ol.Map.renderSync()
を呼び出します。これによりタイルの読み込みがトリガーされるため、タイルの読み込みがない場合は、すべてのタイルが読み込まれたことを意味します。postcompose
イベントハンドラーで、event.context.canvas.toDataURL()
を使用して_event.context
_からマップコンテンツをキャプチャし、event.frameState.postRenderFunctions.Push()
を使用してpostrender関数を登録します(少しハッキー)。tileload*
_イベントハンドラーで管理できます)。カウントがゼロでない場合は、キャプチャされたコンテンツを破棄します。それ以外の場合は、キャプチャが実行されます。tileloadend
およびtileloaderror
で、タイルのロードカウントがゼロになった場合は、上記の手順3から再試行してください。postrenderイベントは、次のようにトリックを実行するようです。
map.once('postrender', function(event) {
doyourmagic();
});
少なくともOpenLayers3.8.2からは機能します。良い答えがあります そこに 主題について。
その間 、OpenLayersは 非常に求められているrendercomplete
イベントを提供します。これは便利かもしれません。
基本的に、すべてがマップ上にレンダリングされていることを確認するには、マップ上にある各レイヤーのロードエンドイベントをリッスンする必要があります。 wmsおよびwfsレイヤーの場合、これは明らかであり、その方法を知っていると思います。タイルレイヤーについては、この例を確認してください ここ