PageRenderTime 26ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/plugins/bevoelkerung/model/prognose.php

https://github.com/srahn/kvwmap
PHP | 299 lines | 218 code | 11 blank | 70 comment | 16 complexity | 287192f0b7722b9366f1fcfd6fb6eef1 MD5 | raw file
  1. <?php
  2. class prognose {
  3. function __construct($database) {
  4. global $debug;
  5. $this->debug=$debug;
  6. $this->database = $database;
  7. }
  8. /*
  9. * Diese Funktion packt die Dateien der Prognosedaten aus,
  10. * bearbeitet den Inhalt für den Import auf und führt den
  11. * Import der Daten in die Datenbank aus.
  12. *
  13. *
  14. */
  15. function import() {
  16. $dir = new DirectoryIterator(BEVOELKERUNG_IMPORT_DATA_PATH);
  17. echo 'Loop through ' . BEVOELKERUNG_IMPORT_DATA_PATH . '*.gz <br>';
  18. foreach (glob(BEVOELKERUNG_IMPORT_DATA_PATH . '*.gz') as $filename) {
  19. echo 'Packe ' . $filename . ' aus.<br>';
  20. exec('gunzip ' . $filename);
  21. }
  22. foreach (glob(BEVOELKERUNG_IMPORT_DATA_PATH . '*.sql') as $filename) {
  23. $this->prepareImport($filename);
  24. $this->importSQL($filename);
  25. }
  26. }
  27. function transpose() {
  28. /* $sql = "
  29. TRUNCATE mvbevoelkerung.zahlen;
  30. ";
  31. $ret = $this->database->execSQL($sql, 4, 0);
  32. */
  33. foreach (glob(BEVOELKERUNG_IMPORT_DATA_PATH . '*.sql') as $filename) {
  34. if (strpos($filename, 'Prognose') !== false) {
  35. $year = substr($filename, -13, 4);
  36. $tablename = 'mvbevoelkerung' . $year . 'p.q1model' . $year . 'p';
  37. $this->transposeTable($year, $tablename);
  38. }
  39. if (strpos($filename, 'Statistik') !== false) {
  40. $year = substr($filename, -10, 4);
  41. $tablename = 'mvbevoelkerung' . $year . '.q1modell' . $year . 'nb';
  42. $this->transposeTable($year, $tablename);
  43. }
  44. }
  45. }
  46. function prepareImport($filename) {
  47. if (strpos($filename, 'Statistik') !== false) {
  48. echo 'Bereite Statistikdatei: ' . $filename . ' für Import auf.<br>';
  49. $year = substr($filename, -10, 4);
  50. exec("
  51. year=" . $year . "
  52. sed -i 's|`||g' " . $filename . "
  53. sed -i 's|MStand|mstand|g' " . $filename . "
  54. sed -i 's|Gebiet|gebiet|g' " . $filename . "
  55. sed -i 's|Jahr|jahr|g' " . $filename . "
  56. sed -i 's|JAHR|jahr|g' " . $filename . "
  57. sed -i 's|KennungNum|kennungnum|g' " . $filename . "
  58. sed -i 's|KennungStr|kennungstr|g' " . $filename . "
  59. sed -i 's|KennungSTR|kennungstr|g' " . $filename . "
  60. sed -i 's|KKZ|kkz|g' " . $filename . "
  61. sed -i 's|Masse|masse|g' " . $filename . "
  62. sed -i 's|PRZ|prz|g' " . $filename . "
  63. sed -i 's|ENGINE=InnoDB|--ENGINE=InnoDB|g' " . $filename . "
  64. sed -i 's|UNLOCK TABLES|--LOCK TABLES|g' " . $filename . "
  65. sed -i 's|int(11)|integer|g' " . $filename . "
  66. sed -i 's|bigint(20)|bigint|g' " . $filename . "
  67. sed -i 's|decimal(41,0)|integer|g' " . $filename . "
  68. sed -i 's|LOCK TABLES|--LOCK TABLES|g' " . $filename . "
  69. sed -i 's|CHARACTER SET cp850||g' " . $filename . "
  70. sed -i 's|CHARACTER SET utf8mb4||g' " . $filename . "
  71. sed -i 's|DROP TABLE|DROP SCHEMA IF EXISTS mvbevoelkerung'$year' CASCADE; DROP SCHEMA IF EXISTS mvbevoelkerung'$year'p CASCADE; CREATE SCHEMA mvbevoelkerung'$year'; DROP TABLE|g' " . $filename . "
  72. sed -i 's|q1_model|mvbevoelkerung'$year'.q1model|g' " . $filename . "
  73. ");
  74. }
  75. if (strpos($filename, 'Prognose') !== false) {
  76. echo 'Bereite Prognosedatei: ' . $filename . ' für Import auf.<br>';
  77. $year = substr($filename, -13, 4);
  78. exec("
  79. year=" . $year . "
  80. sed -i 's|`||g' " . $filename . "
  81. sed -i 's|MStand|mstand|g' " . $filename . "
  82. sed -i 's|Gebiet|gebiet|g' " . $filename . "
  83. sed -i 's|Jahr|jahr|g' " . $filename . "
  84. sed -i 's|KennungNum|kennungnum|g' " . $filename . "
  85. sed -i 's|KennungStr|kennungstr|g' " . $filename . "
  86. sed -i 's|GKZ|gkz|g' " . $filename . "
  87. sed -i 's|Masse|masse|g' " . $filename . "
  88. sed -i 's|PRZ|prz|g' " . $filename . "
  89. sed -i 's|ENGINE=InnoDB|--ENGINE=InnoDB|g' " . $filename . "
  90. sed -i 's|UNLOCK TABLES|--LOCK TABLES|g' " . $filename . "
  91. sed -i 's|int(11)|integer|g' " . $filename . "
  92. sed -i 's|LOCK TABLES|--LOCK TABLES|g' " . $filename . "
  93. sed -i 's|DROP TABLE|DROP SCHEMA IF EXISTS mvbevoelkerung'" . $year . "'p CASCADE; CREATE SCHEMA mvbevoelkerung'" . $year . "'p; DROP TABLE|g' " . $filename . "
  94. sed -i 's|q1_model|mvbevoelkerung'$year'p.q1model|g' " . $filename . "
  95. ");
  96. }
  97. if (strpos($filename, 'admin_key_lnog') !== false) {
  98. echo 'Bereite Steuerungsdatei mit Verschlüsselungen: ' . $filename . ' für Import auf.<br>';
  99. exec("
  100. sed -i 's|`||g' " . $filename . "
  101. sed -i 's|Struktur|struktur|g' " . $filename . "
  102. sed -i 's|Gebiet|gebiet|g' " . $filename . "
  103. sed -i 's|isKreis|iskreis|g' " . $filename . "
  104. sed -i 's|isGMD|isgmd|g' " . $filename . "
  105. sed -i 's|kennung_ID|kennung_id|g' " . $filename . "
  106. sed -i 's|PRZ|prz|g' " . $filename . "
  107. sed -i 's|Kreis|kreis|g' " . $filename . "
  108. sed -i 's|ENGINE=InnoDB|--ENGINE=InnoDB|g' " . $filename . "
  109. sed -i 's|UNLOCK TABLES|--LOCK TABLES|g' " . $filename . "
  110. sed -i 's|int(11)|integer|g' " . $filename . "
  111. sed -i 's|bigint(20)|bigint|g' " . $filename . "
  112. sed -i 's|LOCK TABLES|--LOCK TABLES|g' " . $filename . "
  113. sed -i 's|admin_key_lnog|mvbevoelkerung.admin_key_lnog|g' " . $filename . "
  114. ");
  115. }
  116. if (strpos($filename, 'massen') !== false) {
  117. echo 'Bereite Steuerungsdatei mit Massen: ' . $filename . ' für Import auf.<br>';
  118. exec("
  119. sed -i 's|`||g' " . $filename . "
  120. sed -i 's|Auswahlmassen_Nr|auswahlmassen_nr|g' " . $filename . "
  121. sed -i 's|Kurzname|kurzname|g' " . $filename . "
  122. sed -i 's|Auswahlmasse|auswahlmasse|g' " . $filename . "
  123. sed -i 's|ENGINE=InnoDB|--ENGINE=InnoDB|g' " . $filename . "
  124. sed -i 's|UNLOCK TABLES|--LOCK TABLES|g' " . $filename . "
  125. sed -i 's|LOCK TABLES|--LOCK TABLES|g' " . $filename . "
  126. sed -i 's| massen| mvbevoelkerung.massen|g' " . $filename . "
  127. ");
  128. }
  129. }
  130. function importSQL($filename) {
  131. echo 'Lese SQL-Datei: ' . $filename . ' in Datenbank ein.<br>';
  132. exec('psql -U kvwmap -f ' . $filename . 'kvwmapsp');
  133. }
  134. /*
  135. * Diese Funktion extrahiert die Prognosedaten und speichert
  136. * sie in einer neuen Tabelle in transponierter Form
  137. * in der jeder Datensatz nur eine Bevölkerungszahl eines
  138. * Nahbereiches und einer Masse beinhaltet
  139. */
  140. function transposeTable($year, $tablename) {
  141. echo '<br>Schreibe transponierte Daten aus Table: ' . $tablename . ' in CSV-Datei.';
  142. $sql = "
  143. SELECT
  144. *
  145. FROM
  146. mvbevoelkerung" . $year . "." . $tablename . "
  147. ";
  148. #echo '<br>' . $sql;
  149. $ret = $this->database->execSQL($sql, 4, 0);
  150. if ($ret[0] == 0) {
  151. $csvfilename = BEVOELKERUNG_IMPORT_DATA_PATH . $tablename . '.csv';
  152. $csvfile = fopen($csvfilename, 'w');
  153. $values = array();
  154. # Insgesamt werden folgende Felder ausgegeben:
  155. # jahr, mstand, kennungnum, masse, prz, wbl, v, bu, z
  156. while ($row = pg_fetch_assoc($ret[1])) {
  157. switch ($row['mstand']) {
  158. case 'KBu2014' : {
  159. $mstand = 3;
  160. } break;
  161. case 'AUG2015' : {
  162. $mstand = 2;
  163. } break;
  164. case 'AUG2014' : {
  165. $mstand = 1;
  166. } break;
  167. default : { # Prognose
  168. $mstand = 0;
  169. }
  170. }
  171. $values = array(
  172. intval($row['jahr']) - 2000, # jahr
  173. $mstand, # mstand
  174. intval($row['kennungnum']), # kennungnum
  175. $row['masse'], # masse
  176. intval($row['prz']) # prz
  177. );
  178. foreach (array('m' => 'f', 'w' => 't') AS $sex => $wbl) {
  179. for($i = 0; $i <= 100; $i++) {
  180. if ($i < 100) {
  181. $bu = $i + 1;
  182. $z = $row[$sex . $i . 'bu' . ($i + 1)];
  183. }
  184. else {
  185. $bu = 199;
  186. $z = $row[$sex . 'ggl100'];
  187. }
  188. fputcsv(
  189. $csvfile,
  190. array_merge(
  191. $values,
  192. array(
  193. $wbl, # wbl
  194. $i, # v
  195. $bu, # bu
  196. $z #z
  197. )
  198. ),
  199. ';',
  200. '"'
  201. );
  202. }
  203. }
  204. }
  205. fclose($csvfile);
  206. }
  207. echo "<br>Kopiere in Tabelle mvbevoelkerung.zahlen von CSV-Datei: " . $csvfilename;
  208. $sql = "
  209. COPY mvbevoelkerung.zahlen (jahr, mstand, kennungnum, masse, prz, wbl, v, bu, z) FROM '" . $csvfilename . "'
  210. WITH
  211. CSV
  212. DELIMITER ';'
  213. ";
  214. $this->database->execSQL($sql, 4, 0);
  215. /*
  216. $v = $bu = $z = array();
  217. for ($i = 0; $i < 100; $i++) {
  218. $m[] = 'f';
  219. $w[] = 't';
  220. $v[] = $i;
  221. $bu[] = $i + 1;
  222. $zm[] = 'm' . $i . 'bu' . ($i + 1);
  223. $zw[] = 'w' . $i . 'bu' . ($i + 1);
  224. }
  225. $m[] = 'f';
  226. $w[] = 't';
  227. $v[] = 100;
  228. $bu[] = 199;
  229. $zm[] = 'mggl100';
  230. $zw[] = 'wggl100';
  231. $sql = "
  232. INSERT INTO TABLE mvbevoelkerung.zahlen (
  233. jahr, mstand, kennungnum, masse, prz, wbl, v, bu, z
  234. )
  235. SELECT
  236. jahr - 2000,
  237. mstand,
  238. kennungnum,
  239. masse,
  240. prz,
  241. unnest(ARRAY['" .
  242. implode("', '", $m) . ", " .
  243. implode("', '", $w) .
  244. "']) AS wbl,
  245. unnest(ARRAY[" .
  246. implode(', ', $v) . ", " .
  247. implode(', ', $v) .
  248. "]) AS v,
  249. unnest(ARRAY[" .
  250. implode(', ', $bu) . ", " .
  251. implode(', ', $bu) .
  252. "]) AS bu,
  253. unnest(ARRAY[" .
  254. implode(', ', $zm) . ", " .
  255. implode(', ', $zw) .
  256. "]) AS z
  257. FROM " . $tablename . "
  258. WHERE
  259. jahr = '" . $year . "'
  260. ";*/
  261. }
  262. function find_triple($bereich, $jahr, $geschlecht, $col1, $col2, $col3, $label) {
  263. $sql = "
  264. SELECT
  265. round((" . $col1 . " / summe * 100)::numeric, 1),
  266. round((" . $col2 . " / summe * 100)::numeric, 1),
  267. round((" . $col3 . " / summe * 100)::numeric, 1), " .
  268. $label . "
  269. FROM
  270. mvbevoelkerung." . $bereich . "vergleiche
  271. WHERE
  272. jahr = " . $jahr . " AND
  273. geschlecht = '" . $geschlecht . "'
  274. ";
  275. #echo $sql;
  276. $ret = $this->database->execSQL($sql, 4, 0);
  277. if ($ret[0] == 0) {
  278. $result = array();
  279. while ($rs = pg_fetch_row($ret[1])) {
  280. $result[] = $rs;
  281. }
  282. }
  283. return $result;
  284. }
  285. }
  286. ?>