Есть где взять: Названия городов, населённых пунктов, стран, координаты

База географических названий GeoNames

— свободно распространяемая географическая база данных имен объектов (топонимики). Лицензия — Creative Commons Attribution. Содержит более 300 тысяч точечных объектов России и более чем 8 миллионов со всего света. Деление происходит на 9 классов (однобуквенный код) или 645 подклассов (2-5 буквенный код) (полный список):

  • административное деление (A)
  • гидросеть (H): каналы, заливы, озера, колодцы, моря
  • территории (L): парки, поля, военные базы, охраняемые территории
  • населенные пункты (P)
  • дорожная сеть (R)
  • точки (S): здания, банки, мосты, остановки транспорта, пересечения, фермы, заводы
  • природные объекты (T): пляжи, цирки, пики, острова
  • подводные объекты (U): каньоны, впадины, рифы
  • леса (V): отдельные деревья, массивы, плантации, степные участки.

Получение данных

Данные доступны бесплатно для прямого скачивания в виде текстовых файлов, кодировка UTF-8.

Также возможно использование веб-сервисов GeoNames. GeoNames предоставляет целый ряд веб-сервисов, позволяющих работать с его данными и получать результаты в форматах XML и JSON. Каждый объект базы GeoNames имеет свой стабильный URI.

Помимо англоязычных названий, GeoNames собирает данные на разных языках, сведения о высоте, населении и т.п. из различных источников. Все координаты хранятся в WGS84 (World Geodetic System 1984). Пользователи могут редактировать и добавлять новые названия с использованием вики-интерфейса.

Поля базы данных

Параметр Описание Формат
geonameid идентификатор записи в БД geonames int
name название объекта (utf8) varchar(200)
asciiname название объекта (ascii) varchar(200)
alternatenames альтернативные названия, разделитель — запятая varchar(5000) для SQL Server
latitude широта в десятичных градусах (wgs84)
longitude долгота в десятичных градусах (wgs84)
feature class http://www.geonames.org/export/codes.html varchar(10)
feature code http://www.geonames.org/export/codes.html
country code 2-символьный код страны согласно ISO-3166 2 characters
cc2 альтернативный код страны, разделитель — запятая, 2-символьный согласно ISO-3166 60 characters
admin1 code fipscode (в будущем будет изменен на isocode), isocode для США и Швейцарии, см. admin1Codes.txt для обозначений кодов varchar(20)
admin2 code код для административного деления второго уровня, county в США, см. admin2Codes.txt varchar(80)
admin3 code код для административного деления третьего уровня varchar(20)
admin4 code код для административного деления четвертого уровня varchar(20)
population integer
elevation в метрах integer
gtopo30 средняя высота по области 30’x30′ (900мx900м) в метрах integer
timezone идентификатор часового пояса (см. timeZone.txt)
modification date date of last modification in yyyy-MM-dd format

Соответственно, для импорта текстового файла GeoNames с заголовком, можно добавить в начало этого файла следующую строку.

geonameid	name	asciiname	alternatenames	lat	long	fclass	fcode	ccode	cc2	acode1	acode2	acode3	acode4	pop	elev	gtopo	tz	mdate

Недостатки

Главным недостатком данных является использование в качестве источника топонимики картографической базы Google, что ведет к распространению копирайтов Google и на эти данные. В связи с этим данные не рекомендуется использовать в таких проектах, как OpenStreetMap (подробнее).

К другим недостаткам можно отнести:

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

База географических названий GNS

GEOnet Names Server (GNS) — свободно распространяемая база данных имён географических объектов. Используется Федеральным правительством США, но «варианты названий тех или иных объектов, а также связанные с ними данные могут не соответствовать точке зрения правительства». Ограничения по использованию данных отсутствуют.

Каждая запись базы представляет собой текстовую строку, в которой описаны помимо всего прочего: широта/долгота географического объекта, его название в кодировке Unicode UTF-8 и классификационный признак типа объекта (реки, горы, населенные пункты и др.)

