Pergunta

Plano de fundo:

Eu estou trabalhando com rotas de transporte de e para o Google fornece pontos da Rota, longe o suficiente para criar 'formas'.Estes são os ônibus e/ou rotas de trem que você vê no Google Maps.

A Minha Exigência:

Google pontos são, de longe, o suficiente para criar linhas retas.No entanto eu quero um ponto a cada, digamos, 5 metros.

Problema:

Então, digamos que eu tenha dois pontos [lat,long]:

[-33.8824219918503,151.206686052582] e [-33.8815434600467,151.206556440037]

Dado os dois pontos que eu possa calcular a distância entre eles.Dizem que é de 1km para o bem do argumento.

Assim, podemos imaginar uma linha imaginária entre os dois pontos.

Como faço para gerar as coordenadas para que a linha imaginária para cada, digamos, 5 metros?

Foi útil?

Solução

Ponto de destino, dada a distância e rumo a partir do ponto inicial aplicado para o seu problema:

class Numeric
  def to_rad
    self * Math::PI / 180
  end
  def to_deg
    self * 180 / Math::PI
  end
end

include Math

R = 6371.0

def waypoint(φ1, λ1, θ, d)
  φ2 = asin( sin(φ1) * cos(d/R) + cos(φ1) * sin(d/R) * cos(θ) )
  λ2 = λ1 + atan2( sin(θ) * sin(d/R) * cos(φ1), cos(d/R) - sin(φ1) * sin(φ2) )
  λ2 = (λ2 + 3 * Math::PI) % (2 * Math::PI) - Math::PI # normalise to -180..+180°
  [φ2, λ2]
end

φ1, λ1 = -33.to_rad, -71.6.to_rad   # Valparaíso
φ2, λ2 = 31.4.to_rad, 121.8.to_rad  # Shanghai

d = R * acos( sin(φ1) * sin(φ2) + cos(φ1) * cos(φ2) * cos(λ2 - λ1) )
θ = atan2( sin(λ2 - λ1) * cos(φ2), cos(φ1) * sin(φ2) - sin(φ1) * cos(φ2) * cos(λ2 - λ1) )

waypoints = (0..d).step(2000).map { |d| waypoint(φ1, λ1, θ, d) }

markers = waypoints.map { |φ, λ| "#{φ.to_deg},#{λ.to_deg}" }.join("|")

puts "http://maps.googleapis.com/maps/api/staticmap?size=640x320&sensor=false&markers=#{markers}"

Gera um Google Static Maps ligação com os pontos de passagem a partir de Valparaíso de Xangai, a cada 2.000 km:

http://maps.googleapis.com/maps/api/staticmap?size=640x320&sensor=false&markers=-33.0,-71.60000000000002|-32.54414813683714,-93.02142653011552|-28.59922979115139,-113.43958859125276|-21.877555679819015,-131.91586675556778|-13.305784544363858,-148.5297601858932|-3.7370081151180683,-163.94988578467394|6.094273692291354,-179.03345538133888|15.493534924596633,165.33401731030006|23.70233917422386,148.3186618914762|29.83806632244171,129.34766276764626

Outras dicas

Passo 1 - Obter a distância total

Respostas abrangentes podem ser encontradas aqui: http://www.movable-type.co.uk/scripts/latlong.html

TL;DR:

Este usa o 'haversine' fórmula para calcular o grande círculo distância entre dois pontos, isto é, a menor distância sobre o a superfície da terra dando um "como-o-corvo-voa" a distância entre o pontos (ignorando qualquer colinas, é claro!).

var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var lat1 = lat1.toRad();
var lat2 = lat2.toRad();

var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var distance = R * c;

Passo 2 - Obter a porcentagem percorrida.

Agora você tem a distância para esta linha reta, em seguida, você pode trabalhar para fora uma porcentagem do total da distância para cada 5 metros.

Passo 3 - Aplicar o percentual viajou para a diferença entre as coordenadas de Latitude e Longitude

Descubra a diferença entre o início de latitude e o final de latitude.Com este número, multiplique pelo percentual percorrida (decimal).Este pode então ser adicionado de volta para o início da latitude para encontrar a latitude atual deste ponto.Repita para a longitude.

A seguinte solução não é exatamente o que você solicitou, mas pode ser suficiente para seus propósitos ...

Verifique os documentos oficiais ( https://developers.google.com/maps/documentation/ javascript / referência ) para o método interpolate.Dos documentos: 'Retorna o Latlng que reside a fração dada do caminho entre a origem Latlng e o destino Latlng.'

Então, se você sabe que seus pontos originais são, digam 100m, e você especifica 0,05 como a fração, o método retornará o lat / lng ao longo dessa linha para cada 5m.

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