Question

Arrière-plan:

Je travaille avec des itinéraires de transport et Google fournit des points d'itinéraire suffisamment éloignés pour créer des « formes ».Ce sont les itinéraires de bus/train que vous voyez sur Google Maps.

Mon exigence :

Les points de Google sont suffisamment éloignés pour créer des lignes droites.Cependant, je veux un point tous les 5 mètres, disons.

Problème:

Alors, disons que j'ai deux points [lat, long] :

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

Compte tenu de ces deux points, je peux calculer la distance qui les sépare.Disons que c'est 1 km pour des raisons d'argumentation.

Nous pouvons donc imaginer une ligne droite imaginaire entre ces deux points.

Comment puis-je générer les coordonnées de cette ligne imaginaire tous les 5 mètres, disons ?

Était-ce utile?

La solution

Point de destination Distance et portant du point de départ appliqué à votre problème:

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}"

génère un lien de carte Google statique avec les points de cheminement de Valparaíso à Shanghai tous les 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

Autres conseils

Étape 1 - Obtenez la distance totale

Une réponse complète peut être trouvée ici: http://www.movable-type .co.uk / scripts / lettlong.html

TL; DR:

Ceci utilise la formule 'Haversine' pour calculer le grand cercle distance entre deux points - c'est-à-dire la distance la plus courte de la surface de la Terre - donnant une distance «comme-labelle» entre le points (ignorer les collines, bien sûr!).

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;

Étape 2 - Obtenez le pourcentage parcouru.

Vous avez maintenant la distance pour cette ligne droite, vous pouvez ensuite élaborer un pourcentage de la distance totale pour chaque 5 mètres.

Étape 3 - Appliquez le pourcentage parcouru à la différence entre la latitude et la longitude

Découvrez la différence entre la latitude de départ et la dernière latitude. Avec ce nombre, multipliez-le par le pourcentage parcouru (comme décimal). Cela peut ensuite être ajouté à la latitude de départ pour trouver la latitude actuelle de ce point. Répéter pour la longitude.

La solution suivante n'est pas exactement ce que vous avez demandé, mais peut suffire à vos besoins...

Consultez les documents officiels (https://developers.google.com/maps/documentation/javascript/reference) pour le interpolate méthode.À partir des documents :'Renvoie le LatLng qui correspond à la fraction donnée du chemin entre l'origine LatLng et la destination LatLng.'

Ainsi, si vous savez que vos points d'origine sont, disons, espacés de 100 m et que vous spécifiez 0,05 comme fraction, la méthode renverra la latitude/lng le long de cette ligne tous les 5 m.

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