ホーム » GoogleMap

GoogleMap」カテゴリーアーカイブ

google map defualt poiのクリックを無視

参考

最近のバージョンではmapのoptionにclickableIconsがある

google map上にwmsレイヤを表示

OpenLayers向けに構築したシステムをgooglemapに置き換えたときにできるだけ使えるリソースは再利用したい。
今回はgeoserverで提供しているWMSレイヤ(タイルとシングルタイル)を表示する方法を調査。

タイル(256×256)の使い方

[code]
var mapOptions = {
center: new google.maps.LatLng(y, x),
zoom: scale,
mapTypeId: google.maps.MapTypeId.ROADMAP,
scaleControl: true,
scaleControlOptions: { position: google.maps.ControlPosition.BOTTOM_CENTER }
}
var map_canvas = new google.maps.Map(document.getElementById(id_map), mapOptions);

var SLPLayer = new google.maps.ImageMapType({
getTileUrl:
function (coord, zoom) {
var proj = map_canvas.getProjection();
var zfactor = Math.pow(2, zoom);
var ul = new google.maps.Point(coord.x * 256.0 / zfactor , (coord.y + 1) * 256.0 / zfactor );
var lr = new google.maps.Point((coord.x + 1) * 256.0 / zfactor , (coord.y) * 256.0 / zfactor );
var ulw = proj.fromPointToLatLng(ul);
var lrw = proj.fromPointToLatLng(lr);
var bbox = ulw.lng() + "," + ulw.lat() + "," + lrw.lng() + "," + lrw.lat();
var url = "http://maps4/geoserver/省略/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap";
url += "&TRANSPARENT=true"; //WMS operation
url += "&LAYERS=mesh3"; //WMS layers
url += "&FORMAT=image/png" ; //WMS format
url += "&TILED=false" ;
url += "&viewparams=on";
url += "&CRC=EPSG:4326"; //set WGS84
url += "&BBOX=" + bbox; // set bounding box
url += "&WIDTH=256"; //tile size in google
url += "&HEIGHT=256";
return url; // return URL for the tile
},
tileSize: new google.maps.Size(256, 256),
isPng: true
});
map_canvas.overlayMapTypes.push(SLPLayer);
[/code]

シングルタイルの使い方
google.maps.ImageMapTypeは引数で指定した「tileSize」のサイズに従って世界中をタイルに分割する
※下図参照
getTileUrlの引数coordにはタイルのXYのインデックスが渡ってくる。

よってmap_canvas.overlayMapTypesをシングルタイルに使おうとしてもどうしてもぴったりにはならない。
tileSizeを大きくしてもどうしても最大4つのタイルを使用してしますが、とりあえずその方法について記載。

[code]
var SLPLayer = new google.maps.ImageMapType({
getTileUrl:
function (coord, zoom) {

var zfactor = Math.pow(2, zoom);
var proj = map_canvas.getProjection();
var ul = new google.maps.Point(coord.x * 1536.0 / zfactor , (coord.y + 1) * 1024.0 / zfactor );
var lr = new google.maps.Point((coord.x + 1) * 1536.0 / zfactor , (coord.y) * 1024.0 / zfactor );

//var ne = map_canvas.getBounds().getNorthEast();
//var sw = map_canvas.getBounds().getSouthWest();
//var bbox = sw.lng() + "," + sw.lat() + "," + ne.lng() + "," + ne.lat();

var ulw = proj.fromPointToLatLng(ul);
var lrw = proj.fromPointToLatLng(lr);
var bbox = ulw.lng() + "," + ulw.lat() + "," + lrw.lng() + "," + lrw.lat();

//base WMS URL
var url = "http://maps4/geoserver/省略/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap";
url += "&TRANSPARENT=true"; //WMS operation
url += "&LAYERS=shop"; //WMS layers
url += "&FORMAT=image/png" ; //WMS format
url += "&CRC=EPSG:4326"; //set WGS84
url += "&BBOX=" + bbox; // set bounding box
url += "&WIDTH=1536"; //tile size in google
url += "&HEIGHT=1024";
return url; // return URL for the tile
},
tileSize: new google.maps.Size(1536, 1024),
isPng: true
});
map_canvas.overlayMapTypes.push(SLPLayer);
[/code]

もちろんふたつのレイヤを重ねることは可能

参考サイト

google map の距離計測機能についての再考

以前、googlemapとopenlayersの距離計測について投稿。

googlemap APIもV3になり距離計算のAPIも変更されたようなので弊社の距離計算ツールとgooglemapの距離計算機能の差についてあらためて再考。

西武池袋線の清瀬駅とひばりが丘駅の距離をベースに調査。

清瀬駅の座標
139.51989499999999111、35.77196299999999951

ひばりが丘駅の座標
139.54577000000000453、35.75142900000000168

※座標は国土数値情報より入手

googlemapの距離測定機能で測ると3.26kmと表示される。

clip_2

※googlemapの地図はAPIを介して表示しないと著作権的に問題があるのでぼやかして表示

地図上のポイントをクリックして距離計測を行なうので誤差の発生を考慮して、google map apiでも計測。

[code]
var from = new google.maps.LatLng( 35.77196299999999951,139.51989499999999111);
var to = new google.maps.LatLng( 35.75142900000000168,139.54577000000000453);
var distance = google.maps.geometry.spherical.computeDistanceBetween(from, to);
[/code]

clip3

やはりこちらも3269mと表示される。

弊社のの距離計測TOOLで計算すると3265mになる。

スクリーンショット 2016-08-10 11.36.09

[code]
コード,緯度,経度,名称,名称,コード,緯度,経度,名称,名称,距離,円半径
1,35.77196299999999951,139.51989499999999111,清瀬駅,清瀬駅,2,35.75142900000000168,139.54577000000000453,ひばりが丘,ひばりが丘,3265,10000
2,35.75142900000000168,139.54577000000000453,ひばりが丘,ひばりが丘,1,35.77196299999999951,139.51989499999999111,清瀬駅,清瀬駅,3265,10000
[/code]

その差は4m、約0.1%の差が発生する。

国土地理院の距離と方位角の計算でもやはり3269mとなる。

スクリーンショット 2016-08-10 12.30.05

google.maps.geometry.spherical.computeDistanceBetweenは3番目の引数に半径を渡すことができる。
つまり地球を楕円体ではなく球体として計算をしていることが分かる。
※デファルトでは半径を6378137mとしているようだ。

その為、誤差が発生している。