Databáze PSČ, měst, obcí a krajů pro ČR a SK

Zdrojem databáze je česká pošta (zákaznické výstupy) a slovenská pošta (poštovné směrovací čísla) ve formátu Excel/CSV.

Aktualizace: 17.08.2017

Edit 24.10.2017: Možná ještě koukněte na tuhle veřejnou API, mají tam i seznam krajů apod.

Seznam PSČ stáhni zde (pro vložení do databáze - formát SQL):

Použitý skript:

<?php
header(
"Content-Type: text/html; encoding=UTF-8");

function fixCSV($csv)
// odstraní uvozovky a new lines
{
   $csv = preg_replace_callback(
'~(^|;|\r\n)"([^"]*)"($|;|\r\n)~si', function($m) { 
       return strtr($m[1], array(
";" => ",", "\r\n" => " ")); 
   }, $csv);
    
   return $csv
}

require
'db.php';

/*
Kraje jsou doplněny podle počátečních čísel (nepřesné).
Pro přesnost je nutno doplnit z jiné databáze, což nevím kde,
protože na ČSÚ číselníku chybí PSČ (je tam jen kód obce a název obce)
*/
$kraje = array(
   
'1' => 'Hlavní město Praha', // CZ
   
'2' => 'Středočeský',
   
'3' => 'Jihočeský a Západočeský',
   
'4' => 'Severočeský',
   
'5' => 'Východočeský (+část Jihomoravského)',
   
'6' => 'Jihomoravský',
   
'7' => 'Severomoravský',
   
'8' => 'Bratislava a okolí', // SK
   
'9' => 'Západoslovenský a Středoslovenský', // SK
   
'0' => 'Středoslovenský a Východoslovenský', // SK
);

// XSL soubor stáhnete na CeskaPosta.cz, otevřete v Excel a uložte jako CSV
// stejný způsob platí pro Slovensko
$csv = file_get_contents('cz2.csv');
$csv = iconv(
'CP1250', 'UTF-8//TRANSLIT//IGNORE', $csv);
$csv = fixCSV($csv);

$lines = explode(
"\r", $csv);

$first = false;
foreach ($lines as $line)
{
   if (!$first) {
       $first = true;
       continue;
   }
   
   
// Array ( [0] => NAZCOBCE [1] => PSC
       //      [2] => NAZPOST [3] => KODOKRESU [4] => NAZOKRESU [5] => NAZOBCE ) 
   
   
$cols = explode(";", $line);
   foreach ($cols as &$col) {
       $col = trim($col);
   }
   unset($col);
   
   if (!isset($cols[1])) continue;
   $psc = str_replace(
" ", "", $cols[1]);
   if (!$psc) continue;
   
   $kraj = isset($kraje[ $psc{0} ]) ? $kraje[ $psc{0} ] :
'';
   
   $ins = array();
   $ins[
'psc'] = safeSQL($cols[1]);
   $ins[
'mesto'] = safeSQL($cols[5]);
   $ins[
'okres'] = safeSQL($cols[4]);
   $ins[
'kraj'] = safeSQL($kraj);
   $ins[
'stat'] = safeSQL('CZ');
   
   $db->qinsert(
"psc", $ins);
}