2009-09-05 47 views
8

Tengo un pequeño problema. Estoy tratando de hacer lo siguiente usando Javascript & la versión 2 del API de Google Maps:Dibujar círculos concéntricos irregulares usando Google Maps

myhurricane.net - Wind Radii Profile

puedo dibujar círculos individuales sólo utilizando fórmulas bien se encuentran en todo el Internet. El problema que estoy enfrentando es que los círculos deben:

A. Ser concéntrica, y B. Debe tener un radio diferente para cada "cuadrante", es decir, NE, NO, SE & SW

tengo busqué en casi todas partes en las que puedo pensar en Internet, y no he encontrado la manera de hacerlo. Claramente, alguien ha hecho esto antes, y por eso pregunto en un foro de programadores. :)

Gracias!

ACTUALIZACIÓN: He sacado, utilizando el siguiente código, lo que creo que las coordenadas de cada uno de los puntos. para el dibujo a continuación:

snapshot-1252125257.781397

Este se obtuvo usando el siguiente JS:

http://gist.github.com/181290

NOTA: este JavaScript es desde el sitio siguiente (ligeramente modificada), que puede contener más respuestas en términos de lo que el algoritmo puede ser: http://www.movable-type.co.uk/scripts/latlong.html

ACTUALIZACIÓN 2: yo era capaz de conseguir esto en Google Maps:

Concentric Circles Progress

creado usando el siguiente código:

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

Actualización 3: probablemente debería también señalar que esto es para un sistema de coordenadas geográficas (ya que todo esto es para radios de vientos de ciclones tropicales), no el sistema de coordenadas cartesianas. ¡Gracias!

+0

¿Está pensando en hacer círculos de las cosechas? – Shizzmo

+0

No, parece huracán. –

+0

Sí, es para ciclones tropicales, no para círculos de cultivo. ;) –

Respuesta

4

Lo descubrí. Aquí está el código final. Tal vez se puede refactorizar un poco?

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

Esto se traduce en lo siguiente:

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

6

Básicamente, calcule el círculo como x, y = (cos (a), sen (a)), y luego multiplique esto (ambos términos) por un radio que sea la función apropiada del ángulo. No conozco bien el Javascript, o los mapas de Google, así que lo haré en Python, espero que sea lo suficientemente claro.

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() 

cual da alt text http://i25.tinypic.com/2w6gxeg.png

Realmente no podía seguir a su dibujo, por lo que sólo adivinar los números. Además, hice que los dos cuadrantes de la derecha fueran los mismos, ya que así era tu trama, pero eso es, por supuesto, opcional.

+0

Esto ** parece ** como si fuera la respuesta correcta, pero no puedo estar seguro hasta que sepa que puedo traducir correctamente. ¿Alguien con experiencia en JS y Google Maps API se preocupa por ayudar a traducir? –