#python #google-maps #python-requests
#python #google-карты #python-запросы
Вопрос:
Я отправляю запросы в API направлений Google. Из другой программы я генерирую координаты широты и долготы источника и назначения. В настоящее время я сохраняю их в файлах CSV в этой структуре
Y,X,
51.516185371445459,-0.102373799765274,
51.512892732882598,-0.083154776597858,
51.514087813699639,-0.097131850779755,
Я использую фантастические запросы Python для генерации этих запросов, но не могу понять, как указать в полях, посмотреть на эти CSV-файлы, которые я создал. Я использую следующее —
>>> import json, requests
>>> params = {'origin': '*directory to csv location*', 'destination': '*directory to csv location*', 'key': '*key*'}
>>> r = requests.get('https://maps.googleapis.com/maps/api/directions/json', params=params)
>>> print(r.url)
Как мне сообщить запросам, где находится файл и какие поля в CSV использовать? Для API координаты необходимо вводить без запятой или пробелов, поэтому мне также нужно будет выполнить эту манипуляцию.
Возможно, есть лучший способ, чем использование CSV?
Комментарии:
1. Вы не можете просто передать файл CSV в API, нет. Однако вы можете легко считывать данные из CSV с помощью
csv
модуля. Вы читали документацию по API , чтобы узнать, какие параметры принимает API?2. Какие координаты здесь являются источником и пунктом назначения?
3. Большое спасибо! У меня есть координаты источника и назначения в двух отдельных CSV. Было бы лучше поместить их в один CSV и поместить в разные столбцы? У меня нет никаких путевых точек, так что это упрощает ситуацию.
4. Зависит от того, как вы хотите их объединить. Если это прямое сопряжение начала и конца, вы можете поместить их в один файл или использовать
zip()
для сопряжения строк (for start, end in zip(start_reader, end_reader):
).5. Я попробую прямое сопряжение начала и конца и посмотрю, как у меня получится! Большое спасибо. Я попытаюсь заставить это работать
Ответ №1:
Нет, веб-сервис Google Maps API и requests
не принимает имена файлов CSV. Сначала вам нужно будет прочитать данные из файла CSV, а затем передать значения в API. Вместо этого вы можете использовать csv
модуль:
import requests
import csv
url = 'https://maps.googleapis.com/maps/api/directions/json'
apikey = '*key*'
with open('csv_filename', 'r', newline='') as csvfile:
reader = csv.DictReader(csvfile)
coords = ['{X},{Y}'.format(**row) for row in reader]
start, waypoints, end = coords[0], coords[1:-1], coords[-1]
params = {'origin': start,
'waypoints': '|'.join(waypoints),
'destination': end,
'key': apikey}
directions = requests.get(url, params=params).json()
Здесь DictReader()
в качестве ключей будет использоваться первая строка, поэтому каждый столбец может быть адресован как X
и Y
соответственно. Затем я просто форматирую их в строку, понятную Google.
Я предположил, что файл CSV представляет собой ряд точек для получения указаний; начало, путевые точки и конец.
ДЕМОНСТРАЦИЯ:
>>> import csv
>>> import requests
>>> sample = '''
... Y,X,
... 51.516185371445459,-0.102373799765274,
... 51.512892732882598,-0.083154776597858,
... 51.514087813699639,-0.097131850779755,
... '''
>>> reader = csv.DictReader(sample.splitlines())
>>> next(reader)
{'': '', 'X': '-0.102373799765274', 'Y': '51.516185371445459'}
>>> reader = csv.DictReader(sample.splitlines())
>>> coords = ['{X},{Y}'.format(**row) for row in reader]
>>> start, waypoints, end = coords[0], coords[1:-1], coords[-1]
>>> params = {'origin': start,
... 'waypoints': '|'.join(waypoints),
... 'destination': end,
... 'key': 'someapikey'}
>>> params
{'destination': '-0.097131850779755,51.514087813699639', 'waypoints': '-0.083154776597858,51.512892732882598', 'key': 'someapikey', 'origin': '-0.102373799765274,51.516185371445459'}
>>> url = 'https://maps.googleapis.com/maps/api/directions/json'
>>> directions = requests.get(url, params=params).json()
>>> from pprint import pprint
>>> pprint(directions)
{'routes': [], 'status': 'ZERO_RESULTS'}
В этом конкретном случае ваши координаты фактически не приводят к жизнеспособному маршруту, поэтому 'status': 'ZERO_RESULTS'
возвращается.