Есть где взять: Названия городов, населённых пунктов, стран, координаты
База географических названий 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.