Come generare coordinate tra due punti noti
-
23-12-2019 - |
Domanda
Sfondo:
Sto lavorando con i percorsi di trasporto e Google fornisce punti di percorso molto distanti per creare "forme".Queste sono le rotte bus / treno che vedi in Google Maps.
I miei requisiti:
I punti di Google sono abbastanza lontani da creare linee rette.Comunque voglio un punto ogni, per esempio, 5 metri.
Problema:
Allora, dì che ho due punti [Lat, Long]:
[- 33.88242199191919191986052582] e [-33.8815434600467,151.206556440037]
Dato che questi due punti posso calcolare la distanza tra loro.Dì che è 1 km per il bene dell'argomento.
Quindi possiamo immaginare una linea retta immaginaria tra questi due punti.
Come posso generare coordinate per quella linea immaginaria per ogni, ad esempio, 5 metri?
Soluzione
Punto di destinazione Distanza e cuscinetto dal punto di partenza applicato al 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}"
.
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
.
Altri suggerimenti
STEP 1 - Ottieni la distanza complessiva
Risposta completa può essere trovata qui: http://www.movable-type .co.uk / script / latlong.html
TL; DR:
.Questo utilizza la formula 'Haversine' per calcolare il grande cerchio Distanza tra due punti - cioè la distanza più breve sopra il La superficie della Terra - dando una distanza "As-the-crow-vola" tra il Punti (ignorando qualsiasi collina, ovviamente!).
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;
.
STEP 2 - Ottieni la percentuale percorsa.
Ora hai la distanza per questa linea retta, puoi quindi elaborare una percentuale della distanza complessiva per ogni 5 metri.
Passaggio 3 - Applicare la percentuale percorsa alla differenza tra latitudine e longitudine
Scopri la differenza tra la latitudine iniziale e la latitudine finale. Con questo numero, moltiplicalo per la percentuale percorsa (come decimale). Questo può quindi essere aggiunto alla latitudine iniziale per trovare la latitudine attuale di questo punto. Ripetere per longitudine.
La seguente soluzione non è esattamente ciò che hai richiesto, ma potrebbe essere sufficiente per i tuoi scopi ...
Controllare i documenti ufficiali ( https://develdow.google.com/maps/Documentation/ Javascript / Riferimento ) per il metodo interpolate
.Dai documenti: "Restituisce il latlng che sta la frazione data del modo tra l'origine latlng e la destinazione latlng. '
Quindi se sai che i tuoi punti originali sono, dicono, a 100 m a parte, e specificati 0,05 come frazione, il metodo restituirà il Lat / GNL lungo quella linea per ogni 5 m.