原点を中心とした円の描画について

41 views
Skip to first unread message

YY

unread,
Apr 18, 2008, 5:52:55 AM4/18/08
to Google-Maps-API-Japan
緯度、経度を指定した原点から、地表面距離で等距離にある点の緯度と
経度を球面三角法で360度方位にわたって360個求め、その内の60個
を撰んでGpolylineで描画するスプリクトを作ってみました。
 距離がいかなる場合(1Km~4万Km)でも、かなり正確な閉じた曲線
(?)が描画されましたが、とっても遅いです。たかだか60個の点を結ぶ
線なのに描画に時間がかかります。
 高速化する方法が何かあるでしょうか?。もっと簡単に出来ないでしょう
か?目的は、ある点から等距離にある範囲を囲みたいだけです。
<ソース:GMap表示部分は省略>
function add_circleLine(){
var lat = 35.830509; /* 原点 */
var lng = 139.78852;
var distKm = 1; /* 距離(Km) */
var RadKm = 6378.137; /* 地球の半径(Km) */
var distRad = distKm / RadKm ;
var circlePoints = [];
function GetRad(deg){
var rad = ( deg * Math.PI ) / 180.0 ;
return rad;
}
function GetDeg(rad){
var deg = ( rad * 180.0 ) / Math.PI ;
return deg;
}
for (var i=0; i < 360; i++) {
var circlePoint =new GPoint();
circlePoint.y = Math.asin (
Math.sin(GetRad(lat)) * Math.cos(distRad) + Math.cos(GetRad(lat))
* Math.sin(distRad) * Math.cos(GetRad(i))
);
circlePoint.x = Math.atan2 (
(Math.sin(distRad) * Math.sin(GetRad(i))) /
Math.cos(circlePoint.y) ,
(Math.sin(circlePoint.y) * Math.cos(GetRad(lat)) -
Math.sin(distRad) * Math.cos(GetRad(i))) /
(Math.cos(circlePoint.y) * Math.sin(GetRad(lat)))
) + GetRad(lng);
circlePoint.y = GetDeg(circlePoint.y);
circlePoint.x = GetDeg(circlePoint.x);
circlePoints.push(circlePoint);
}
var MarkPoints = [];
for (var i=0; i<60 ; i++){
var MarkPoint =new GPoint();
MarkPoint.y = circlePoints[ i * 6].y;
MarkPoint.x = circlePoints[ i * 6].x;
MarkPoints.push(MarkPoint);
}
MarkPoint.y = circlePoints[0].y;
MarkPoint.x = circlePoints[0].x;
MarkPoints.push(MarkPoint);
var polyOptions = {geodesic:true};
circleLine = new GPolyline(MarkPoints, "#008000",5,1,polyOptions);
map.addOverlay(circleLine);
}

YY

unread,
Apr 21, 2008, 2:38:28 AM4/21/08
to Google-Maps-API-Japan
Gpolylineを止めて、塗りつぶし無しのGPolygonにしただけで、
描画が大幅に早くなりました。(?)
circleLine = new GPolygon(MarkPoints, "#008000", 3, 0.5, "##008000",
0,polyOptions);

※<次の実験>
外接する四角形のNE,SWの2点を計算して、GGroundOverlay
で、真円の画像を描画すれば、もっと早く、同様の表示が可能
 かな。

YY

unread,
Apr 23, 2008, 3:34:30 AM4/23/08
to Google-Maps-API-Japan
[結果報告]
GGroundOverlayで真円の画像を描画してみました。
var boundaries = new GLatLngBounds(new
GLatLng(circlePoints[180].y,circlePoints[270].x), new
GLatLng(circlePoints[0].y,circlePoints[90].x));
var circleLine = new GGroundOverlay("./MAPICON/circle.png",
boundaries);
map.addOverlay(circleLine);
結果、たいして早くならなかった。かえって遅くなったぐらいです。
しかも、地図スケールを変えると線の太さも変ってしまいます。
また、1000Kmを超えると誤差がどんどん大きくなりました。
従って、GGroundOverlayの利用は没です。GPolygonがベスト
かな。
(以上)
Reply all
Reply to author
Forward
0 new messages