2010-02-26 8 views
9

Ich habe eine Methode entwickelt, die eine Koordinate und einen Bereich (in Meilen) verwendet und eine Liste von Koordinaten zurückgibt, die einen Kreis um den Ursprung bilden. Ich habe anscheinend Fortschritte gemacht, aber ich habe ein Problem damit, den Bereich zu verkleinern.GPS-Koordinaten berechnen, um einen Radius gegebener Größe zu bilden

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

Das Problem, das ich gefunden habe, ist, dass die Konstante ich bin mit der Entfernung in Meilen zu Grad ändert je nach Lage zu sagen .. Ist für die Lösung dieses Problems irgendwelche Vorschläge jemand hat oder eine bessere Mausefalle insgesamt ?

EDIT: Ich stelle fest, sollte, bin ich in Mathe schrecklich :)

+1

Denken Sie daran, dass der Offset-Punkt eine konstante Entfernung von einem festen Punkt ist, würde _seem_ eine Ellipse sein und kein Kreis, wenn Sie ihr lat/lon auf einem Stück Millimeterpapier grafisch darstellen. Dies liegt daran, dass (außer am Äquator) die Entfernung, die von einer Einheit von Lat abgedeckt wird, nicht dieselbe ist wie für eine Einheit von Lon. – JonnyBoats

Antwort

5

bei dieser einen Blick (Beispiel-Code enthält): http://www.movable-type.co.uk/scripts/latlong.html

die „Spherical Kosinussatz“ gibt Ihnen den Abstand zwischen zwei Koordinaten. Es sollte möglich sein, dies zu ändern, um Ihnen die Koordinaten um ein spezifiziertes Zentrum und einen spezifizierten Radius (Abstand) zu geben.

1

Anstatt LONG_MILE als Konstante definieren, sollten Sie es in Ihrem GetRadius Funktion berechnen: LONG_MILE = LAT_MILE/cos(OriginLatitude*PI/180.0)

Außerdem ist es ein wenig seltsam aussieht, dass Sie sin() und cos() Ihrer integer Index i einnehmen. Wenn Sie beabsichtigen, Punkte in 1-Radiant-Intervallen zu erzeugen, die den Mittelpunkt umgeben, wird es funktionieren. Aber ich vermute, möchten Sie vielleicht etwas mehr wie

angle_radians = i * 2.0*PI/Points; 

und ersetzen sin(angle_radians) für sin(i) usw.

0

Sie Ihre Berechnungen in einem sphärischen Koordinatenraum und dann konvertieren/Länge Breite.

Verwandte Themen