Geoalgorithm para encontrar as coordenadas de ponto a partir de uma localização conhecida pela distância e o rumo

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

  •  22-08-2019
  •  | 
  •  

Pergunta

Eu gostaria de usar o Google Maps API estática para exibir um mapa com uma sobreposição caminho indicando um limite.

AFAICT a API estática não suporta polígonos, por isso tenho a intenção de contornar isso por desenhar o limite usando caminhos.

Para fazer esta necessidade eu para determinar os pontos para desenhar as linhas rectas (caminhos) entre; pelo que gostaria de um algoritmo que devolve a localização geográfica (isto é, coordenadas WGS84) e um rolamento de distância a partir de um ponto conhecido dado.

pode apontar-me qualquer um para um algoritmo tal. De preferência em C #, mas outras línguas são aceitáveis?

Foi útil?

Solução 5

Encontrei este (aqui: http://williams.best.vwh.net/ avform.htm # LL ):

Um ponto {lat, lon} está a uma distância d para fora na radial a partir do ponto tc 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

Será que o radial estar em radianos ou graus?

Editar:

radianos = graus * PI / 180

Outras dicas

Eu implementado e testado-lo em C #, usando Degrees como entrada / saída em vez de radianos:

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

Você pode desenhar polígono em um arquivo KML, e, em seguida, mostrar o KML no Google Maps.

Aqui está KML no Google maps (a partir de amostras Google KML) verificar o "Google Campus - Polígonos" no conteúdo .

Em (eu acho) todas as línguas que eu sei, radianos. Nota que eu acho que o código de exemplo está dando-lhe co-ordenadas com base em uma esfera, e não em WGS84. Aqui está código Java para converter entre coordenar sistemas .

Dê uma olhada Gavaghan Geodésia C # biblioteca, ele deve ser o que você está procurando. E é grátis.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top