Pregunta

Fondo:

Estoy trabajando con las rutas de transporte y Google proporciona puntos de ruta muy separados para crear 'formas'.Estas son las rutas de autobús / tren que se ve en Google Maps.

My requisito:

Los puntos de Google son lo suficientemente lejos como para crear líneas rectas.Sin embargo, quiero un punto cada, digamos, a 5 metros.

problema:

Entonces, digamos que tengo dos puntos [Lat, Long]:

[- 33.8824219918503.151.206686052582] y [-33.8815434600467.151.206556440037]

Dados esos dos puntos puedo calcular la distancia entre ellos.Di que es 1km por el bien del argumento.

Entonces podemos imaginar una línea recta imaginaria entre esos dos puntos.

¿Cómo genero coordenadas para esa línea imaginaria por cada, por ejemplo, 5 metros?

¿Fue útil?

Solución

Punto de destino DISTANCIA DISTANCIA Y RODAMIENTO DEL PUNTO DE INICIO aplicado a su 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}"

Genera un enlace de Google Static Maps con los puntos de referencia de Valparaíso a Shanghai 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

Otros consejos

Paso 1 - Obtenga la distancia general

Respuesta completa se puede encontrar aquí: http://www.movable-type .co.uk / scripts / latlong.html

tl; dr:

Esto utiliza la fórmula 'Haversine' para calcular el gran círculo distancia entre dos puntos, es decir, la distancia más corta sobre el Superficie de la Tierra: dando una distancia de 'as-the-Crow' entre el PUNTOS (ignorando cualquier colina, por supuesto!).

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;

Paso 2 - Obtenga el porcentaje recorrido.

Ahora tiene la distancia para esta línea recta, puede resolver un porcentaje de la distancia total por cada 5 metros.

Paso 3: Aplique el porcentaje recorrido a la diferencia entre la latitud y la longitud

Averigüe la diferencia entre la latitud inicial y la latitud final. Con este número, multiplíquelo por el porcentaje recorrido (como un decimal). Esto se puede agregar de nuevo a la latitud inicial para encontrar la latitud actual de este punto. Repetir para la longitud.

La siguiente solución no es exactamente lo que ha solicitado, pero puede ser suficiente para sus propósitos ...

Revise los documentos oficiales ( https://developers.google.com/maps/documentation/ JavaScript / Referencia ) para el método interpolate.Desde los documentos: 'Devuelve el Latlng, que se encuentra la fracción dada del camino entre el origen Latlng y el destino Latlng'.

Entonces, si sabe que sus puntos originales son, dicen, 100 m de distancia, y usted especifica 0.05 como la fracción, el método devolverá la Lat / GNL a lo largo de esa línea por cada 5 m.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top