515 lines
14 KiB
PHP
Executable File
515 lines
14 KiB
PHP
Executable File
#!/usr/bin/php
|
|
<?php
|
|
|
|
//require 'vendor/autoload.php';
|
|
require("../../config/config.php");
|
|
|
|
define('FRONKDB_SQLDEBUG',false);
|
|
error_reporting(E_ALL & ~(E_NOTICE | E_STRICT | E_DEPRECATED));
|
|
|
|
require_once(LIBDIR."/mvcfronk/mfRouter/mfRouter.php");
|
|
require_once(LIBDIR."/mvcfronk/mfBase/mfBaseModel.php");
|
|
require_once(LIBDIR."/mvcfronk/mfBase/mfBaseController.php");
|
|
|
|
$me = new User(1);
|
|
|
|
$gemeinden_cache = [];
|
|
$ortschaft_cache = [];
|
|
$strasse_cache = [];
|
|
$plz_cache = [];
|
|
|
|
$folder = BASEDIR."/scripts/addressdb/import/bev";
|
|
$db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
|
|
$log = mfLoghandler::singleton();
|
|
|
|
/*
|
|
* Import Gemeinden
|
|
*/
|
|
|
|
$filename = "$folder/GEMEINDE.csv";
|
|
$input = fopen($filename, "r");
|
|
|
|
$db->query("SET autocommit=0");
|
|
$i = 0;
|
|
while($csv = fgetcsv($input, 0, ";")) {
|
|
$i++;
|
|
if($i == 1) continue;
|
|
|
|
if(!trim($csv[0])) {
|
|
continue;
|
|
} else {
|
|
$gkz = trim($csv[0]);
|
|
$gemeinde_name = trim($csv[1]);
|
|
|
|
$gemeinde = getGemeinde($gkz);
|
|
if(!$gemeinde) {
|
|
// create Gemeinde
|
|
$gemeinde = ADBGemeindeModel::create([
|
|
'kennziffer' => $gkz,
|
|
'code' => $gkz,
|
|
'name' => $gemeinde_name
|
|
]);
|
|
$gemeinde_id = $gemeinde->save();
|
|
if(!$gemeinde_id) {
|
|
die("Fehler beim Speichern der Gemeinde ($gkz, $gemeinde_name)\n");
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
$db->query("COMMIT");
|
|
echo ($i-1)." Gemeinden importiert\n";
|
|
|
|
/*
|
|
* Import Ortschaften
|
|
*/
|
|
|
|
$filename = "$folder/ORTSCHAFT.csv";
|
|
$input = fopen($filename, "r");
|
|
|
|
$db->query("SET autocommit=0");
|
|
$i = 0;
|
|
while($csv = fgetcsv($input, 0, ";")) {
|
|
$i++;
|
|
if($i == 1) continue;
|
|
|
|
if(!trim($csv[0])) {
|
|
continue;
|
|
} else {
|
|
$gkz = trim($csv[0]);
|
|
$okz = trim($csv[1]);
|
|
$ortschaft_name = trim($csv[2]);
|
|
|
|
$gemeinde = getGemeinde($gkz);
|
|
if(!$gemeinde) {
|
|
die("Kann Ortschaft nicht importieren: Gemeinde nicht gefunden ($gkz)\n");
|
|
}
|
|
|
|
$ortschaft = ADBOrtschaftModel::getFirst(["kennziffer" => $okz]);
|
|
if(!$ortschaft) {
|
|
$ortschaft = ADBOrtschaftModel::create([
|
|
'gemeinde_id' => $gemeinde->id,
|
|
'kennziffer' => $okz,
|
|
'name' => $ortschaft_name
|
|
]);
|
|
$ortschaft_id = $ortschaft->save();
|
|
if(!$ortschaft_id) {
|
|
die("Fehler beim Speichern der Ortschaft ($okz, $ortschaft_name)\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
$db->query("COMMIT");
|
|
echo ($i-1)." Ortschaften importiert\n";
|
|
|
|
/*
|
|
* Import Strassen
|
|
*/
|
|
|
|
$filename = "$folder/STRASSE.csv";
|
|
$input = fopen($filename, "r");
|
|
|
|
$db->query("SET autocommit=0");
|
|
$i = 0;
|
|
while($csv = fgetcsv($input, 0, ";")) {
|
|
$i++;
|
|
if($i == 1) continue;
|
|
|
|
if($i % 1000 == 0) {
|
|
echo ".";
|
|
}
|
|
|
|
if(!trim($csv[0])) {
|
|
continue;
|
|
} else {
|
|
$skz = trim($csv[0]);
|
|
$strasse_name = trim($csv[1]);
|
|
$gkz = trim($csv[4]);
|
|
|
|
if(!$skz) continue;
|
|
|
|
$gemeinde = getGemeinde($gkz);
|
|
if(!$gemeinde) {
|
|
die("Kann Strasse nicht importieren: Gemeinde nicht gefunden ($gkz)\n");
|
|
}
|
|
|
|
$strasse = ADBStrasseModel::getFirst(["kennziffer" => $skz]);
|
|
if(!$strasse) {
|
|
if($gemeinde->id == 1) {
|
|
// Adresse in Premstaetten
|
|
// try to find strasse by fuzzy name
|
|
$strasse_search = [$db->escape($strasse_name)];
|
|
|
|
if(strpos($strasse_name, ' ') !== false) $strasse_search[] = $db->escape(str_replace(' ', '-', $strasse_name));
|
|
if(strpos($strasse_name, '-') !== false) $strasse_search[] = $db->escape(str_replace('-', ' ', $strasse_name));
|
|
if(strpos($strasse_name, '.') !== false) $strasse_search[] = $db->escape(str_replace('.', '. ', $strasse_name));
|
|
if(strpos($strasse_name, '.') !== false) $strasse_search[] = $db->escape(str_replace('.', '.-', $strasse_name));
|
|
if(strpos($strasse_name, '. ') !== false) $strasse_search[] = $db->escape(str_replace('. ', '.', $strasse_name));
|
|
if(strpos($strasse_name, '. ') !== false) $strasse_search[] = $db->escape(str_replace('. ', '.-', $strasse_name));
|
|
if(strpos($strasse_name, '.') !== false) $strasse_search[] = $db->escape(str_replace('.-', '.', $strasse_name));
|
|
if(strpos($strasse_name, '.') !== false) $strasse_search[] = $db->escape(str_replace('.-', '. ', $strasse_name));
|
|
|
|
foreach($strasse_search as $search) {
|
|
if(strpos($search, 'ß') !== false) $strasse_search[] = $db->escape(str_replace('ß', 'ss', $search));
|
|
if(strpos($search, 'ä') !== false) $strasse_search[] = $db->escape(str_replace('ä', 'ae', $search));
|
|
if(strpos($search, 'ö') !== false) $strasse_search[] = $db->escape(str_replace('ö', 'oe', $search));
|
|
if(strpos($search, 'ü') !== false) $strasse_search[] = $db->escape(str_replace('ü', 'ue', $search));
|
|
|
|
if(strpos($search, 'ss') !== false) $strasse_search[] = $db->escape(str_replace('ss', 'ß', $search));
|
|
if(strpos($search, 'ae') !== false) $strasse_search[] = $db->escape(str_replace('ae', 'ä', $search));
|
|
if(strpos($search, 'oe') !== false) $strasse_search[] = $db->escape(str_replace('oe', 'ö', $search));
|
|
if(strpos($search, 'ue') !== false) $strasse_search[] = $db->escape(str_replace('ue', 'ü', $search));
|
|
}
|
|
|
|
|
|
$strasse_ids = [];
|
|
|
|
$sql = "SELECT * FROM Strasse WHERE name IN ('". implode("', '", $strasse_search)."') AND gemeinde_id=".$gemeinde->id;
|
|
//echo $sql."\n";
|
|
$res = $db->query($sql);
|
|
if($db->num_rows($res) > 1) {
|
|
echo "Found multiple streets for '$strasse_name' in Gemeinde ".$gemeinde->name." (".$gemeinde->id.")\n";
|
|
while($data = $db->fetch_object($res)) {
|
|
$strasse_ids[] = $data->id;
|
|
}
|
|
} elseif($db->num_rows($res)) {
|
|
$data = $db->fetch_object($res);
|
|
$strasse_ids[] = $data->id;
|
|
//echo "Found matching street for '$strasse_name': ".$data->name."\n";
|
|
}
|
|
|
|
if(count($strasse_ids)) {
|
|
// update skz for eisting streets
|
|
foreach($strasse_ids as $strasse_id) {
|
|
$strasse = new ADBStrasse($strasse_id);
|
|
$strasse->kennziffer = $skz;
|
|
|
|
if($strasse_name != $strasse->name) {
|
|
echo "Updating strasse name from '".$strasse->name."' to '$strasse_name' (".$strasse->id.")\n";
|
|
$strasse->name = $strasse_name;
|
|
}
|
|
|
|
if(!$strasse->save()) {
|
|
echo "Fehler beim Speichern der Strase ($skz, $strasse_name, ".$gemeinde->name.")\n";
|
|
}
|
|
}
|
|
} else {
|
|
// create strasse
|
|
|
|
$strasse = ADBStrasseModel::create([
|
|
'gemeinde_id' => $gemeinde->id,
|
|
'kennziffer' => $skz,
|
|
'name' => $strasse_name
|
|
]);
|
|
$strasse_id = $strasse->save();
|
|
if(!$strasse_id) {
|
|
die("Fehler beim Speichern der Ortschaft ($okz, $ortschaft_name)\n");
|
|
}
|
|
}
|
|
} else {
|
|
// nicht in premstätten
|
|
// create strasse
|
|
|
|
$strasse = ADBStrasseModel::create([
|
|
'gemeinde_id' => $gemeinde->id,
|
|
'kennziffer' => $skz,
|
|
'name' => $strasse_name
|
|
]);
|
|
$strasse_id = $strasse->save();
|
|
if(!$strasse_id) {
|
|
die("Fehler beim Speichern der Ortschaft ($okz, $ortschaft_name)\n");
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
$db->query("COMMIT");
|
|
echo "\n".($i-1)." Straßen importiert\n";
|
|
|
|
|
|
$filename = "$folder/ADRESSE.csv";
|
|
//$filename = "$folder/premstaetten_hauptstrasse.csv";
|
|
$input = fopen($filename, "r");
|
|
|
|
$db->query("SET autocommit=0");
|
|
|
|
$current_skz = false;
|
|
$current_gkz = false;
|
|
$sdata = [];
|
|
$i = 0;
|
|
while($csv = fgetcsv($input, 0, ";")) {
|
|
$i++;
|
|
if($i == 1) continue;
|
|
|
|
if($i % 1000 == 0) {
|
|
echo ".";
|
|
}
|
|
if($i % 10000 == 0) {
|
|
echo "$i";
|
|
}
|
|
|
|
|
|
if(!trim($csv[0])) {
|
|
continue;
|
|
}
|
|
|
|
|
|
|
|
$adrcd = trim($csv[0]);
|
|
$gkz = trim($csv[1]);
|
|
$okz = trim($csv[2]);
|
|
$plz_string = trim($csv[3]);
|
|
$skz = trim($csv[4]);
|
|
|
|
$hnz1 = trim($csv[7]);
|
|
$hnb1 = trim($csv[8]);
|
|
$hnv = trim($csv[9]);
|
|
$hnz2 = trim($csv[10]);
|
|
$hnb2 = trim($csv[11]);
|
|
|
|
$hausnummer_string = makeHausnummer($hnz1, $hnz2, $hnv, $hnb1, $hnb2);
|
|
if(!$hausnummer_string) {
|
|
continue;
|
|
//die("Keine Hausnummer: adrcd $adrcd, gkz $gkz, okz $okz, skz $skz, $hnz1, $hnb1, $hnv, $hnz2, $hnb2\n");
|
|
}
|
|
|
|
if($skz == $current_skz) {
|
|
$sdata[(string)$hausnummer_string] = [
|
|
"adrcd" => $adrcd,
|
|
"gkz" => $gkz,
|
|
"okz" => $okz,
|
|
"plz" => $plz_string,
|
|
"skz" => $skz,
|
|
"hausnummer" => $hausnummer_string
|
|
];
|
|
continue;
|
|
}
|
|
|
|
|
|
if($current_skz) {
|
|
insertUpdateHausnummer($sdata, $current_gkz, $current_skz);
|
|
}
|
|
|
|
$current_skz = $skz;
|
|
$current_gkz = $gkz;
|
|
$sdata = [];
|
|
$sdata[(string)$hausnummer_string] = [
|
|
"adrcd" => $adrcd,
|
|
"gkz" => $gkz,
|
|
"okz" => $okz,
|
|
"plz" => $plz_string,
|
|
"skz" => $skz,
|
|
"hausnummer" => $hausnummer_string
|
|
];
|
|
|
|
}
|
|
|
|
insertUpdateHausnummer($sdata, $current_gkz, $current_skz);
|
|
|
|
|
|
$db->query("COMMIT");
|
|
|
|
function insertUpdateHausnummer($sdata, $current_gkz, $current_skz) {
|
|
global $db;
|
|
|
|
$gemeinde = getGemeinde($current_gkz);
|
|
if(!$gemeinde) {
|
|
die("Kann Adresse nicht importieren: Gemeinde nicht gefunden ($gkz)\n");
|
|
}
|
|
|
|
$strasse = getStrasse($current_skz);
|
|
if(!$strasse) {
|
|
die("Kann Adresse nicht importieren: Strasse nicht gefunden ($okz)\n");
|
|
}
|
|
|
|
// do database work for all sdata
|
|
$hausnummern_filter = [];
|
|
|
|
foreach($sdata as $s) {
|
|
$plz = getPlz($s["plz"], $gemeinde->id);
|
|
if(!$plz) {
|
|
$plz = ADBPlzModel::create([
|
|
"gemeinde_id" => $gemeinde->id,
|
|
"plz" => $s["plz"],
|
|
"plzstring" => $s["plz"]
|
|
]);
|
|
if(!$plz->save()) {
|
|
die("Cannot create PLZ $plz_string (gemeinde ".$gemeinde->id.")\n");
|
|
}
|
|
}
|
|
|
|
$hausnummern_filter[] = $s['hausnummer'];
|
|
}
|
|
|
|
|
|
$hausnummern = ADBHausnummerModel::search(["strasse_id" => $strasse->id, "hausnummer" => $hausnummern_filter]);
|
|
$new_hausnummern = [];
|
|
|
|
foreach($sdata as $shausnummer => $s) {
|
|
//echo "Hausnummer $shausnummer (strasse ".$strasse->id.") :\n";
|
|
$found = false;
|
|
$ort = getOrtschaft($s['okz']);
|
|
if(!$ort->id) die("Ortschaft nicht gefunden ".$s['okz']);
|
|
|
|
foreach($hausnummern as $h) {
|
|
|
|
/*if($h->hausnummer == $shausnummer) {
|
|
echo "if(".$h->hausnummer." == ".$shausnummer." && ".$h->ortschaft_id." == ".$ort->id.") \n";
|
|
}*/
|
|
|
|
if($h->hausnummer == $shausnummer && $h->ortschaft_id == $ort->id) {
|
|
//exists already
|
|
//echo "found\n";
|
|
$found = true;
|
|
|
|
// check to update plz
|
|
if($h->plz->plz != $s['plz'] ) {
|
|
echo "Updating PLZ for Hausnummer ".$h->id." from ".$h->plz->plz." to ".$s["plz"]."\n";
|
|
$plz = getPlz($s['plz'], $gemeinde->id);
|
|
$h->plz_id = $plz->id;
|
|
$h->save();
|
|
}
|
|
continue;
|
|
}
|
|
}
|
|
if(!$found) {
|
|
//echo "not found ($shausnummer)\n";
|
|
$new_hausnummern[$shausnummer] = $s;
|
|
}
|
|
}
|
|
//$new_hausnummern = $sdata;
|
|
|
|
|
|
|
|
if(count($new_hausnummern)) {
|
|
$insert = "INSERT INTO `Hausnummer` (`netzgebiet_id`, `adrcd`, `ortschaft_id`, `plz_id`, `strasse_id`, `hausnummer`, `freigabe`, `create`, `edit`) VALUES ";
|
|
foreach($new_hausnummern as $h_string => $s) {
|
|
//var_dump($h_string, $s);exit;
|
|
//$h_string = $h->hausnummer;
|
|
//$s = $sdata[$h_string];
|
|
$acode = $s["adrcd"];
|
|
$strasse_id = $strasse->id;
|
|
$plz = getPlz($s['plz'],$gemeinde->id);
|
|
if(!$plz) {
|
|
var_dump($s);exit;
|
|
}
|
|
$plz_id = $plz->id;
|
|
$ortschaft = getOrtschaft($s["okz"]);
|
|
if(!$ortschaft) {
|
|
die("Kann Adresse nicht importieren: Ortschaft nicht gefunden (strasse: hausnummer: $h_string, okz: ".$sdata[$h_string]["okz"].")\n");
|
|
}
|
|
$ortschaft_id = $ortschaft->id;
|
|
|
|
$freigabe = "NULL";
|
|
$netzgebiet_id = 0;
|
|
if($gemeinde->id == 1) {
|
|
$netzgebiet_id = 1;
|
|
$freigabe = '\'["interest", "provision", "order", "reorder"]\'';
|
|
}
|
|
|
|
// add to INSERT statement
|
|
$insert .= "($netzgebiet_id, '$acode', $ortschaft_id, $plz_id, $strasse_id,'$h_string', $freigabe, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),";
|
|
if($gemeinde->id === 1) {
|
|
echo "Importiere ".$plz->plzstring.", ".$ortschaft->name.", ".$strasse->name." ".$h_string."\n";
|
|
}
|
|
|
|
}
|
|
$insert = preg_replace('/,$/', "", $insert);
|
|
//echo "$insert\n";exit;
|
|
$db->query($insert);
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function makeHausnummer($z1 = false, $z2 = false, $v = false, $b1 = false, $b2 = false) {
|
|
$h = "";
|
|
|
|
if($z1) {
|
|
$h .= $z1;
|
|
}
|
|
if($b1) {
|
|
$h .= $b1;
|
|
}
|
|
if($v) {
|
|
$h .= $v;
|
|
if($z2) {
|
|
$h .= $z2;
|
|
}
|
|
if($b2) {
|
|
$h .= $b2;
|
|
}
|
|
}
|
|
|
|
return $h;
|
|
}
|
|
|
|
function getGemeinde($kz) {
|
|
global $gemeinden_cache;
|
|
|
|
if(array_key_exists($kz, $gemeinden_cache)) {
|
|
return $gemeinden_cache[$kz];
|
|
}
|
|
|
|
$gemeinde = ADBGemeindeModel::getFirst(['kennziffer' => $kz]);
|
|
if(!$gemeinde) {
|
|
return false;
|
|
}
|
|
$gemeinden_cache[$kz] = $gemeinde;
|
|
return $gemeinde;
|
|
}
|
|
|
|
|
|
function getOrtschaft($kz) {
|
|
global $ortschaft_cache;
|
|
|
|
if(array_key_exists($kz, $ortschaft_cache)) {
|
|
return $ortschaft_cache[$kz];
|
|
}
|
|
|
|
$ortschaft = ADBOrtschaftModel::getFirst(['kennziffer' => $kz]);
|
|
if(!$ortschaft) {
|
|
return false;
|
|
}
|
|
$ortschaft_cache[$kz] = $ortschaft;
|
|
return $ortschaft;
|
|
}
|
|
|
|
|
|
function getStrasse($kz) {
|
|
global $strasse_cache;
|
|
|
|
if(array_key_exists($kz, $strasse_cache)) {
|
|
return $strasse_cache[$kz];
|
|
}
|
|
|
|
$strasse = ADBStrasseModel::getFirst(['kennziffer' => $kz]);
|
|
if(!$strasse) {
|
|
return false;
|
|
}
|
|
$strasse_cache[$kz] = $strasse;
|
|
return $strasse;
|
|
}
|
|
|
|
|
|
function getPlz($plz_search, $gemeinde_id) {
|
|
global $plz_cache;
|
|
|
|
if(array_key_exists("$plz_search-$gemeinde_id", $plz_cache)) {
|
|
return $plz_cache["$plz_search-$gemeinde_id"];
|
|
}
|
|
|
|
$plz = ADBPlzModel::getFirst(['plz' => $plz_search, "gemeinde_id" => $gemeinde_id]);
|
|
if(!$plz) {
|
|
return false;
|
|
}
|
|
$plz_cache["$plz_search-$gemeinde_id"] = $plz;
|
|
return $plz;
|
|
}
|