2009-09-05 11 views
8

私は少し問題があります。Googleマップを使用して不規則な同心円を描く

myhurricane.net - Wind Radii Profile

私はちょうど罰金、すべてのインターネット上で見つかった式を用いて、個々の円を描くことができます:私はJavascriptを& Google MapsのAPI V2を使用して次の操作を実行しようとしています。私はしました

A.が同心で、かつ B.は、それぞれ「象限」に異なる半径を持っている必要がありますつまり、NE、NW、SE & SW

:私は直面しています問題は、円がなければならないということです私がインターネット上で考えることができるほとんどあらゆる場所を検索し、これを行う方法についてはまったく思いつきませんでした。明らかに、誰かがこれを前にしてきたので、なぜ私はプログラマーのフォーラムで尋ねていますか? :)

ありがとう!

更新日:次のコードを使用して、それぞれの点の座標がどのようになると思いますか?

snapshot-1252125257.781397

これは、以下のJSを使用して得た:

http://gist.github.com/181290

注:このJavaScriptは(わずかに変更された)からなる複数を保持することができる次のサイト、以下描画しますアルゴリズムがどんな結果に終わるかという点での回答:http://www.movable-type.co.uk/scripts/latlong.html

更新2:私はGoogleマップでこれを取得することができた:

Concentric Circles Progress

次のコードを使用して作成:

var NEQ = [0, 90]; 
var SEQ = [90, 180]; 
var SWQ = [180, 270]; 
var NWQ = [270, 0]; 

// var centrePoint = new LatLon(25.0, -83.1); 
// pointsForWindQuadrant(NEQ, centrePoint, 50); 
function pointsForWindQuadrant(quadrantDegrees, centrePoint, radius){ 
    var points = []; 

    // Points must be pushed into the array in order 
    points.push(new google.maps.LatLng(centrePoint.lat, centrePoint.lon)); 

    for(i = quadrantDegrees[0]; i <= quadrantDegrees[1]; i++){ 
    var point = centrePoint.destPoint(i, radius * 1.85); 
    points.push(new google.maps.LatLng(point.lat, point.lon)); // Radius should be in nautical miles from NHC 
    } 

    points.push(new google.maps.LatLng(centrePoint.lat, centrePoint.lon)); 

    return points; 
} 

UPDATE 3:を私はおそらくまた、これはためのものであることを指摘しなければなりません地理座標系(この全体が熱帯低気圧風の半径のためです)ではなく、デカルト座標系です。ありがとう!

+0

あなたはミステリーサークルを作ることに計画していますか? – Shizzmo

+0

いいえ、ハリケーンのようです。 –

+0

はい、トロピカルサイクロンではなく、サークルサークルです。 ;) –

答えて

4

私はそれを理解しました。ここに最終的なコードがあります。たぶんそれは少しリファクタリングすることができますか?

// Returns points for a wind field for a cyclone. Requires 
// a LatLon centre point, and an array of wind radii, starting 
// from the northeast quadrant (NEQ), i.e., [200, 200, 150, 175] 
// 
// Returns points to be used in a GPolyline object. 
function pointsForWindQuadrant(centrePoint, radii){ 
    if(radii.length != 4){ return false; } 

    var points = []; 
    var angles = [0, 90, 180, 270]; 

    // For each angle 0, 90, 180, 270... 
    for(a = 0; a < angles.length; a++){ 
    // For each individual angle within the range, create a point... 
    for(i = angles[a]; i <= angles[a] + 90; i++){ 
     var point = centrePoint.destPoint(i, radii[a] * 1.85); // Radius should be in nautical miles from NHC 
     points.push(new google.maps.LatLng(point.lat, point.lon)); 
    } 
    } 

    // Add the first point again, to be able to close the GPolyline 
    var point = centrePoint.destPoint(0, radii[0] * 1.85); 
    points.push(new google.maps.LatLng(point.lat, point.lon)); 

    return points; 
} 

これは、次のような結果になります。

New myhurricane.net - Wind Radii (Map View) New myhurricane.net - Wind Radii (Satellite View)

6

基本的には、x、y =(cos(a)、sin(a))として円を計算し、角度(angle)の適切な関数である半径でこの私はJavascriptをよく知らないし、Googleマップもないので、これをPythonでやってみよう。これで十分だと思う。私は本当にあなたのスケッチをたどることができませんでしたので、私は数字だけで推測 alt text http://i25.tinypic.com/2w6gxeg.png

を与える

from pylab import * 

def Rscale(a): 
    if a>3*pi/2: # lower right, and then work CW around the circle 
     return 1. 
    elif a>pi: # lower left 
     return .9 
    elif a>pi/2: # upper left 
     return .8 
    else:  # upper right 
     return 1. 

def step_circle(R): 
    return array([(R*Rscale(a))*array([cos(a), sin(a)]) for a in arange(0, 2*pi, .001)]) 

for R in (.5, .7, .9): # make three concentric circles 
    c = step_circle(R) 
    plot(c[:,0], c[:,1]) 

show() 

。また、右端の2つの象限を同じにするようにしました。それは、あなたのプロットがどのように見えるかですが、もちろんそれはオプションです。

+0

**これは正解かもしれないようですが、正しく翻訳できることがわかるまではわかりません。 JS&Google Maps APIエクスペリエンスをご存知の方、翻訳を手伝っていただけますか? –

関連する問題