География покрытия включает в себя весь мир, за исключением США и Антарктики. GNS содержит порядка 4 миллионов объектов и приблизительно 5.5 миллионов имен. Ежемесячно обновляется в среднем по 20 000 записей данной базы. Последнее обновление произведено 20 апреля 2009 года. Используемая система координат — WGS84, координаты приблизительны и предназначены только для целей поиска.

Получение данных

Полную версию базы GNS на весь мир можно скачать со страницы: http://earth-info.nga.mil/gns/html/namefiles.htm, воспользовавшись гиперссылкой, «Click here to Download a single…». Имя загружаемого архива соответствует дате последнего обновления базы. Архив занимает порядка 300 Мб, несжатые данные — около 900 Мб.

Там же можно получить данные по каждому государству в отдельности в текстовом формате с разделителями (разделитель — символ табуляции). Для этого необходимо выбрать требуемую страну (поле «Country Name») и перейти по гиперссылке «Reading Order». Ссылка для скачивания данных на территорию РФ: http://earth-info.nga.mil/gns/html/cntyfile/rs.zip.

Обработанные данные

Получить подготовленные данные можно выбрав одну из ссылок в таблице. Если вы работаете в ГИС скорее всего вам нужны shape-файлы в кодировке UTF-8. Нажав на дату, можно посмотреть историю обновлений.

Страна Объектов Обновлено Shape-файл, UTF8 Shape-файл, CP1251 CSV-файл, UTF8 CSV-файл, CP1251
РФ 607157 25-08-2010 Скачать Скачать Скачать Скачать
Беларусь 20960 25-08-2010 Скачать Скачать Скачать Скачать
Украина 56156 25-08-2010 Скачать Скачать Скачать Скачать
Казахстан 33379 25-08-2010 Скачать Скачать Скачать Скачать
Таджикистан 7053 25-08-2010 Скачать Скачать Скачать Скачать
Армения 4649 25-08-2010 Скачать Скачать Скачать Скачать
Грузия 14388 25-08-2010 Скачать Скачать Скачать Скачать
Киргизстан 3672 25-08-2010 Скачать Скачать Скачать Скачать
Туркменистан 6308 25-08-2010 Скачать Скачать Скачать Скачать

Наличие обновлений проверяется ежедневно, непосредственно обновление происходит по мере обновления БД (примерно один раз в неделю).

На официальном сайте GNS расположены также инструменты текстового поиска объектов и графического поиска (в случае использования браузера Opera появляется сообщение «Invalid browser detected», с другими браузерами проблем не замечено) с использованием картографической подложки.

Поля базы данных

Подробнее на языке оригинала.

