Giter VIP home page Giter VIP logo

ruian2sql's Introduction

ruian2SQL

Nástroj pro import adresních míst Státní správy zeměměřictví a katastru do SQL databáze

Formát vstupních dat

(https://www.cuzk.cz/Uvod/Produkty-a-sluzby/RUIAN/2-Poskytovani-udaju-RUIAN-ISUI-VDP/Dopady-zmeny-zakona-c-51-2020-Sb/Adresni-mista-CSV_atributy.aspx)

time tracker

Požadavky

  • PHP7+ (testováno na 7.2) - popular general-purpose scripting language
  • SQL databáze - podporovaná nástrojem phinx: MySQL,PostgreSQL,SQLite,MsSQL
  • composer - Dependency Manager for PHP
  • phing - a PHP project build system or build tool based on Apache Ant.
  • phinx - PHP Database Migrations For Everyone

Postup

Nejprve je třeba si připravit databázi:

MySQL

Aby se data naimportovala je třeba nastavit hodnotu max_allowed_packet na 100M

mysqladmin -u root -p create ruian_devel
mysql -u root -p -e "GRANT ALL PRIVILEGES ON ruian_devel.* TO 'ruian'@'localhost' IDENTIFIED BY 'ruian'"

PostgreSQL

sudo -u postgres bash -c "psql -c \"CREATE USER ruian WITH PASSWORD 'ruian';\""
sudo -u postgres bash -c "psql -c \"create database ruian with owner ruian encoding='utf8' template template0;\""

Přihlašovací údaje do databáze je třeba zadat do souboru [phinx.yml]

Spuštění

Pokud nepoužíváme globálně dostupný příkaz phinx je třeba jej doinstalovat.

composer install

Spolu s ním se doinstaluje i lokální verze příkazu phing

Import dat do databáze zahájme poté příkazem phing nebop ./vendor/bin/phing

  1. Tento stahne z internetu archiv adresních míst.
  2. Rozbalí jej
  3. Vytvoří v databázi prázdnou tabulku places (příkaz phinx migrate)
  4. Naimportuje data z rozbalených CSV souborů (příkaz phinx seed:run -s Places)

Pokud vše dopadne dobře, najdete v databázi tabuku ruian_devel obsahující 2.921.779 záznamů:

Struktura Databáze

CREATE TABLE `places` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `adm` int(11) unsigned DEFAULT NULL COMMENT 'Kód ADM',
  `code` int(11) unsigned DEFAULT NULL COMMENT 'Kód obce',
  `name` varchar(255) DEFAULT NULL COMMENT 'Název obce',
  `momc_code` int(11) unsigned DEFAULT NULL COMMENT 'Kód MOMC',
  `momc_name` varchar(255) DEFAULT NULL COMMENT 'Název MOMC',
  `mop_code` int(11) unsigned DEFAULT NULL COMMENT 'Kód MOP',
  `mop_name` varchar(255) DEFAULT NULL COMMENT 'Název MOP',
  `district_code` int(11) unsigned DEFAULT NULL COMMENT 'Kód části obce',
  `district_name` varchar(255) DEFAULT NULL COMMENT 'Název části obce',
  `street_code` int(11) unsigned DEFAULT NULL COMMENT 'Kód ulice',
  `street_name` varchar(255) DEFAULT NULL COMMENT 'Název ulice',
  `so_type` varchar(255) DEFAULT NULL COMMENT 'Typ SO',
  `house_number` int(11) unsigned DEFAULT NULL COMMENT 'Číslo domovní',
  `orientation_number` int(11) unsigned DEFAULT NULL COMMENT 'Číslo orientační',
  `orientation_number_mark` varchar(255) DEFAULT NULL COMMENT 'Znak čísla orientačního',
  `zip` varchar(5) DEFAULT NULL COMMENT 'PSČ',
  `y` float unsigned DEFAULT NULL COMMENT 'S-JTSK Souřadnice Y',
  `x` float unsigned DEFAULT NULL COMMENT 'S-JTSK Souřadnice X',
  `latitude` decimal(30,10) unsigned DEFAULT NULL COMMENT 'WGS 84 Y',
  `longitude` decimal(30,10) unsigned DEFAULT NULL COMMENT 'WGS 84 X',
  `valid_from` datetime DEFAULT NULL COMMENT 'Platí Od',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_adm` (`adm`),
  KEY `idx_code` (`code`),
  KEY `idx_name` (`name`),
  KEY `idx_stret_name` (`street_name`),
  KEY `idx_house_number` (`house_number`),
  KEY `idx_orientation_number` (`orientation_number`),
  KEY `idx_zip` (`zip`),
  KEY `gps` (`x`,`y`),
  KEY `gps_reverse` (`y`,`x`)
) ENGINE=InnoDB AUTO_INCREMENT=2921780 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Adresní místa z celé ČR';

PhpMyAdmin

Příklad použití

Příklad funkce která vrátí nejbližší adresu od hledaných souřadnic:

class Places extends \Ease\SQL\Engine {

    public $myTable = 'places';

    public function findClosestPlace($long, $lat) {
        return $this->listingQuery()->disableSmartJoin()->select(new \Envms\FluentPDO\Literal('ROUND(3959 * ACOS(COS(RADIANS(' . $lat . ')) * COS(RADIANS(latitude)) * COS(RADIANS(longitude) - RADIANS(' . $long . ')) + SIN(RADIANS(' . $lat . ')) * SIN(RADIANS(latitude)))) AS distance'))->orderBy('distance')->limit(1);
    }
}

(Psáno s použitím https://github.com/VitexSoftware/php-ease-fluentpdo)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.