2016-07-19 13 views
0

iterieren Ich möchte eine Bewegung auf einer realen Weltkarte (sphärisch) simulieren und die tatsächliche Position auf (google | openStreet) Karten darstellen.Wie man zwischen zwei geo Standorten mit einer bestimmten Geschwindigkeit in Python (3)

Ich habe ein anfängliches lat/langes Paar, z.B. (51.506314, -0.088455) und möchte z.B. (51.509359, -0.087221) auf einer bestimmten Geschwindigkeit, indem interpolierte Koordinaten periodisch abgerufen werden.

Pseudocode für Klarstellung:

loc_init = (51.509359, -0.087221) 
loc_target = (51.509359, -0.087221) 

move_path = Something.path(loc_init, loc_target, speed=50) 

for loc in move_path.get_current_loc(): 
    map.move_to(loc) 
    device.notify_new_loc(loc) 
    ... 
    time.sleep(1) 

die aktuelle Position interpoliert Abrufen von auf unterschiedliche Weise geschehen kann, z.B. Rechnen mit einer festen Refresh-Zeit (1 sec) oder vielleicht in einem Thread laufen lassen und kontinuierlich neue Positionen berechnen.

Leider habe ich nie zuvor mit Geodaten gearbeitet und kann im Internet nichts Nützliches finden. Vielleicht gibt es bereits ein Modul oder eine Implementierung, die das tun?

Antwort

0

mein Problem gelöst:

Gefunden eine C++ Bibliothek geographiclib, die auf Python genau portiert wurde tun, was ich suchte. Beispiel Code, um eine inverse geodätische Linie zu berechnen und die Positionen für einen bestimmten Abstand erhalten:

from geographiclib.geodesic import Geodesic 
import math 

# define the WGS84 ellipsoid 
geod = Geodesic.WGS84 

loc_init = (51.501218, -0.093773) 
loc_target = (51.511020, -0.086563) 

g = geod.Inverse(loc_init[0], loc_init[1], loc_target[0], loc_target[1]) 
l = geod.InverseLine(loc_init[0], loc_init[1], loc_target[0], loc_target[1]) 

print ("The distance is {:.3f} m.".format(g['s12'])) 

# interval in m for interpolated line between locations 
interval = 500 
step = int(math.ceil(l.s13/interval)) 

for i in range(step + 1): 
    if i == 0: 
     print ("distance latitude longitude azimuth") 
    s = min(interval * i, l.s13) 
    loc = l.Position(s, Geodesic.STANDARD | Geodesic.LONG_UNROLL) 
    print ("{:.0f} {:.5f} {:.5f} {:.5f}".format(
     loc['s12'], loc['lat2'], loc['lon2'], loc['azi2'])) 

Gewährt:

The distance is 1199.958 m. 
distance latitude longitude azimuth 
0 51.50122 -0.09377 24.65388 
500 51.50530 -0.09077 24.65623 
1000 51.50939 -0.08776 24.65858 
1200 51.51102 -0.08656 24.65953