У меня есть CSV-файл с 2 полями, store_name
и city
. В городе может быть несколько магазинов.
Я хочу вывод csv с 5 полями, store_name
, city
, address
, latitude
, longitude
.
Например, если одна запись csv равна Starbucks, Chicago
, я хочу, чтобы вывод csv содержал всю информацию в 5 полях (упомянутых выше) как:
Starbucks, Chicago, "200 S Michigan Ave, Chicago, IL 60604, USA", 41.8164613, -87.8127855
Starbucks, Chicago, "8 N Michigan Ave, Chicago, IL 60602, USA", 41.8164613, -87.8127855
и так далее для остальных результатов.
Я пытался проработать это через GeoPy с помощью Nomanitim, прежде чем заставить его работать с Google Maps API. Хотя я не знаю, как лучше подойти к этому. Обратите внимание, что в исходном csv существует миллион таких записей, но покупка ключа API не является проблемой, если он работает.
Я пробовал только геокодирование с Nominatim, используя панд, но это создает только один результат в выходных csv для каждой записи. Я хочу получить каждый результат, как описано в примере выше. Не уверен, как это реализовать.
from geopy.geocoders import Nominatim
import csv, sys
import pandas as pd
import keys
in_file = str(sys.argv[1])
out_file = str('gc_' + in_file)
timeout = int(sys.argv[2])
nominatim = Nominatim(user_agent=your_key_here, timeout=timeout)
def gc(address):
name = str(address['store_name'])
city = str(address['city'])
add_concat = name + ", " + city
location = nominatim.geocode(add_concat)
if location != None:
print(f'geocoded record {address.name}: {city}')
located = pd.Series({
'lat': location.latitude,
'lng': location.longitude,
})
else:
print(f'failed to geolocate record {address.name}: {city}')
located = pd.Series({
'lat': 'null',
'lng': 'null',
})
return located
print('opening input.')
reader = pd.read_csv(in_file, header=0)
print('geocoding addresses.')
reader = reader.merge(reader.apply(lambda add: gc(add), axis=1), left_index=True, right_index=True)
print(f'writing to {out_file}.')
reader.to_csv(out_file, encoding='utf-8', index=False)
print('done.')