Korrigieren Sie GPS-Daten mithilfe der Map Matching API von Mapbox. Ich habe versucht, ein Werkzeug zu erstellen.
--Dieser Artikel verwendet Python3, die Map Matching API von Mapbox.
――Für die Nutzungsdaten werden GPS-Daten verwendet, die von der Garmin-Uhr erfasst wurden, die während des Marathonturniers am Handgelenk getragen wurde.

MapboxMapMatchingAPI.py
import os
import csv
import json
import datetime
import time
import configparser
import requests
#Geben Sie die CSV-Dateispezifikation ein
input_csvfile = "Eingabe Bitte geben Sie die CSV-Datei ein."
#CSV-Dateispezifikation ausgeben
output_csvfile = "Geben Sie die Ausgabe-CSV-Datei ein."
#Map Matching API URL * Nicht ändern.
api_url = "https://api.mapbox.com/matching/v5/mapbox/driving/"
# Mapbox Access token
api_token = "Bitte geben Sie das Zugriffstoken ein."
#Arbeitsliste
data = []
wklst = []
#Stellen Sie die CSV-Eingabedatei auf die Arbeitsliste ein
with open(input_csvfile) as f:
    #Kopfzeile überspringen
    h = next(csv.reader(f))
    for v in csv.reader(f):
        data.append(v)
for i in range(len(data) -1):
    wklst.append([data[i][0],data[i][1],data[i+1][0],data[i+1][1]])
# print(wklst)
#Überprüfen Sie, ob die CSV-Ausgabedatei vorhanden ist(Beurteilung des Vorhandenseins oder Nichtvorhandenseins eines Headers)
if(os.path.exists(output_csvfile)):
    header_flg = 0
else:
    header_flg = 1
#Überprüfen Sie, ob die CSV-Ausgabedatei vorhanden ist(Beurteilung des Vorhandenseins oder Nichtvorhandenseins eines Headers)
if(os.path.exists(output_csvfile)):
    header_flg = 0
else:
    header_flg = 1
#Fordern Sie die Map Matching API aus der Arbeitsliste an und schreiben Sie das Ergebnis in die Ausgabe-CSV-Datei
with open(output_csvfile, 'a', encoding='shift_jis') as output_csvfile_fp:
    fieldnames = ['bef_lat','bef_lng','aft_lat','aft_lng']
    csvfile_writer = csv.DictWriter(output_csvfile_fp, fieldnames=fieldnames,lineterminator='\n')
    
    #Ausgabe Header-Ausgabe beim Erstellen einer neuen CSV-Datei
    if header_flg == 1:
        csvfile_writer.writeheader()
        header_flg == 0
    print(len(wklst))
    for i in range(len(wklst)):
        # print(wklst[i])
        #Generierung von Map Matching API-Parametern
        origins = wklst[i][1] + ','+ wklst[i][0]
        destinations = wklst[i][3] + ','+ wklst[i][2]
        params = {
            'radiuses':'50;50',
            'access_token': api_token
            }
        #Anforderung der Map Matching API
        raw_response = requests.get(api_url + origins + ';' + destinations, params)
        parsed_response = json.loads(raw_response.text)
        parsed_response_json = json.dumps(parsed_response, indent=4)
        # print(parsed_response_json)
        breakpoint
        #Extrahieren Sie Elemente aus JSON
        if parsed_response['code'] == 'Ok':
            lng1 = parsed_response['tracepoints'][0]['location'][0]
            lat1 = parsed_response['tracepoints'][0]['location'][1]
            lng2 = parsed_response['tracepoints'][1]['location'][0]
            lat2 = parsed_response['tracepoints'][1]['location'][1]
        else:
            lng1 = None
            lat1 = None
            lng2 = None
            lat2 = None
        #Schreiben, um eine CSV-Datei auszugeben
        csvfile_writer.writerow({
            'bef_lat': wklst[i][0],
            'bef_lng': wklst[i][1],
            'aft_lat': lat1,
            'aft_lng': lng1
            })
        
        print(wklst[i][0],wklst[i][1],lat1,lng1)
print(u'Verarbeitung beenden')

――Das Ausführungsergebnis wird von QGIS wie folgt visualisiert.

** * Bitte beachten Sie, dass Ihnen eine Gebühr berechnet wird, wenn Sie die API über die kostenlose Stufe (> _ <) hinaus verwenden **
Recommended Posts