[PYTHON] J'ai créé un outil pour corriger les données GPS avec l'API Map Matching de Mapbox (Mapbox Map Matching API)

Objectif

Corrigez les données GPS à l'aide de Map Matching API de Mapbox J'ai essayé de créer un outil.

Map Matching API

Environnement d'exécution

Conditions préalables

Des données d'utilisation

――Pour les données d'utilisation, les données GPS acquises par la montre Garmin portée au poignet pendant le tournoi marathon sont utilisées.

Méthode d'exécution

Paramètres d'entrée

--Entrez les données GPS (latitude, longitude) dans le fichier CSV d'entrée.

image.png

Courir

MapboxMapMatchingAPI.py


import os
import csv
import json
import datetime
import time
import configparser
import requests

#Spécification du fichier CSV d'entrée
input_csvfile = "Entrée Veuillez saisir le fichier CSV."

#Spécification du fichier CSV de sortie
output_csvfile = "Entrez le fichier CSV de sortie."

#URL de l'API de correspondance de la carte * Ne pas modifier.
api_url = "https://api.mapbox.com/matching/v5/mapbox/driving/"

# Mapbox Access token
api_token = "Veuillez saisir le jeton d'accès."

#Liste de travail
data = []
wklst = []

#Définissez le fichier CSV d'entrée sur la liste de travail
with open(input_csvfile) as f:
    #Ignorer la ligne d'en-tête
    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)

#Vérifiez l'existence du fichier CSV de sortie(Jugement de la présence ou de l'absence d'un en-tête)
if(os.path.exists(output_csvfile)):
    header_flg = 0
else:
    header_flg = 1

#Vérifiez l'existence du fichier CSV de sortie(Jugement de la présence ou de l'absence d'un en-tête)
if(os.path.exists(output_csvfile)):
    header_flg = 0
else:
    header_flg = 1

#Demander à mapper l'API de correspondance à partir de la liste de travail et écrire le résultat dans le fichier CSV de sortie
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')
    
    #Sortie de l'en-tête de sortie lors de la création d'un nouveau fichier CSV
    if header_flg == 1:
        csvfile_writer.writeheader()
        header_flg == 0

    print(len(wklst))
    for i in range(len(wklst)):
        # print(wklst[i])
        #Génération de paramètres d'API Map Matching
        origins = wklst[i][1] + ','+ wklst[i][0]
        destinations = wklst[i][3] + ','+ wklst[i][2]
        params = {
            'radiuses':'50;50',
            'access_token': api_token
            }
        #Demande de mappage de l'API de correspondance
        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

        #Extraire des éléments de 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

        #Écrire dans le fichier CSV de sortie
        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'Sortie de traitement')

Résultat d'exécution

image.png

――Le résultat de l'exécution est visualisé par QGIS comme suit.

image.png

Points à noter

** * Veuillez noter que vous serez facturé si vous utilisez l'API au-delà du niveau gratuit (> _ <) **

Recommended Posts

J'ai créé un outil pour corriger les données GPS avec l'API Map Matching de Mapbox (Mapbox Map Matching API)
J'ai créé une bibliothèque Python pour appeler l'API de LINE WORKS
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai créé un outil pour parcourir automatiquement plusieurs sites avec Selenium (Python)
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
Envoyer des données à l'API DRF avec Vue.js
J'ai fait une carte hexadécimale avec Python
J'ai créé une API Web
J'ai créé un outil pour convertir Jupyter py en ipynb avec VS Code
J'ai créé un outil de mot de passe en Python.
[Analyse des brevets] J'ai essayé de créer une carte des brevets avec Python sans dépenser d'argent
Je viens de créer un outil pour afficher facilement les données sous forme de graphique par opération GUI
J'ai créé une API de recherche de château avec Elasticsearch + Sudachi + Go + echo
J'ai essayé de faire MAP rapidement une personne suspecte en utilisant les données d'adresse Geolonia
J'ai essayé de créer une API de reconnaissance d'image simple avec Fast API et Tensorflow
J'ai essayé de sauvegarder les données avec discorde
Je veux frapper 100 sciences des données avec Colaboratory
Je veux faire un jeu avec Python
J'ai essayé d'obtenir des données CloudWatch avec Python
Folium: Visualisez les données sur une carte avec Python
J'ai créé un outil pour compiler nativement Hy
J'ai joué avec Diamond, un outil de collecte de métriques
J'ai créé un outil pour obtenir de nouveaux articles
Je veux écrire dans un fichier avec Python
J'ai créé un graphique à barres empilées avec matplotlib de Python et ajouté une étiquette de données
Voici un mécanisme pour réduire les papiers frauduleux. Matériel de données créé avec iPython Notebook.
J'ai écrit un outil CLI en langue Go pour afficher le flux de balises de Qiita dans CLI
J'ai essayé de créer un cadre de données pandas en grattant les informations de rappel d'aliments avec Python
Je veux donner un group_id à une trame de données pandas
Je veux faire la transition avec un bouton sur le ballon
Faisons un outil de veille de commande avec python
Je veux escalader une montagne avec l'apprentissage par renforcement
Je veux travailler avec un robot en python.
Je veux diviser une chaîne de caractères avec hiragana
J'ai essayé de découvrir notre obscurité avec l'API Chatwork
Je souhaite créer manuellement une légende avec matplotlib
J'ai essayé de collecter des données sur un site Web avec Scrapy
J'ai créé un outil de génération de données texte répétitif "rpttxt"
Transférer vers un Drive partagé avec l'API Google Drive V3
Je veux faire fonctionner un ordinateur quantique avec Python
Déployer une application Web créée avec Streamlit sur Heroku
Je veux lier une variable locale avec lambda
J'ai créé un environnement pour Masonite, un framework WEB Python similaire à Laravel, avec Docker!
J'ai essayé de créer un service qui vend des données apprises par machine à une vitesse explosive avec Docker
J'ai essayé d'implémenter une ligne moyenne mobile de volume avec Quantx
Je veux pouvoir analyser des données avec Python (partie 3)
J'ai essayé de rechercher des vidéos à l'aide de l'API de données Youtube (débutant)
Un diagramme de réseau a été créé avec les données du COVID-19.
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
[Linux] Copie des données de Linux vers Windows avec un script shell
Je veux pouvoir analyser des données avec Python (partie 1)