8

少し問題があります。JavascriptとGoogle Maps API v2を使用して次のことをしようとしています:

myhurricane.net - 風半径プロファイル

インターネットで見つけた数式を使用して、個々の円をうまく描くことができます。私が直面している問題は、円が次のことをしなければならないということです:

A. 同心であること、および B. 「象限」ごとに異なる半径、つまり、NE、NW、SE、および SW を持たなければならないこと

私はインターネット上で考えられるほぼすべての場所を検索しましたが、これを行う方法が思いつきませんでした。明らかに誰かが以前にこれを行ったことがあります。:)

ありがとう!

更新:次のコードを使用して、各ポイントの座標がどうなるかを考えました。下の図の場合:

スナップショット-1252125257.781397

これは、次の JS を使用して取得されました。

http://gist.github.com/181290

注: この JavaScript は次のサイト (わずかに変更されています) からのもので、アルゴリズムが最終的にどうなるかに関して、より多くの回答が含まれている可能性があります: http://www.movable-type.co.uk/scripts/latlong.html

更新 2: Google マップでこれを取得できました。

同心円の進行状況

次のコードを使用して作成されました。

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;
}

更新 3:これは、デカルト座標系ではなく、地理座標系(このすべてが熱帯低気圧の風半径用であるため)用であることもおそらく指摘する必要があります。ありがとう!

4

2 に答える 2

6

基本的に、円を x,y = (cos(a), sin(a)) として計算し、これ (両方の項) を角度の適切な関数である半径で乗算します。私は Javascript や Google マップをよく知らないので、これを Python で行います。うまくいけば、これで十分に明確になります。

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 つの象限が同じになるようにしましたが、それはプロットがどのように見えるかということですが、もちろんオプションです。

于 2009-09-05T05:09:45.773 に答える
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;
}

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

新しいmyhurricane.net-風速半径(マップビュー) 新しいmyhurricane.net-風速半径(衛星ビュー)

于 2009-09-05T07:42:01.270 に答える