Если вы знаете, что такое геокодирование и хотите начать создавать свои собственные базы данных геокодирования, в этой статье я покажу вам, как создавать базы данных геокодирования.
Исходная статья: https://blog.petehouston.com/build-geocoding-databases/
Чтобы создать базу данных геокодирования, вам понадобится источник данных. Вы можете использовать данные, предоставленные Geonames, или искать любой источник, соответствующий вашим требованиям.
Я буду использовать http://download.geonames.org/export/zip/ для создания базы данных.
Файл readme показывает, что каждая страна заархивирована в сжатый файл в формате COUNTRY_CODE.zip
.
Внутри ZIP-пакета есть файл CSV с расширением TXT, который содержит все, что нам нужно для базы данных геокодирования (ну, большую часть).
Файл CSV использует t
в качестве символа-разделителя и имеет следующие поля:
country code : iso country code, 2 characters
postal code : varchar(20)
place name : varchar(180)
admin name1 : 1. order subdivision (state) varchar(100)
admin code1 : 1. order subdivision (state) varchar(20)
admin name2 : 2. order subdivision (county/province) varchar(100)
admin code2 : 2. order subdivision (county/province) varchar(20)
admin name3 : 3. order subdivision (community) varchar(100)
admin code3 : 3. order subdivision (community) varchar(20)
latitude : estimated latitude (wgs84)
longitude : estimated longitude (wgs84)
accuracy : accuracy of lat/lng from 1=estimated to 6=centroid
До этого момента, я думаю, вы уже должны знать, как это сделать.
Вот шаги:
- Загрузите ZIP-архив.
- Распакован для получения CSV-файла.
- Проанализируйте CSV-файл (включив фильтр, если необходимо)
- Импорт в базу данных (например, MySQL, Postgresql, Sqlite...)
Это можно сделать с помощью простого скрипта Python или любой технологии, в которой вы хорошо разбираетесь.
Шаг 1: Загрузите ZIP-архив
Это можно легко сделать в Python.
import wget
wget.download(FILE_URL, FILE_ZIP, bar=bar_progress)
Модуль wget предоставляет довольно удобный индикатор выполнения для отслеживания текущей загрузки.
Шаг 2. Извлеките ZIP-пакет
Теперь нам нужно распаковать сжатый файл, чтобы получить CSV-файл.
С модулем zipfile это не может быть проще.
from zipfile import ZipFile
z = ZipFile('US.zip', 'r') z.extractall() z.close()
После этого вы увидите два файла в текущем каталоге, US.txt
и readme.txt
.
Шаг 3. Проанализируйте файл CSV.
Используя pandas, мы можем разобрать этот CSV-файл в двумерный DataFrame, и им легко манипулировать. Чтение CSV-файла с помощью pandas — обычная задача в науке о данных.
import pandas
df = pandas.read_csv('data/US.txt', delimiter='\t')
Поскольку данные из Geonames используют вкладку \t
в качестве разделителя, нам нужно указать ее явно.
Более того, столбцам лучше присваивать имена:
df = pd.read_csv('./data/US.txt', sep='\t', names=['country', 'postal_code', 'name', 'state_name', 'state_code',
'county_name', 'county_code', 'comm_name', 'comm_code',
'latitude', 'longitude', 'accuracy'])
Вы также можете фильтровать DataFrame по своему усмотрению. Например, вам может вообще не понадобиться использовать comm_name
, comm_code
и accuracy
, вы можете удалить столбцы из DataFrame в pandas, используя всего одну строку кода.
df.drop(['comm_name', 'comm_code', 'accuracy'], axis=1)
Шаг 4: Импорт в базы данных
После фильтрации и получения хорошего набора данных нам нужно поместить их в базу данных. В этом руководстве мы будем использовать MySQL.
Самое быстрое решение — использовать SQLAlchemy для обработки процесса импорта, чтобы переместить DataFrame в таблицу MySQL.
from sqlalchemy import create_engine
engine = create_engine('mysql+mysqlconnector://root:@localhost:3306/')
df.to_sql('geocodes', con=engine, if_exists='replace', schema='geo_db', index_label='id', chunksize=100)
Заметный параметр, используемый здесь, — chunksize
.
Поскольку данные в DataFrame могут быть слишком большими, а их импорт в базу данных с помощью одной фиксации может занимать много времени, мы используем chunksize
для помещения данных в таблицу, чтобы это могло быть быстрее.
Вывод
Отлично, у вас есть база данных геокодирования, которая готова к использованию. Процесс простой и легкий, с этим справится любой программист.
Если вам нужны ссылки, посмотрите мой демо-код здесь, это может дать вам некоторые идеи, https://github.com/peteouston/geonames-db
Здравствуйте, меня зовут Пит Хьюстон, инженер-программист, который ведет ежедневный блог на https://blog.petehouston.com
Подпишитесь на меня, если вам интересно :)