Geoalgorithm per reperire le coordinate del punto da una posizione nota dalla distanza e cuscinetti

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

  •  22-08-2019
  •  | 
  •  

Domanda

Mi piacerebbe utilizzare le mappe API statica per visualizzare una mappa con una sovrapposizione percorso che indica un limite di Google.

AFAICT l'API statico non supporta poligoni, così ho intenzione di aggirare questa disegnando il contorno utilizzando percorsi.

Per fare questo ho bisogno di determinare i punti per disegnare le linee rette (percorsi) tra; pertanto vorrei un algoritmo che restituisce la posizione geografica (cioè coordinate WGS84) una data distanza e da un punto noto.

Qualcuno mi può puntare a un tale algoritmo. Preferibilmente in C #, ma altre lingue sono accettabili?

È stato utile?

Soluzione 5

Ho trovato questo (qui: http://williams.best.vwh.net/ avform.htm # LL ):

Un punto {lat, lon} è una distanza d sul tc radiale dal punto 1 se:

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

Sarà il radiale essere in radianti o gradi?

Modifica

radianti = gradi * PI / 180

Altri suggerimenti

Ho implementato e provato in C #, utilizzando Gradi come input / output al posto di radianti:

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

È possibile disegnare poligoni su un file KML, e poi mostrare il KML su Google maps.

Ecco KML su Google maps (Da Google KML Samples) controllare il "Google Campus - poligoni" sezione nel contenuto .

In (credo) tutte le lingue che conosco, radianti. Si noti che penso che il codice di esempio si sta dando coordinate sulla base di una sfera, non su WGS84. Ecco codice Java per la conversione tra sistemi di coordinate .

Date un'occhiata a Gavaghan Geodesia C # biblioteca, dovrebbe essere quello che stai cercando. Ed è gratuito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top