2 июля 2012 г. Гео базы данных

Geo database search

Иногда в процессе разработки возникают задачи, связанные с географическими локациями. Это может быть разработка LBS, построение выпадающего списка со странами и городами, определение местоположения по ip адресу и т.п. Для этого необходимо иметь гео базу данных.

Среди наиболее частых задач можно выделить несколько:

  • определение географического местоположения по ip адресу
  • определение географического местоположения по географической широте и долготе
  • получение списка стран, регионов и городов
  • поиск объектов в заданном гео диапазоне (гео радиусе)

Конечно можно воспользоваться сторонними сервисами, но использование сторонних сервисов в проекте имеет ряд минусов:

  • зависимость от сервиса
  • невозможность контролировать работу сервиса
  • скорость обращения к сервису меньше чем к локальной базе данных
  • плата за использование сервиса

Среди найденных бесплатных гео баз данных для этих задач я хотел бы выделить две. Это MaxMind и GeoNames. На последнюю мне посоветовал обратить внимание Евгений Кузьминов, за что очень ему признателен

MaxMind

Для определения местоположения по ip адресу несомненно лучше всего подходят базы данных от MaxMind. Есть возможность определения местоположения по IPv4, а так же по IPv6 адресам.

PHP разработчикам, базы данных от MaxMind, можно использовать в двух вариантах:

  1. установить php5-geoip, подгрузив необходимые базы данных в dat формате, после чего становится доступен целый ряд GeoIP функций. Среди которых есть возможность по ip адресу пользователя узнать город, страну, штат, широту, долготу, тип интернет подключения, название интернет провайдера и т.п.
  2. распарсить базу из текстового файла в MySQL. В этом может помочь набор моих shell скриптов geo-db-to-mysql-parser, которые просты в использовании и могут помочь при автоматизации обновлений баз данных.

В наборе имеются следующие скрипты:

  • maxmind_geoip_country.sh - диапазоны IPv4 адресов для стран
  • maxmind_geoipv6.sh - диапазоны IPv6 адресов для стран
  • maxmind_geolitecity.sh - база городов с привязкой к стране
  • maxmind_worldcitiespop.sh - база городов с привязкой к стране, а так же с полем население для некоторых городов
  • maxmind_region.sh - FIPS 10-4 коды регионов стран

Пример использования:

# делаем исполняемым скрипт
chmod +x maxmind_geoip_country.sh
# maxmind_geoip_country.sh параметры подключения к mysql
./maxmind_geoip_country.sh -uroot -ppassword -hlocalhost

И получаем на выходе базу maxmind c таблицей geoipcountry. Аналогично можно использовать остальные скрипты

GeoNames

Хоть в арсенале MaxMind имеются базы со списком стран и городов, но есть значительно более полная база - это GeoNames. Эта база бесплатна к скачиванию и распространяется по Creative Commons Attribution 3.0 License, обновляется ежедневно и содержит внушительный список различных географических объектов, среди которых, не только города, села и прочие населенные пункты, но и реки, озера, парки, пляжи, отели и т.д. Полный список поддерживаемых географических объектов в базе можно просмотреть здесь.

База доступна к скачиванию в текстовом формате. И помочь распарсить в MySQL поможет снова набор shell скриптов geo-db-to-mysql- parser

В наборе скриптов:

  • geonames_allcountries.sh - все страны в одной таблице
  • geonames_country.sh - географические объекты для конкретной страны. После запуска скрипта, на запрос ввода "input 2 digits country code in UPPER CASE and press ENTER" необходимо ввести код страны большими буквами
  • geonames_cities1000.sh - все города с населением > 1000 или административные округи
  • geonames_cities5000.sh - все города с населением > 5000 или административные центры
  • geonames_cities15000.sh - все города с населением > 15000 или столицы
  • geonames_admin1_codes.sh - административные округи, регионы в ascii
  • geonames_alternate_names.sh - база альтернативных названий c языковыми кодами Пример использования:

    делаем исполняемым скрипт

    chmod +x geonames_allcountries.sh

    geonames_allcountries.sh параметры подключения к mysql

    ./geonames_allcountries.sh -uroot -ppassword -hlocalhost

И получаем на выходе базу geonames c таблицей all_countries. Аналогичным образом можно использовать остальные скрипты

Выводы:

  1. Если вам необходимо иcпользовать базу для определения страны, города пользователя - MaxMind
  2. Если вам необходима база для получения списка стран и населенных пунктов в стране, выборки по географическим координатам, нахождение близлежащих географических объектов - GeoNames Гео базы данных. Часть 2
Базы данных