La migliore strategia per convertire i cambiamenti di longitudine e latitudine a nord, sud, est, ovest in gradi

2

Questo non è un compito di classe ma una domanda concettuale con cui sto lottando per un progetto personale.

Devo convertire un grande gruppo accoppiato di valori di coordinate long e lat che mostrano un cambiamento direzionale bidimensionale in gradi di cambiamento (0-360).

Quali sono i modi più veloci per realizzare questo tipo di trasformazione? Spero di evitare di annidare molte dichiarazioni condizionali.

    
posta in code veritas 28.01.2015 - 03:16
fonte

2 risposte

1

Per una precisione migliore degli strumenti generali utilizzati per raccogliere i dati è un modulo Python pyproj Feed i tuoi dati in qualcosa di simile la funzione odometer estratta da waypoint.py

from pyproj import Geod  # sudo pip3 install pyproj
geoid = Geod(ellps='WGS84')  # See pyproj documentation for other fun options

def odometer(start, end):
    """Calculate bearings and distance between start and end.

    Arguments:
      start (tuple of float): latitude and longitude of starting position
      end (tuple of float): latitude and longitude of ending position

    Returns:
      float: True North bearing start -> end
      float: True North bearing end -> start
      float: distance start <-> end in meters
    """
    try:
        bearing_to, bearing_fro, distance = geoid.inv(*start + end)
    except Exception as error:  # more specific?
        print("odometer({}, {}) created error:{}".format(start, end, error))
        return None

        bearing_to %= 360
        bearing_fro %= 360
    return bearing_to, bearing_fro, distance
    
risposta data 10.03.2015 - 15:51
fonte
1

Ho usato geographiclib per trovare azymouth (0 - 360) tra 2 punti nell'ellissoide WGS84 utilizzando il metodo inverso e filtrando il suo results come segue:

from geographiclib.geodesic import Geodesic

def orientation(startpoint, endpoint): # each point is a tuple of (lon, lat)
    return (
        Geodesic.WGS84.Inverse(
            startpoint[1], 
            startpoint[0],
            endpoint[1],
            endpoint[0],
        )['azi1'] % 360
    )

I gradi possono essere convertiti in direzioni basate sui punti bussola . Ecco un altro approccio pulito .

Ho utilizzato il seguente codice e verificato alcuni risultati con questo servizio online :

from geographiclib.geodesic import Geodesic

def orientation(startpoint, endpoint): # each point is a tuple of (lon, lat)
    azi = (
        Geodesic.WGS84.Inverse(
            startpoint[1], 
            startpoint[0],
            endpoint[1],
            endpoint[0],
        )['azi1'] % 360
    )
    ranges = {
        (0, 11.25): 'N',
        (11.25, 33.75): 'NNE',
        (33.75, 56.25): 'NE',
        (56.25, 78.75): 'ENE',
        (78.75, 101.25): 'E',
        (101.25, 123.75): 'ESE',
        (123.75, 146.25): 'SE',
        (146.25, 168.75): 'SSE',
        (168.75, 191.25): 'S',
        (191.25, 213.75): 'SSW',
        (213.75, 236.25): 'SW',
        (236.25, 258.75): 'WSW',
        (258.75, 281.25): 'W',
        (281.25, 303.75): 'WNW',
        (303.75, 326.25): 'NW',
        (326.25, 348.75): 'NNW',
        (348.75, 360): 'N',
    }
    for i in ranges.keys():
        if i[0] < azi <= i[1]:
            return ranges[i]
    
risposta data 15.10.2016 - 22:13
fonte

Leggi altre domande sui tag