Поле Описание поля Тип поля
RC Код шрифта, определяющий таблицу символов, используемую в полях SHORT_FORM, Generic и Full_Name (см. Character Set Conversion Table):
1
= Америка/Западная Европа;
2 = Восточная Европа;
3 = Африка/Средний Восток;
4 = Россия/Центральная Азия;
5 = Азия/Тихоокеания;
6 = Вьетнам.
Числовой
UFI Уникальный идентификатор объекта. Одному объекту может соответствовать несколько записей. В этом случае поля UFI таких записей будут совпадать. Числовой
UNI Уникальный идентификатор названия объекта. Числовой
LAT Широта объекта в десятичных градусах (± dd.dd…). Для обозначения южной широты используется знак «-«. Числовой
LONG Долгота объекта в десятичных градусах (± dd.dd…). Для обозначения западной долготы используется знак «-«. Числовой
DMS_LAT Широта объекта в формате ГМС (ггммсс). Для обозначения южной широты используется знак «-«. Числовой
DMS_LONG Долгота объекта в формате ГМС (ггммсс). Для обозначения западной долготы используется знак «-«. Числовой
MGRS Военная система координат. Текстовый
JOG Номенклатура листа Joint Operation Graphics, 1:250000 Текстовый
FC Класс объекта. Девять основных типов:
A = Административный район
P = Населенный пункт
V = Растительность
L = Местоположение или область
U = Подводный объект
R = Улицы, шоссе, дороги, железные дороги
T = Объекты рельефа
H = Гидрографические объекты
S = Точечные объекты
Текстовый
DSG Код обозначения объекта. Двух или пятисимвольный код используемый для обозначения типа объекта GNS. В перечень кодов входит более 600 типов объектов. Текстовый
PC Классификатор населенных пунктов. Числовая шкала, обозначающая относительную важность населенного пункта (от 1 — высокая до 5 — низкая). Значение NULL соответствует неустановленной важности. Числовой
CC1 Основной код страны. Двухсимвольный код уникальным образом идентифицирующий геополитическую единицу (страну, подчиненную территорию и т.п.). Текстовый
ADM1 Код административного деления первого уровня. Двухсимвольный буквенно числовой код стандарта FIPS 10-4 описывающий первый уровень деления геополитической единицы, например штат (state) в США. Текстовый
ADM2 Код административного деления второго уровня. Название единицы второго уровня деления геополитической единицы, например округ (county) в США. Текстовый
POP Численность населения. Числовой
ELEV Высота в метрах. Числовой
CC2 Дополнительный код страны. Двухсимвольный буквенный код стандарта FIPS 10-4 уникально описывающий код страны объекта Geoname если он отличен от основного кода страны этого объекта (международные объекты). Текстовый
NT Тип имени:
C = Обычное название
N = Название объекта в стандарте BGN
NS = Название объекта в стандарте BGN в нероманском написании
P = Временное название
PS = Временное название в нероманском написании
H = Историческое название
HS = Историческое название в нероманском написании
D = Непроверенное название
DS = Непроверенное название в нероманском написании
V = Альтернативное название
VS = Альтернативное название в нероманском написании
Текстовый
LC Код языка в стандарте ISO 639-3 Текстовый
SHORT_FORM Сокращенная форма полного названия. Текстовый
GENERIC Описательная часть полного названия (гора, река, море). Текстовый
SORT_NAME Форма полного названия позволяющая осуществлять корректную сортировку в режиме географического справочника (gazetteer). Все символы заменены на латиницу в верхнем регистре, числа заменены на буквы в нижнем регистре (0-9 = a-j), пробелы удалены, запятые заменены на пробелы. Замена производится согласно Character Set Conversion Table [Char_Sets_20060703.pdf]. Текстовый
FULL_NAME Полное название объекта. Представлено в порядке чтения, то есть имеет место запись вида «Гора Эверест», вместо «Эверест, Гора», как хранится в базе данных. Текстовый
FULL_NAME_ То же, что и FULL_NAME, но все символы заменены на латиницу, регистр и пробелы сохранены. Замена производится согласно Character Set Conversion Table Текстовый
MODIFY DATE Дата добавления или изменения объекта (ГГГГ-ММ-ДД). Дата

Недостатки

  • База GNS построена по избыточному принципы, что является плюсом, так как информация не удаляется, но это значительно усложняет работу. Как только то или иное название помещено в базу, оно никогда не удаляется, за исключением очевидных повторений. Поэтому в базе присутствует большое количество вариантов имен объектов, которых на настоящий момент не существует.
  • Географические координаты объектов зачастую очень неточны, расхождения могут достигать 2-3 км.
  • Присутствует некоторое количество некорректных или просто неверных записей: некоторые места, описанные в базе GNS как принадлежащие одной стране, фактически располагаются совершенно в другой.

php: Загрузка городов через jQuery (AJAX)

