Если вы знаете, что такое геокодирование и хотите начать создавать свои собственные базы данных геокодирования, в этой статье я покажу вам, как создавать базы данных геокодирования.

Исходная статья: 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

До этого момента, я думаю, вы уже должны знать, как это сделать.

Вот шаги:

  1. Загрузите ZIP-архив.
  2. Распакован для получения CSV-файла.
  3. Проанализируйте CSV-файл (включив фильтр, если необходимо)
  4. Импорт в базу данных (например, 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

Подпишитесь на меня, если вам интересно :)