База GeoIP – страны и города, июнь 2011 (+скрипт обновления)

    Вышла в свет обновленная версия русскоязычной базы данных стран и городов. Основные изменения:
    — за счёт новой базы ipgeobase.ru повысилась точность определения городов Украины
    — из бесплатной версии базы geobaza.ru исчезли города, поэтому точность определения городов других стран СНГ понизилась
    — добавлен скрипт, с помощью которого вы можете самостоятельно обновлять базу (без добавления новых городов и стран)
    — таблицы net_ru_2 и net_su удалены из базы, изменены примеры запросов
    Результат этой работы доступен для свободного скачивания.

    База распространяется в двух модификациях: «Страны и города» (21Mb, после установки ~122Mb)  и «Только страны» 2Mb, после установки ~13Mb). Также в архивах находится небольшой пример использования базы данных на php.

    Точность определения страны ~99%, точность определения городов в среднем ~95%.  Много это или мало – зависит от задач, которые собираетесь решать с помощью этой базы.

    Тестовое демо – определение вашей страны и города по IP-адресу

    Рабочее демо — определегие города по IP в форме поиска билетов

    Для установки базы рекомендую воспользоваться программами типа mysqldumper или через ssh выполнить
    mysql –p –uюзер база_данных < файл.sql

    «Скрипт обновления» (~300Kb, после установки ~1Mb) адаптирован только для текущей версии базы (июнь 2011), обновить с его помощью прежние версии невозможно. Для обновления базы импортируйте файл geo_update_2011_06.sql (содержит две технические таблицы), скачайте свежие архивы с maxmind и ipgeobase (см. readme.txt) и запустите из консоли update_maxmind.php и update_ru.php. При обновлении базы городов maxmind выполняется ~4 миллиона select-ов и ~2 миллиона insert-ов, поэтому операция требует значительных ресурсов и времени (~30-60 минут). Обновление базы городов maxmind выполняется 20-30 минут.

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

    В справочнике городов возможны ошибки (в том числе дубли).

    В базе «Только страны» есть блоки IP только европейских стран (из ipgeobase, таблица net_euro) и стран всего мира (в том числе европейских, из maxmind, таблица net_country_ip). Теоретически европейские страны должны точнее определяться по первому варианту, но практической проверки не было.

    Идеи по усовершенствованию и повышению качества базы приветствуются.

    Немного статистики


    В текущей версии базы 94,615 населенных пунктов.

    Количество населенных пунктов по разным странам:
    Страна Количество
    Германия 18,468
    США 15,798
    Италия 6,645
    Австрия 6,417
    Испания 5,721
    Австралия 5,134
    Франция 4,651
    Российская Федерация 3,287
    Канада 3,027
    Польша 2,844
    Бразилия 2,342
    Швейцария 1,814
    Бельгия 1,589
    Япония 1,445
    Португалия 1,289
    Ирландия 1,128
    Аргентина 1,086
    Мексика 1,069
    Украина 800
    Китай 724
    Болгария 615
    Великобритания 585
    Колумбия 545
    Индия 359
    Люксембург 359
    Южно-Африканская Республика 333
    Норвегия 330
    Турция 304
    Новая Зеландия 280
    Венгрия 262
    Сербия 221
    Чили 203
    Казахстан 194
    Филиппины 188
    Чехия 176
    Румыния 171
    Республика Корея 166
    Словакия 161
    Швеция 159
    Нидерланды 157
    Хорватия 141
    Эквадор 141
    Финляндия 134
    Гватемала 126
    Венесуэла 123
    Гондурас 121
    Беларусь 102
    Иран 96
    Греция 96
    Литва 95
    Израиль 91
    Латвия 89
    Эстония 85
    Молдова 85
    Тринидад и Тобаго 79
    Перу 69
    Барбадос 56
    Ямайка 56
    Коста-Рика 56
    Индонезия 56
    Доминиканская республика 53
    Маврикий 52
    Дания 51
    Египет 46
    Марокко 43
    Македония 41
    Армения 40
    Нигерия 39
    Вьетнам 38
    Алжир 38
    Уругвай 36
    Панама 36
    Сальвадор 33
    Словения 30
    Малайзия 30

    В остальных странах менее 30 населенных пунктов.

    Добавлено 09.06.2011
    Оптимизирован скрипт обновления базы maxmind, операция выполняется быстрее и потребляет меньше вычислительных ресурсов. Благодарю shushu за полезный совет.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 35

      +1
      Спасибо.
      В архиве обнаружил файл lib.php, в котором хранятся две функции для преображования ip в число и обратно. Скажите, а чем Вас не устроили втроенные функции PHP: ip2long (long2ip)?
        +4
        Справедливое замечание. Раньше я не знал об этих функциях, сейчас не хочется без нужды править рабочий код.
        • UFO just landed and posted this here
            0
            каким?
              +1
              php ip2long() != mysql inet_aton(); php long2ip() != mysql inet_ntoa()
              в этом всё дело. мускульная версия возвращает unsigned и поэтому с адресами из похапе не получится работать в мускуле и наоборот
                0
                А с функциями автора проблем не будет?
                Вот например, одна из них:
                // Преобразуем ip в число
                function ip2int($ip)
                {
                $part = explode(".", $ip);
                $int = 0;
                if (count($part) == 4) {
                $int = $part[3] + 256 * ($part[2] + 256 * ($part[1] + 256 * $part[0]));
                }
                return $int;
                }
                  +2
                  Что касается ip2long, то можно сделать вот так:
                  $ip_dotted = '127.0.0.1';
                  $ip_long = sprintf("%u", ip2long($ip_dotted));

                  И проблем с inet_aton() не должно быть.
                • UFO just landed and posted this here
              0
              В избранное, спасибо!
                0
                +1
                  +1
                  Вопрос: А есть ли подобные базы с ipv6 адресами?
                    +1
                    Вот тут например.
                    0
                    Вот спасибо!
                      +4
                      >> поэтому операция требует значительных ресурсов и времени (~30-60 минут).

                      В вашем скрипте используется одиночные инсерты.
                      Что бы увеличить скорость работы скрипта сделайте:
                      insert into (..) values (...), (...), (...)… (...) до 100-1000 таких блоков, больше не нужно. Скорость выполнения повысится на порядок.
                        +1
                        Благодарю за совет, поэкспериментирую.
                          +1
                          Когда-то писал либу CachedInsert для PHP: записи insert'ятся блоками по достижению указанного количества вставок. Могу поделиться, использовал для работы с данными OSM, ощутимо прибавляло производительности.
                        0
                        дня за три до этого поста я скачал вашу базу:)

                        у меня несколько вопросов:

                        1) net_city_ip, net_ru, net_ru_2, net_su — почему несколько таблиц для связи ip и городов? чем они отличаются?
                        2) в таблице net_city есть поле region — он уникален в пределах страны? Что это вообще за обозначение такое? ( дайте ссылку на википедию, если можно )

                        Кстати в вашей базе я нашел дубль с одинаковым country_id и region — город Мюнхен в Германии. Вы бы скриптом прошлись для удаления записей с одинаковым именем, country_id и region…
                          0
                          1.
                          net_city_ip — блоки IP городов из maxmind (весь мир)
                          net_ru — блоки IP городов из ipgeobase (Россия и Украина)
                          (обе таблицы привязаны к справочнику net_city)
                          net_ru_2 и net_su больше не используются (были в прошлой версии базы)

                          2. Поле region взято из данных maxmind и содержит много ошибок (может быть кроме штатов США).
                            0
                            ясно, спасибо
                          +1
                          Для последнего проекта не нашли ничего лучше для определения региона в России, чем ipgeobase. Есть модуль для интеграции ipgeobase в django.

                          Ваш вариант, конечно, намного интересней, но до июня обновлений вроде не было базы? А последний апдейт был зимой, кажется.
                            0
                            Если вам нужна только Россия и/или Украина, то однозначно лучший вариант ipgeobase. Основное отличие моей сборки в том, что за счет maxmind кое-как определяет города по всему миру (пока далеко от идеала, есть над чем работать) и есть названия на русском и английском (иногда с ошибками).
                              0
                              Меня в основном смущает, что база до сего дня не обновлялась, а сейчас обновляется, но без добавления новых городов.

                              Ну и ~4 миллиона select-ов и ~2 миллиона insert-ов это, конечно, жестоко. С инсёртами подсказали уже выше, я думаю селекты тоже можно уменьшить как-нибудь.
                                0
                                maxmind обновляет базу раз в месяц (1-2 числа). Скрипт обновления можно (нужно) запускать на локальной машине, а потом выкладывать дамп на сервер.

                                Есть идеи качественного улучшения базы, но когда дойдут руки до этого не могу сказать, ничего не обещаю.
                            0
                            Спасибо, нужная вещь. Косяков правда хватает. Например, с 95.28.226.140 демка меня отправляет в Питер (а я в Москве).
                              0
                              Определение городов всегда было весьма условным, особенно если IP принадлежат крупным провайдерам, охватывающим несколько регионов.
                            • UFO just landed and posted this here
                                +1
                                Очевидное решение — сделать автоподстановку страны и города по IP с возможностью ручного выбора пользователем. Если скрипт угадает правильно, то посетителю не придется делать лишние движения, а не угадает — посетитель исправит ошибку.

                                По поводу Qt4 ничего не могу сказать, не в теме.
                                • UFO just landed and posted this here
                                    0
                                    Боюсь, не смогу вам помочь. Теоретически вы можете использовать справочники из базы без заморочек на IP (net_country — страны, net_city- города). Каким именно их подключить в Qt я не знаю.
                                0
                                Оптимизирован скрипт обновления базы maxmind, операция выполняется быстрее и потребляет меньше вычислительных ресурсов. Благодарю shushu за полезный совет.
                                • UFO just landed and posted this here
                                    0
                                    Хотелось бы регионы получить для всех стран. В net_city номер в поле region для всех проставлен, но таблицы нет соответсвующей. Можно выцепить данные регионы РФ и Украины из другой таблицы, но этого мало. Ведь эти данные должны где-то быть, region то не просто так наверно проставлялся?
                                      0
                                      Справочник регионов www.maxmind.com/app/fips10_4
                                      Но как минимум по России в этом справочнике есть ошибки и дубли. Другие страны не проверял.
                                      0
                                      В БД есть 7 несоответствий между net_city и net_t_city, выявляются по запросу:

                                      SELECT * FROM `net_city`
                                      INNER JOIN `net_t_city`
                                      WHERE
                                      net_city.id = net_t_city.link_id AND
                                      net_city.name_ru <> net_t_city.name


                                      Две ошибки:

                                      ID 33912 из net_city ошибочно указано, должен быть Ростов, а указан Ростов-на-Дону.
                                      ID 75169 из net_city так же не верно русское название, написан Арзамас, по координатам это Саров.

                                      Остальные 5 — разные написания, не критично (с дефисами и сокращениями).

                                      А для чего таблица net_t_dub, кто-нибудь может подсказать?
                                        0
                                        Очень было бы здорово, если появился бы апйдет. Спасибо!

                                        Only users with full accounts can post comments. Log in, please.