2010-02-26 17 views
9

Ho trovato un metodo che prende una coordinata e un intervallo (in miglia) e restituisce un elenco di coordinate che formano un cerchio attorno all'origine. Mi sembra di aver fatto qualche progresso con esso, ma ho un problema con l'abbattimento della gamma.Calcola le coordinate GPS per formare un raggio di una data dimensione

private const Double LAT_MILE = 0.0144839; 
private const Double LONG_MILE = 0.0190693; 

public static List<Gps.Coordinate> GetRadius(Double OriginLatitude, Double OriginLongitude, Double Range, int Points) 
{ 
    List<Gps.Coordinate> Result = new List<Coordinate>(); 

    //insert a new point 
    for (int i = 0; i < Points; i++) 
    { 
     Result.Add(new Gps.Coordinate() 
     { 
      Latitude = ((Range * LAT_MILE) * System.Math.Cos(i)) + OriginLatitude, 
      Longitude = ((Range * LONG_MILE) * System.Math.Sin(i)) + OriginLongitude 
     }); 
    } 

    //sort using nearest neighbor 
    return SortCoords(ref Result); 
} 

Il problema che ho trovato è che la costante sto usando per raccontare la distanza in miglia in misura cambia a seconda posizione .. Qualcuno ha qualche suggerimento per risolvere questo problema, o una trappola per topi migliore del tutto ?

EDIT: Vorrei sottolineare, io sono terribile in matematica :)

+1

Ricordare che il punto di arresto indica una distanza costante da un punto fisso sarebbe _seem_ essere un'elisse e non un cerchio se si grafici la loro lat/lon su un pezzo di carta millimetrata. Questo perché (eccetto all'equatore) la distanza percorsa da un'unità di lat non è la stessa di una unità di lon. – JonnyBoats

risposta

5

un'occhiata a questo (include esempio di codice): http://www.movable-type.co.uk/scripts/latlong.html

la "Legge sferica di Coseni" ti dà la distanza tra due coordinate. dovrebbe essere possibile modificarlo per darti le coordinate attorno a un centro specificato e un raggio specificato (distanza).

1

Piuttosto che definire LONG_MILE come una costante, si dovrebbe calcolare all'interno della vostra GetRadius funzione: LONG_MILE = LAT_MILE/cos(OriginLatitude*PI/180.0)

Inoltre, sembra un po 'strano che si sta prendendo sin() e cos() del vostro intero indice i. Se la tua intenzione è di generare punti a 1 intervallo di radianti che circondano il punto centrale , funzionerà. Ma ho il sospetto che si potrebbe desiderare qualcosa di più simile

angle_radians = i * 2.0*PI/Points; 

e sostituire sin(angle_radians) per sin(i), ecc

0

fare i calcoli in un sferica spazio di coordinate e poi convertire loro di latitudine/longitudine.

Problemi correlati