最初の質問への回答はYesです。かなり一般的な構成でOLを使用しています。パフォーマンスを改善するために使用できるトリックがあります。これについては後で説明します。
質問2への回答は多分(特に堅牢性に関して)です。このサイトで代替のリストを検索できます(現時点で思い浮かぶのはLeafletです)。
質問3への回答:測定から始めます:
アプリのローカルコピーを編集して、レンダーがベクターレイヤーのオプションリストで明示的に指定されるようにしました。テスト中、Canvasレンダラーを省略してから、別のページで実験をリロードします。
var pts = new OpenLayers.Layer.Vector("Points", {renderers: ["Canvas", "SVG", "VML"]});
それが過ごしたどのくらいの時間出力しているので、私は、再描画機能にタイマーを追加描画します:
function redraw() {
var start = (new Date).getTime();
[...]
var diff = (new Date).getTime() - start;
console.log("redraw completed in "+diff+"ms");
その後、OSX SLでChrome 17とFirefox 8.0.1の両方で、1000および5000の機能を使用していくつかの実行を試みました。驚いたことに、SVGレンダラーはCanvasレンダラーよりも平均で20%高速です!(注:Windowsでは、jsの時間はOSXほど正確ではないため、結果の一貫性が低下する可能性があります)。
これとあなたの言うこと
問題はマップの相互作用です
、私見では、ホットスポットがベクターの機能の処理にあることを教えてくれます。私のアプリで作業しているときに、最近それを見て、サブクラス化して、単純な点には役に立たない複雑なコードをすべて取り除くことにしました。確かに私はかなり乱暴になり、OpenLayers.Geometry.Pointへの依存関係を削除し、私のバージョンはx、y属性を持つ単純なjsオブジェクトで動作するようになりました。
あなたのオプションは、利益/費用の降順です:
最初のオプションは、次のようにベクトルレイヤーに戦略オプションを設定することにより、サーバー側の可視ポイントをフィルタリングすることです。
strategies: [new OpenLayers.Strategy.Refresh({force:true}), new OpenLayers.Strategy.BBOX({ratio:2, resFactor: 3})],
この方法では、クライアント側に描画される機能の数を拡大すると、すべてではなく、その範囲で表示される機能に制限されます。
2番目のオプションとして、カスタマイズされたVector / Rendererの作成を検討できます。カスタムの、短縮された、より高速な実装の例は、こちらの githubページで入手できます。すべての用途に適しているわけではありませんが、私が提案していることを大まかに理解するには十分でしょう。
ユーザーが完全にズームアウトするときの3番目のオプションは、ある種のサーバー側のクラスタリング機能を実装して、近いポイントが単一のポイントにマージされ、描画される機能の数を減らすことです。