OpenGeoDB-Hürdn
Vorüberlegungen
Für a aktuelles Projekt hob i a Liste mit olle Postleitzahlen in Deitschland inkl. zugehöriger Städtenamen braucht. Es gilt zwoar "Je mehr Daten, desto besser" ;-) aber des woarn zumindest die notwendigen Mindestanforderungen. Am End soit a Autocomplete-Input rauskemman, bei dem mia PLZ und zugehörigen Ort angezeigt kriagn. Erste Aufgabe is also des Beschaffn von de Daten, und da Herr Google hot mi auf des ziemlich vielversprechende Projekt OpenGeoDB bracht. Do wern wirklich olle erdenklichen Daten zu am Ort gliefert, de ma si wünschen kann:
- Amtlicher Gemeindeschlüssel
- Sortiername
- Name
- WGS84-Koordinaten
- Breitengrad (latitude)
- Längengrad (longitude)
- Verwaltungszusammenschluss
- Sortiername von am Verwaltungszusammenschluss
- Postleitzahl
- Telefonvorwahl
- Einwohnerzahl
- Ungefähre Einwohnerzahl (wtf!)
- Genaue Einwohnerzahl
- Fläche
- KFZ-Kennzeichen
- Typ (dem Eintrag noch lokal-/spezialisiert) Ebene
- Markierung ois ungültig
Es woar also recht schnö klar, dass i do die Daten kriag, de i brauch. Los gangen is's also mit dem Download vo de Daten ois SQL-Dump. Interessanterweise gibt's do 3 Dateien:
- opengeodb-begin.sql: A recht klane Datei, de nur dafür sorgt, dass die Tabellen erzeugt wern.
- DE.sql: Die tatsächlichen Daten. 60 MB an Insert-Statements puh
- opengeodb-end.sql: Des Finishing. Titel wern erstöt und Indizes generiert.
Des Grundgerüst
Mia fangan entsprechend ois Erstes mit da opengeodb-begin.sql o, um des Grundgerüst zu erstöin. Do treffn mia auf die Hürdn aka den Fehler Nummer 1.
[FEHLER in Abfrage 3] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TYPE=InnoDB CHARACTER SET utf8' at line 10
TYPE=InnoDB kennt die Datenbank also ned. Schod. Liegt aber dran, dass der Dump mit ana Version vor MySQL 4 erstöt wurde. Seit MySQL 4 hört die Datenbank nimma auf TYPE, sondern auf ENGINE. Lösung also: Dump im Editor deiner Wahl öffnen und "TYPE=InnoDB" durch "ENGINE=InnoDB" ersetzn. Dump nochamoi importiern und si über den erfolgreichen Import freun.
Da Datensatz
Weiter geht's mit dem Datensatz. Dazu einfach die Datei DE.sql (gilt natürlich nur für Deitschland. Österreicher nehmen die AT.sql, Schweizer die CH.sql etc.) importiern und wartn... wartn... bis die etwa 600.000 Datensätze importiert worn sand ... und dann die Fehlermeldung kriagn, dass 0 ka Datum is (.. tatsächlich?)
Incorrect date value: '0' for column 'valid_since' at row 1
Des Wartn woar umsonst. Yeah. Tabelle also wieda leern und überlegn, wos schiefglaufn is. Grundsätzlich bin i davon ausgangen, dass die Daten von OpenGeoDB an sich korrekt sand und es an meiner MySQL-Konfiguration liegt, de einfach koa 0 zulasst. Vielleicht soit meine Datenbank do ned ganz so streng sei und ausnahmsweise trotzdem die 0 zulassn generell a 0 ois Datum zulassn. Des MySQL-Manual hot mi auf die Variable strict_mode bracht, de mit am kurzn SHOW VARIABLES LIKE 'sql_mode' ausglesn wern konnt und ma a
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
zruckgebn hot. Do muasst also des "NO_ZERO_IN_DATE,NO_ZERO_DATE" weg, und weil des Ganze persistent gschehn soit, wurde eben die my.cnf konfiguriert, de bei mir unter /usr/local/etc/my.cnf zu finden woar. Dort muasst a sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION ogangt (= Ausgabe von SHOW VARIABLES ohne die Werte NO_ZERO_IN_DATE und NO_ZERO_DATE) und da Server mit am freundlichen brew services restart mysql neu gstartet wern. Danach nochamoi mit "SHOW VARIABLES LIKE 'sql_mode'" den Zustand prüfn und schaun, ob olles gklappt hot. Es wird Zeit für an neichn Versuch - DE.SQL importiern und wartn. Diesmoi soit olles klappn :)
Finishing
Schritt 3 is der Import vo da opengeodb-end.sql, de des "Finishing" durchführt - Titel einfügn und Indizes erstöin. Do is olles fehlerfrei glaufn puh. Jetzt sand die Daten importiert und kinnan valorbeit wern. Wer die Änderungen nur temporär wü, kann des mit am set global sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' bewirken.
TL;DR
- Datensätze von opengeodb.giswiki.org/wiki/OpenGeoDB_Downloads herunterlodn: opengeodb-begin.sql, opengeodb-end.sql, DE.sql
- opengeodb-begin.sql im Editor öffnen und TYPE=InnoDB durch ENGINE=InnoDB ersetzn
- opengeodb-begin.sql importiern
- sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' ausführn
- DE.sql importiern
- opengeodb-end.sql importiern