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?

È stato utile?

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

Genera un collegamento di mappe statiche di Google con i waypoint da Valpararaíso a Shanghai ogni 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
.

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top