Geoalgorithm pour trouver les coordonnées du point à partir d'un emplacement connu par distance et le relèvement

StackOverflow https://stackoverflow.com/questions/695065

  •  22-08-2019
  •  | 
  •  

Question

Je voudrais utiliser Google Maps API statique pour afficher une carte avec une superposition de chemin indiquant une limite.

AFAICT l'API statique ne supporte pas les polygones, donc je l'intention de contourner cela en tirant la frontière en utilisant des chemins.

Pour ce faire, je dois déterminer les points pour tracer les lignes droites (chemins) entre; donc je voudrais un algorithme qui retourne l'emplacement géographique (à savoir les coordonnées WGS84) un palier donné et la distance à partir d'un point connu.

Quelqu'un peut-il me pointer vers un tel algorithme. De préférence en C #, mais d'autres langues sont acceptables?

Était-ce utile?

La solution 5

Nous avons trouvé ce (ici: http://williams.best.vwh.net/ avform.htm # LL ):

Un point {lat, lon} est une distance d sur la radiale tc à partir du point 1, si:

lat=asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
IF (cos(lat)=0)
    lon=lon1      // endpoint a pole
ELSE
    lon=mod(lon1-asin(sin(tc)*sin(d)/cos(lat))+pi,2*pi)-pi
ENDIF

Est-ce que le radial en radians ou degrés?

Modifier

radians = degrés * PI / 180

Autres conseils

Je mis en place et testé en C #, en utilisant comme degrés d'entrée / sortie au lieu de radians:

    static readonly double FullCircleDegrees = 360d;
    static readonly double HalfCircleDegrees = FullCircleDegrees / 2d;
    static readonly double DegreesToRadians = Math.PI / HalfCircleDegrees;
    static readonly double RadiansToDegrees = 1 / DegreesToRadians;

    public LatLng GetPointGivenRadialAndDistance(LatLng center, double radius, double azimuth)
    {
        var lat1 = center.Lat * DegreesToRadians;
        var lng1 = center.Lng * DegreesToRadians;
        var lat = Math.Asin( (Math.Sin(lat1) * Math.Cos(radius)) + Math.Cos(lat1) * Math.Sin(radius) * Math.Cos(azimuth * DegreesToRadians));
        var lng = 0d;
        if (Math.Cos(lat) == 0)
        {
            lng = lng1;
        }
        else
        {
            lng = ((lng1 + Math.PI - Math.Asin(Math.Sin(azimuth * DegreesToRadians) * Math.Sin(radius) / Math.Cos(lat1))) % (2 * Math.PI)) - Math.PI;
        }
        return new LatLng(lat * RadiansToDegrees, lng * RadiansToDegrees);
    }

Vous pouvez dessiner un polygone sur un fichier KML, puis afficher le fichier KML sur Google maps.

Voici KML sur Google maps (à partir d'échantillons Google KML) vérifier la "Campus Google - Polygones" du contenu .

(je pense) toutes les langues que je sais, radians. Notez que je pense que votre exemple de code vous donne les coordonnées basé sur une sphère, et non WGS84. Voici code Java pour convertir entre les systèmes de coordonnées .

Jetez un oeil à Gavaghan géodésie C # bibliothèque, il devrait être ce que vous cherchez. Et c'est gratuit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top