Baza wszystkich miejscowości w Polsce (130 tys.) w SQL i CSV

Do nowego projektu potrzebowałem spisu wszystkich miejscowości w Polsce, wraz z podziałem administracyjnym. Z pomocą przyszła baza TERYT, czyli „Krajowy Rejestr Urzędowego Podziału Terytorialnego Kraju” prowadzony przez GUS i dostępny na tej stronie. Niestety publikowane tam dane są w formacie XML i nie tak łatwo przenieść je do MySQLa, w którym będzie działać aplikacja. Postanowiłem przekonwertować plik na format CSV z pomocą tego krótkiego skryptu PHP:

$xml   = DOMDocument::load('./simc.xml');
$csv = '';
$rows = $xml->getElementsByTagName('row');
$k = 0;
foreach($rows as $row)
{
    $cols = $row->getElementsByTagName('col');
    $values = array();
    foreach($cols as $col)
    {
        $name = $col->getAttribute('name');
        $value = $col->nodeValue;
        $values[$name] = $value;
    }
    $i = 0;
    foreach($values as $key=>$value)
    {
           if($i>0) $csv .= "\t";
           $csv .= $value;
           $i++;
    }
    $csv .= "\n";
    $k++;
    echo "$k. linia\n";
}
file_put_contents('./simc.csv',$csv);

Skrypt musi zostać uruchomiony w tym samym katalogu, co plik simc.xml (zawierający spis miejscowości) i wynikiem jego działania jest simc.csv. Równie dobrze można z jego pomocą przerobić plik terc.xml z podziałem administracyjnym Polski.

Jeśli jednak nie masz zamiaru bawić się w samodzielną przeróbkę i szukasz tylko bazy w CSV lub SQLu, to są właśnie poniżej:

6 komentarzy to “Baza wszystkich miejscowości w Polsce (130 tys.) w SQL i CSV

  • Masz u mnie za to piwo

  • Angielskie
    5 lat ago

    a masz bazę miast angielskich? 😀

  • marcin
    3 lata ago

    u mnie też masz piwo 🙂

  • Tobor Retsam
    2 lata ago

    Bardzo przydatne, chociaż dane mają już cztery lata. Muszę się dostać do plików CSV w GUSie. Baza w Sqlite3 nie może być utworzona przez proponowany plik SQL. Właściwy format dla sqlite3 (schemat):
    CREATE TABLE ‚miejscowosci’ (
    ‚woj’ int(2) DEFAULT NULL,
    ‚pow’ int(2) DEFAULT NULL,
    ‚gmi’ int(2) DEFAULT NULL,
    ‚rgmi’ int(1) DEFAULT NULL,
    ‚rm’ int(2) DEFAULT NULL,
    ‚mz’ int(1) DEFAULT NULL,
    ‚nazwa’ varchar(36) DEFAULT NULL,
    ‚sym’ int(7) NOT NULL DEFAULT ‚0’ PRIMARY KEY,
    ‚sympod’ int(7) DEFAULT NULL
    );
    CREATE INDEX ‚naz’ ON miejscowosci(nazwa);
    CREATE INDEX ‚woj’ ON miejscowosci(woj);
    CREATE INDEX ‚pow’ ON miejscowosci(pow);

    Po czym należy edytować csv likwidując ostatnią kolumnę (ta sama data uaktualnienia). Po utworzeniu bazy, ‚.import’ pozwala na utworzenie bazy w około sekundę.

  • Szukałem bazy, ale aktualnej nie znalazłem. Stworzyłem mały konwerter dostępny tutaj, jakby ktoś potrzebował.

  • Szukałem bazy, ale aktualnej nie znalazłem. Stworzyłem mały konwerter dostępny tutaj, jakby ktoś potrzebował https://github.com/seigieu/teryt2sql
    (w poprzednim komentarzu link się nie wkleił)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *