11
votes

Calculez les coordonnées GPS pour former un rayon de taille donnée

J'ai proposé une méthode qui prend une coordonnée et une gamme (en miles) et renvoie une liste de coordonnées qui forment un cercle autour de l'origine. Je semble avoir progressé de progresser avec cela, mais j'ai un problème pour obtenir la partie de la gamme.

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


1 commentaires

N'oubliez pas que les points de désactivation d'une distance constante d'un point fixe serait sembler d'être une Elipse et non un cercle si vous avez graphiquement leur lon / lon sur un morceau de papier graphique. En effet (sauf à l'équateur), la distance parcourue par une unité de lat n'est pas la même que pour une unité de Lon.


3 Réponses :


6
votes

Regardez-y (Inclut exemple code): http: // www .movable-type.co.uk / scripts / latlong.html

La "Loi sphérique des cosinules" vous donne la distance entre deux coordonnées. Il devrait être possible de le modifier pour vous donner les coordonnées autour d'un centre spécifié et d'un rayon spécifié (distance).


0 commentaires

1
votes

plutôt que définissant long_mile comme une constante, vous devez le calculer à l'intérieur de votre getradius Fonction: long_mile = lat_mile / cos (originLatitude * pi / 180.0)

aussi, il semble un peu bizarre que vous prenez sin () et cos () de votre entier Index i . Si votre intention est de générer des points à 1 intervalles de radian autour de Le point central, ça va marcher. Mais je soupçonne que vous pouvez vouloir quelque chose de plus comme xxx

et substitut sin (angle_radian) pour sin (i) , c.


0 commentaires

0
votes

Faites vos calculs dans un espace de coordonnées sphériques, puis de les convertir en latitude / longitude.


0 commentaires