Автор ekimOFF тут и дамп базы
dump:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
CREATE TABLE `city` (
  `city_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `country_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
  `region_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
  `name` VARCHAR(128) NOT NULL DEFAULT '',
  PRIMARY KEY  (`city_id`),
  KEY `country_id` (`country_id`),
  KEY `region_id` (`region_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 
 
CREATE TABLE `region` (
  `region_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `country_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
  `city_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
  `name` VARCHAR(64) NOT NULL DEFAULT '',
  PRIMARY KEY  (`region_id`),
  KEY `country_id` (`country_id`),
  KEY `city_id` (`city_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 
 
CREATE TABLE `country` (
  `country_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `city_id` INT(11) NOT NULL DEFAULT '0',
  `name` VARCHAR(128) NOT NULL DEFAULT '',
  PRIMARY KEY  (`country_id`),
  KEY `city_id` (`city_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
INSERT INTO `city` VALUES (4400, 3159, 4312, 'Москва');
INSERT INTO `region` VALUES (4312, 3159, 0, 'Москва и Московская обл.');
INSERT INTO `country` VALUES (3159, 0, 'Россия');

При выборе страны (или региона) отсылаем серверному скрипту 2 параметра методом POST:
id – id объекта (страны или региона)
type – тип списка, который нужно получить (города или регионы)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script type="text/javascript">
function getList(type, obj) {
    $("#loading_" + type).show(); // запускаем крутящееся колесико
    $.post("/ajax/city.php", {type: type, id: $("#"+obj).val()}, onAjaxSuccess);
    function onAjaxSuccess(data) {
         out = document.getElementById(type);
         for (var i = out.length - 1; i >= 0; i--) {
              out.options[i] = null;
         }
         eval(data);
         $("#loading_" + type).hide(); // скрываем крутящееся колесико
    }
}
</script>

Во время обращения к серверному скрипту следует оповестить пользователя о том, что идет какой-либо обмен данными (показываем крутящееся колесико загрузки). Индикация во время обмена данными в Web 2.0 играет очень важную роль: посетители могли еще не привыкнуть к таким способам обновления страницы.

Серверная часть

Как только на сервер пришел запрос от клиента (параметры id и type), мы формируем либо список регионов, либо список городов и отправляем его клиенту. Список формируется в виде js-объекта Option а затем, когда ответ пришел клиенту, то этот ответ (текстовая строка) выполняется через eval и получается полноценный html-код из option. Изначально я сразу формировал html-код из option, но в одном из браузеров (по-моему, IE6) он не хотел вставляться в select, поэтому пришлось использовать извращение eval().

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
define("HOST", "localhost");
define("DB", "test_db");
define("USER", "user");
define("PASS", "password");
 
try {
    $dbh = new PDO('mysql:host='.HOST.';dbname='.DB.'', USER, PASS);
 
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}
 
$id   = (int)$_POST['id']; // id объекта (страна или регион)
$type = $_POST['type']; // тип списка, который нужно получить (города или регионы)
 
switch($type){
   case "city":
         // выбираем города в данном регионе
    $sth=$dbh->prepare('SELECT *
                                    FROM city
                                    WHERE region_id = :region_id
                                    ORDER BY name');
    $sth->bindParam(':region_id', $id, PDO::PARAM_INT);
 
    $sth->setFetchMode(PDO::FETCH_ASSOC);
    $sth->execute();
    $count = $sth->rowCount();
    if($count>0){
             echo "out.options[out.options.length] = new Option('выберите город...','none');\n";
        while($city=$sth->fetch()){
             echo "out.options[out.options.length] = new Option('".$city['name']."','".$city['city_id']."');\n";
        }
     }else {
          echo "out.options[out.options.length] = new Option('нет городов','none');\n";
     }
   break;
 
   case "region":
        // выбираем регионы в данной стране
    $sth=$dbh->prepare('SELECT *
                                    FROM city
                                    WHERE country_id = :country_id
                                    ORDER BY name');
    $sth->bindParam(':country_id', $id, PDO::PARAM_INT);
 
    $sth->setFetchMode(PDO::FETCH_ASSOC);
    $sth->execute();
    $count = $sth->rowCount();
    if($count>0){
         echo "out.options[out.options.length] = new Option('выберите регион...','none');\n";
        while($region=$sth->fetch()){
           echo "out.options[out.options.length] = new Option('".$region['name']."','".$region['region_id']."');\n";
        }
     }else {
          echo "out.options[out.options.length] = new Option('нет городов','none');\n";
     }
   break;
 
 
}
?>

Для выборки данных из базы я использую PDO, у автора пример с DBSimple.


http://blog.wel.org.ua

работаю админом, прогером сеошнегом :)

Comments to Есть где взять: Названия городов, населённых пунктов, стран, координаты

  • Спасибо, очень полезная информация. Добавил в закладки.

    Нибиру 04.05.2012 20:26 Ответить
  • Действительно, полезная страница для ищущих базу городов.
    Жаль без адресов — улиц и домов.
    GNS обновили ссылки, кстати.

    George 10.03.2016 00:04 Ответить

Leave a Comment

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Загрузка...
Menu Title