ランダムに複数のGLatLngオブジェクトを格納した配列pointsがあります。
その配列ををそのまま、new GPolygon(points)でポリゴン作成しても、
位置がランダムなため順番にならばず、きれいなポリゴンになりません。
そこで、以下のような配列の拡張処理を作り、一応思惑どおりになったのですが、もっと、楽な方法があるような気がします。
思いついた方法は、「まず配列データから中心点の座標を求め、中心点を
基点に各店をNE、SE、SW、NWの4つの象限の配列に分類格納しなお
し、それぞれを東側は緯度の昇順、西側は緯度の降順にソートしたうえで
再び、NE、SE、SW、NWの順でコンカチして、新しい配列に格納する。」
といった手法です。
(南半球、西半球にも対応させるため90と180を先に足して、後で引いてます)
何か、お気づきの点やアドバイスがありましたらよろしくお願いします。
(配列の拡張処理)
Array.prototype.polygonsort=function(){
var wrk=[];var ne=[];var se=[];var sw=[];var nw=[];var result=[];
var sum={"lat":0,"lng":0};var ave={"lat":0,"lng":0};
for(var i=0;i<this.length;i++){wrk.push({"lat":this[i].lat()
+90,"lng":this[i].lng()+180});}
for(var i=0;i<this.length;i++){sum.lat=sum.lat
+wrk[i].lat;sum.lng=sum.lng+wrk[i].lng;}
ave.lat=sum.lat/this.length;ave.lng=sum.lng/this.length;
for(var i=0;i<this.length;i++){
if(wrk[i].lat>ave.lat){
if(wrk[i].lng>ave.lng){ne.push(wrk[i]);}else{nw.push(wrk[i]);}
}else{
if(wrk[i].lng>ave.lng){se.push(wrk[i]);}else{sw.push(wrk[i]);}
}
}
ne.sort(function(a,b){return(b.lat - a.lat)});
se.sort(function(a,b){return(b.lat - a.lat)});
sw.sort(function(a,b){return(a.lat - b.lat)});
nw.sort(function(a,b){return(a.lat - b.lat)});
var all=ne.concat(se,sw,nw);
for(var i=0;i<all.length;i++){result.push(new
GLatLng(all[i].lat-90,all[i].lng-180));}
result.push(result[0]);
result.center=new GLatLng(ave.lat-90,ave.lng-180);
return result;
}
↓のように実装
var map;
function load(){
if (GBrowserIsCompatible()) {
map = new GMap2(document.getElementById("map"),{size:new
GSize(800,600)});
map.setCenter(new GLatLng(35.6851,139.6644), 11);
map.addControl(new GLargeMapControl());
// AddMarker();
}
}
function AddMarker(){
var points=[];
var data=[{"lng":139.6138,"lat":35.6907},{"lng":139.9193,"lat":
35.7251},
{"lng":139.8183,"lat":35.7021},{"lng":139.5104,"lat":
35.7147},
{"lng":139.9223,"lat":35.5805},{"lng":139.4064,"lat":
35.7896}];
for (var i = 0; i < data.length; i++) {
var marker= new GMarker(new GLatLng(data[i].lat,data[i].lng));
points.push(marker.getLatLng());
map.addOverlay(marker);
}
var polygonpoints=points.polygonsort();
var polygon =new GPolygon(polygonpoints);
map.addOverlay(polygon);
map.panTo(polygonpoints.center);
var polygonBounds = polygon.getBounds();
map.setZoom(map.getBoundsZoomLevel(polygonBounds));
}
--
このメールは Google グループのグループ「Google-Maps-API-Japan」の登録者に送られています。
このグループに投稿するには、
google-map...@googlegroups.com にメールを送信してください。
このグループから退会するには、
google-maps-api-...@googlegroups.com にメールを送信してください。
詳細については、
http://groups.google.com/group/google-maps-api-japan?hl=ja からこのグループにアクセスしてください。