GPolygon.fromEncoded() を利用して Google Maps のポリゴン表示を軽量化する
2007-08-22-1: [Google]
Google Maps では GPolygon を利用してポリゴン (多角形) を描画することができます。
しかし、GPolygon を使ったポリゴン描画には重大な欠点がありました。
それは、点の数を多くすると Opera や Safari では描画ができずに、ブラウザが固まってしまう場合があるというものです。
それを解決する手段かどうかはわかりませんが、Google Maps API v2.78 から GPolygon.fromEncoded() というメソッドが追加されて、あらかじめポリゴンのデータをエンコードしたデータを指定することができるようになりました。
- Official Google Maps API Blog: v2.78: Go ahead, Scroll your mouse wheels & encode your polygons!
http://googlemapsapi.blogspot.com/2007/04/v278-go-ahead-scroll-your-mouse- ...
そこで、サンプルを作って実際にテストしてみました。
以下サンプルでは、500 個の点 (座標値) を用いています。
また、サンプルで利用したデータは、An encoding utility for polyline and polygon data から拝借しています。
1. GPolygon.fromEncoded() を利用しない場合
http://pocari.org/demo/gpolygon/gpolygon.html
(こちらのサンプルは、Opera、Safari の場合、ブラウザが固まってしまう場合があるのでご注意ください)
こちらは配列に入っている座標を GPoint に追加して、最後に GPolygon で描画しています。
// 座標の配列 (実際は 500 個) を用意して
var mapPoints = [
[ -78.57945, 33.88215 ],
[ -78.65546, 33.94883 ],
[ -79.07426, 34.304726 ],
:
[ -78.65546, 33.94883 ],
[ -78.57945, 33.88215 ]
];
// GPoint の配列を作成して
var points = [];
for (var i = 0, len = mapPoints.length; i < len; ++i) {
points.push(new GPoint(mapPoints[i][0], mapPoints[i][1]));
}
// 描画する (map は GMap2 のオブジェクト)
map.addOverlay(new GPolygon(
points, // 座標値
'#3366cc', // 線の色
2, // 線の太さ
1.0, // 不透明度
'#e5ecf9', // 塗りつぶす色
0.5 // 塗りつぶす色の不透明度
));
前述のように Opera、Safari の場合、ブラウザが固まってしまう場合があります。
2. GPolygon.fromEncoded() を利用する場合
http://pocari.org/demo/gpolygon/gpolygon-fromencoded.html
こちらは、あらかじめエンコードした座標値を GPolygon.fromEncoded() で描画しています。
// エンコードされた座標値 (途中で省略)
var encodedPoints = 'mrxmEppr~Mw_LbzMi...';
// エンコードされたズームレベル値 (途中で省略)
var encodedLevels = 'PFFHHMGEHCMLEGLLJ...';
// 描画する (map は GMap2 のオブジェクト)
map.addOverlay(new GPolygon.fromEncoded({
polylines: [{
points: encodedPoints, // エンコードされた座標値
levels: encodedLevels, // エンコードされたズームレベル値
color: '#3366cc', // 線の色
opacity: 1.0, // 線の不透明度
weight: 2, // 線の太さ
numLevels: 18, // ズームレベルの分割数
zoomFactor: 2 // ?
}],
fill: true, // 領域を塗りつぶすかどうか
color: '#e5ecf9', // 塗りつぶす色
opacity: 0.5, // 塗りつぶす色の不透明度
outline: true // 線を表示するかどうか
}));
こちらを利用することで、Opera、Safari でもブラウザが固まることはなくなります。
さて、肝心の座標値をエンコードする方法ですが、アルゴリズムが公開されています。
- Google Maps API Documentation - Encoded Polyline Algorithm
http://www.google.com/apis/maps/documentation/polylinealgorithm.html
さらには、エンコードユーティリティもあります。
- Google Maps API Documentation - Polyline Encoding Utility
http://www.google.com/apis/maps/documentation/polylineutility.html
しかし、このユーティリティは使いづらいので、以下のサイトがお勧めです。
- An encoding utility for polyline and polygon data
http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/encodeForm.htm ...
とても便利な GPolygon.fromEncoded() ですが、zoomFactor といういまいちよくわからないパラメータが出てきます。
とりあえず、適当に 2 とかしていますが、これが妥当かどうかはわかりません (期待通りに描画はされてはいます)。
このあたりの参考になる 2 つのエントリを紹介しておきます (GPolygon ではなくて GPolyline ですが参考になります)。
- GPolyline.fromEncoded (hPod)
http://hwat.sakura.ne.jp/hpod/200609/14-200000/
- Encoded Polyline (hPod)
http://hwat.sakura.ne.jp/hpod/200610/17-200000/
なにはともあれ、GPolygon.fromEncoded() で Opera や Safari でも問題なくポリゴンが描画できるようになりますので、同様の問題を抱えている方は試してみてはいかがでしょうか。