Anleitung zum Laden der Datenbank des GEOnet Names Server in das PostgreSQL DMBS. Siehe Wikipedia:Archiv/GEOnet Names Server für die Formatbeschreibung.
Datenimport
BearbeitenDas Datenfile geonames_dd_dms_date_20050305.txt (Stand 5. März 2005) enthält eine Kopfzeile, die von der originalen Dokumentation abweicht. Statt "CC2" heisst es dort "C2", statt "MOD_DATE" heisst es dort "MODIFY_DATE", und die Spalte "DIM" ist vorhanden aber mit leerem Spaltennamen.
In Postgres kann eine Spalten "DIM" nicht angelegt werden, da es Schlüsselwort ist, außerdem muss es als VARCHAR (nicht NUMERIC) angelegt werden, da es regelmässig NULL ist. Im Beispiel heisst die Spalte daher "DIMm VARCHAR(10)".
Der beste Befehl zum Laden des Textfiles erfolgt über den "COPY FROM" Befehl. Dazu muss die Kopfzeile entfernt werden (im Beispiel per `sed "1d"`). Da die Datenbasis recht gross ist, wird im Beispiel auf Westeuropa/Amerika beschränkt (per `sed "/^1/!d"`).
run : - psql -c "DROP TABLE GEONET;" psql -c "CREATE TABLE GEONET (\ RC NUMERIC(1), \ UFI NUMERIC(10), \ UNI NUMERIC(10), \ LAT NUMERIC(9,7), \ LONG NUMERIC(10,7), \ DMS_LAT NUMERIC(6), \ DMS_LONG NUMERIC(7), \ UTM VARCHAR(4), \ JOG VARCHAR(7), \ FC VARCHAR(1), \ DSG VARCHAR(5), \ PC VARCHAR(1), \ CC1 VARCHAR(2), \ ADM1 VARCHAR(2), \ ADM2 VARCHAR(200), \ DIMm VARCHAR(10), \ CC2 VARCHAR(2), \ NT VARCHAR(1), \ LC VARCHAR(2), \ SHORT_FORM VARCHAR(128), \ GENERIC VARCHAR(128), \ SORT_NAME VARCHAR(200), \ FULL_NAME VARCHAR(200), \ FULL_NAME_ND VARCHAR(200), \ MOD_DATE VARCHAR(10));" sed -e 1d -e "/^1/!d" geonames_dd_dms_date_20050305.txt > geonames.tmp psql -c "COPY GEONET FROM '`pwd`/geonames.tmp';" - rm geonames.tmp
Bei aktuellen Daten (Stand Oktober 2007) heißt die Spalte "UTM" (Universal Transverse Mercator) nun "MGRS" (Military Grid Reference System, 15 Zeichen). DIMm existiert nicht mehr und wurde in POP (Population, Bevölkerung) und ELEV (Elevation, Höhe) aufgeteilt. Für Deutschland genügt eine 15-stellige numerische Angabe bei POP und eine 6-stellige numerische Angabe völlig. Das Feld LC ist teilweise inzwischen dreistellig. Für Deutschland (gm.txt) ergibt sich daher folgendes Script, welches direkt in psql mit "\i script" ausgeführt werden kann:
CREATE TABLE GEONET ( RC NUMERIC(1), UFI NUMERIC(10), UNI NUMERIC(10), LAT NUMERIC(9,7), LONG NUMERIC(10,7), DMS_LAT NUMERIC(6), DMS_LONG NUMERIC(7), MGRS VARCHAR(15), JOG VARCHAR(7), FC VARCHAR(1), DSG VARCHAR(5), PC VARCHAR(1), CC1 VARCHAR(2), ADM1 VARCHAR(2), ADM2 VARCHAR(200), POP NUMERIC(15), ELEV NUMERIC(6), CC2 VARCHAR(2), NT VARCHAR(1), LC VARCHAR(3), SHORT_FORM VARCHAR(128), SORT_NAME VARCHAR(200), FULL_NAME VARCHAR(200), FULL_NAME_ND VARCHAR(200), MOD_DATE VARCHAR(10) ); \copy gns from 'gm.txt' null as '' delimiter as '\t' csv header quote as '\\'
Die Option "cvs header" funktioniert erst ab Postgres 8.1, allerdings erspart man sich damit das vorherige Abschneiden der ersten (Beschreibungs-)Spalte mit sed. Wer sichergehen will, das kein Unsinn passiert, sollte vorher "begin;" eingeben und bei Erfolg mit "commit;" bestätigen oder gegebenenfalls mit "rollback;" die Änderungen verwerfen.
Beispielabfrage
BearbeitenEine Beispielabfrage wäre etwa "Die Koordinaten aller Flugplätze in Deutschland":
psql -c "select DMS_LAT, DMS_LONG, FULL_NAME from GEONET where CC1 = 'GM' and DSG = 'AIRP';"
dms_lat | dms_long | full_name ---------+----------+------------------------ 482500 | 105600 | Augsburg 521900 | 103300 | Braunschweig 530200 | 84700 | Bremen 514600 | 141700 | Cottbus 514900 | 121100 | Dessau 510800 | 134500 | Dresden 510800 | 134500 | Flughafen Dresden 511700 | 64600 | Düsseldorf 544600 | 92300 | Flensburg-Schäferhaus 522800 | 130800 | Gatow 533800 | 100000 | Hamburg 514100 | 74900 | Hamm-Lippewiesen 522700 | 94200 | Hannover 484200 | 113200 | Ingolstadt 482100 | 114700 | München II 482100 | 114700 | Flughafen München II 513600 | 83600 | Paderborn-Lippstadt 491300 | 70600 | Saarbrücken-Ensheim 512400 | 121300 | Schkeuditz 542700 | 93000 | Schleswig 522200 | 133100 | Schönefeld 484100 | 91200 | Stuttgart 523300 | 131800 | Tegel 522800 | 132400 | Tempelhof (24 Zeilen)
siehe auch GEOnet Names Server
WikiProjekt Georeferenzierung
BearbeitenEine Standardabfrage für die Georeferenzierung mittels WGS84-basiertem GEOnet Names Server kann die Dezimalnotation von Länge und Breite (LAT, LONG) sowie den Objekttyp (DSG) einbeziehen. Dies ermöglicht, eine Zeile der Ausgabe weitgehend direkt in die Wiki-Notation einer Geokoordinate umzusetzen.
Beispiel: gesucht sei Wiki-Georeferenz des Flughafens Dresden.
psql -c "select LAT, LONG, DSG, DMS_LAT, DMS_LONG, FULL_NAME \ from GEONET where FULL_NAME like '%Flughafen Dresden%';"
lat | long | dsg | dms_lat | dms_long | full_name ------------+------------+------+---------+----------+------------------- 51.1333333 | 13.7500000 | AIRP | 510800 | 134500 | Flughafen Dresden (1 Zeile)
{{Koordinate Artikel|51.1333333_N_13.7500000_E_type:AIRP|51°08'00" N 13°45'00" O}}
siehe auch: Wikipedia:WikiProjekt Georeferenzierung