GV100 Parser für Python
2011/11/22 Hinterlasse einen Kommentar
Mit dem nachfolgenden Quellcode kann die Datenbank GV100 vom Statistischen Bundesamt mit Python eingelesen und z.B. in einer Google App Engine zur Gliederung von Adressen nach Gemeinde, Kreis, Bezirk und Bundesland genutzt werden. Das Gemeindeverzeichnis wird quartalsweise aktualisiert und steht jedem kostenlos als Download (Mrz, Jun, Sep, Dez) zur Verfügung.
Die Datei GV100.asc enthält alle 12.000 Orte aus Deutschland inklusive Postleitzahl und wird von zahlreichen Internetseiten als PLZ-Suche aufgearbeitet. Die Daten werden auch als SEO-Werkzeug zur Suchmaschinenoptimierung eingesetzt, um alle Ortsnamen mit beliebigen Keywords zu verknüpfen. Mit der Kombination von Suchbegriffen – „Autohaus Hintertupfingen“ oder „Hotel Hintertupfingen“ – können so sehr viele Internetseiten generiert werden.
#!/usr/bin/env python
#
# GV100
#
import logging
def __open(file):
result = None
try:
vpath = os.path.join(os.path.split(__file__)[0],'')
vfile = file.replace("\\",os.sep)
vfile = vfile.replace("/",os.sep)
fname = os.path.join(vpath, vfile)
result = open(fname, 'r')
except:
error = sys.exc_info()[1]
logging.error("get(%s) %s" % (file, error))
return result
def __decode(data):
return data.decode("cp437").encode("utf-8")
gv100_format = {
# Bundesland
'10':[
# ['EF1 ' ,1 ,2 ,'Satzart '],
# ['EF2 ' ,3 ,8 ,'Gebietsstand '],
# ['EF2U1' ,3 ,4 ,'Jahr '],
# ['EF2U2' ,7 ,2 ,'Monat '],
# ['EF2U3' ,9 ,2 ,'Tag '],
['EF3 ' ,11 ,8 ,'Regionalschluessel '],
['EF3U1' ,11 ,2 ,'Land '],
# ['EF3U2' ,13 ,1 ,'Leer '],
# ['EF3U3' ,14 ,2 ,'Leer '],
# ['EF3U4' ,16 ,3 ,'Leer '],
# ['EF4 ' ,19 ,4 ,'Leer '],
['EF5 ' ,23 ,50 ,'Landbezeichnung '],
['EF6 ' ,73 ,50 ,'Sitz der Landesregierung '],
# ['EF7 ' ,123 ,6 ,'Schluesselfelder '],
# ['EF7U1' ,123 ,2 ,'Leer '],
# ['EF7U2' ,125 ,2 ,'Leer '],
# ['EF7U3' ,127 ,2 ,'Leer '],
# ['EF8 ' ,129 ,72 ,'Leer '],
# ['EF9 ' ,201 ,20 ,'Frei fuer landesinterne Angaben '],
],
# Regierungsbezirk
'20':[
# ['EF1 ' ,1 ,2 ,'Satzart '],
# ['EF2 ' ,3 ,8 ,'Gebietsstand '],
# ['EF2U1' ,3 ,4 ,'Jahr '],
# ['EF2U2' ,7 ,2 ,'Monat '],
# ['EF2U3' ,9 ,2 ,'Tag '],
['EF3 ' ,11 ,8 ,'Regionalschluessel '],
['EF3U1' ,11 ,2 ,'Land '],
['EF3U2' ,13 ,1 ,'Regierungsbezirk '],
# ['EF3U3' ,14 ,2 ,'Leer '],
# ['EF3U4' ,16 ,3 ,'Leer '],
# ['EF4 ' ,19 ,4 ,'Leer '],
['EF5 ' ,23 ,50 ,'Regierungsbezirksbezeichnung '],
['EF6 ' ,73 ,50 ,'Verwaltungssitz des Regierungsbezirks'],
# ['EF7 ' ,123 ,6 ,'Schluesselfelder '],
# ['EF7U1' ,123 ,2 ,'Leer '],
# ['EF7U2' ,125 ,2 ,'Leer '],
# ['EF7U3' ,127 ,2 ,'Leer '],
# ['EF8 ' ,129 ,72 ,'Leer '],
# ['EF9 ' ,201 ,20 ,'Frei fuer landesinterne Angaben '],
],
# Kreis
'40':[
# ['EF1 ' ,1 ,2 ,'Satzart 40 '],
# ['EF2 ' ,3 ,8 ,'Gebietsstand '],
# ['EF2U1' ,3 ,4 ,'Jahr '],
# ['EF2U2' ,7 ,2 ,'Monat '],
# ['EF2U3' ,9 ,2 ,'Tag '],
['EF3 ' ,11 ,8 ,'Regionalschluessel '],
['EF3U1' ,11 ,2 ,'Land '],
['EF3U2' ,13 ,1 ,'Regierungsbezirk '],
['EF3U3' ,14 ,2 ,'Kreis '],
# ['EF3U4' ,16 ,3 ,'Leer '],
# ['EF4 ' ,19 ,4 ,'Leer '],
['EF5 ' ,23 ,50 ,'Kreisbezeichnung '],
['EF6 ' ,73 ,50 ,'Sitz der Kreisverwaltung '],
# ['EF7 ' ,123 ,6 ,'Schleusselfelder '],
['EF7U1' ,123 ,2 ,'Textkennzeichen '],
# 41 - Kreisfreie Stadt
# 42 - Stadtkreis
# 43 - Kreis
# 44 - Landkreis
# 45 - Regionalverband
# ['EF7U2' ,125 ,2 ,'Leer '],
# ['EF7U3' ,127 ,2 ,'Leer '],
# ['EF8 ' ,129 ,72 ,'Leer '],
# ['EF9 ' ,201 ,20 ,'Frei fuer landesinterne Angaben'],
],
# Gemeindeverband
'50':[
# ['EF1 ' ,1 ,2 ,'Satzart '],
# ['EF2 ' ,3 ,8 ,'Gebietsstand '],
# ['EF2U1' ,3 ,4 ,'Jahr '],
# ['EF2U2' ,7 ,2 ,'Monat '],
# ['EF2U3' ,9 ,2 ,'Tag '],
['EF3 ' ,11 ,8 ,'Regionalschluessel '],
['EF3U1' ,11 ,2 ,'Land '],
['EF3U2' ,13 ,1 ,'Regierungsbezirk '],
['EF3U3' ,14 ,2 ,'Kreis '],
# ['EF3U4' ,16 ,3 ,'Leer '],
['EF4 ' ,19 ,4 ,'Gemeindeverband '],
['EF5 ' ,23 ,50 ,'Verbandsbezeichnung '],
# ['EF6 ' ,73 ,50 ,'Verwaltungssitz des Gemeindeverbandes '],
# ['EF7 ' ,123 ,6 ,'Schluesselfelder '],
['EF7U1' ,123 ,2 ,'Textkennzeichen '],
# 50 verbandsfreie Gemeinde
# 51 Aemter
# 52 Samtgemeinden
# 53 Verbandsgemeinden
# 54 Verwaltungsgemeinschaften
# 55 Kirchspielslandgemeinden
# 56 Verwaltungsverbaende
# 57 VG Traegermodell
# 58 Erfuellende Gemeinde
# ['EF7U2' ,125 ,2 ,'Leer '],
# ['EF7U3' ,127 ,2 ,'Leer '],
# ['EF8 ' ,129 ,72 ,'Leer '],
# ['EF9 ' ,201 ,20 ,'Frei fuer landesinterne Angaben '],
],
# Gemeinde
'60':[
# ['EF1 ' ,1 ,2 ,'Satzart 60 '],
# ['EF2 ' ,3 ,8 ,'Gebietsstand '],
# ['EF2U1 ' ,3 ,4 ,'Jahr '],
# ['EF2U2 ' ,7 ,2 ,'Monat '],
# ['EF2U3 ' ,9 ,2 ,'Tag '],
['EF3 ' ,11 ,8 ,'Regionalschluessel '],
['EF3U1 ' ,11 ,2 ,'Land '],
['EF3U2 ' ,13 ,1 ,'Regierungsbezirk '],
['EF3U3 ' ,14 ,2 ,'Kreis '],
['EF3U4 ' ,16 ,3 ,'Gemeinde '],
['EF4 ' ,19 ,4 ,'Gemeindeverband '],
['EF5 ' ,23 ,50 ,'Gemeindebezeichnung '],
# ['EF6 ' ,73 ,50 ,'Leer '],
# ['EF7 ' ,123 ,6 ,'Schluesselfelder '],
['EF7U1 ' ,123 ,2 ,'Textkennzeichen '],
['EF7U1C' ,123 ,2 ,'Textkennzeichen ',
{
'60':'Markt ',
'61':'Kreisfreie Stadt ',
'62':'Stadtkreis ',
'63':'Stadt ',
'64':'Kreisangehoerige Gemeinde ',
'65':'gemeindefreies Gebiet, bewohnt ',
'66':'gemeindefreies Gebiet, unbewohnt',
'67':'grosse Kreisstadt ',
'68':'amtsangehoerige Gemeinde ',
'69':'amtsfreie Gemeinde ',
}
],
# 60 - Markt '],
# 61 - Kreisfreie Stadt '],
# 62 - Stadtkreis '],
# 63 - Stadt '],
# 64 - Kreisangehoerige Gemeinde '],
# 65 - gemeindefreies Gebiet, bewohnt '],
# 66 - gemeindefreies Gebiet, unbewohnt'],
# 67 - grosse Kreisstadt '],
# 68 - amtsangehoerige Gemeinde '],
# 69 - amtsfreie Gemeinde '],
# ['EF7U2 ' ,125 ,2 ,'Leer '],
# ['EF7U3 ' ,127 ,2 ,'Leer '],
['EF8 ' ,129 ,11 ,'Flaeche in ha '],
['EF9 ' ,140 ,11 ,'Bevoelkerung, insgesamt '],
['EF10 ' ,151 ,11 ,'Bevoelkerung, maennlich '],
# ['EF11 ' ,162 ,4 ,'Leer '],
# ['EF12 ' ,166 ,10 ,'Neue Postleitzahl '],
['EF12U1' ,166 ,5 ,'PLZ der Gemeinde / PLZ des Verwaltung'],
['EF12U2' ,171 ,5 ,'Kennzeichnung, ob PLZ eindeutig '],
# leer = Gemeinde hat nur eine PLZ '],
# sonst = Gemeinde hat mehrere PLZ '],
# ['EF13 ' ,176 ,2 ,'Oberpostdirektionsbezirk '],
# ['EF14 ' ,178 ,4 ,'Finanzamtsbezirk '],
# ['EF15 ' ,182 ,4 ,'Gerichtsbarkeit '],
# ['EF15U1' ,182 ,2 ,'Oberlandesgerichtsbezirk '],
# ['EF15U2' ,184 ,1 ,'Landgerichtsbezirk '],
# ['EF15U3' ,185 ,1 ,'Amtsgerichtsbezirk '],
# ['EF16 ' ,186 ,5 ,'Arbeitsamtsbezirk '],
# ['EF17 ' ,191 ,6 ,'Bundestagswahlkreise von ... bis ... '],
# ['EF17U1' ,191 ,3 ,'aBufntrdeetesnta)gswahlkreis von ... '],
# ['EF17U2' ,194 ,3 ,'Bundestagswahlkreis bis ... '],
# ['EF18 ' ,197 ,4 ,'Leer '],
# ['EF19 ' ,201 ,20 ,'ALN Frei fuer landesinterne Angaben '],
],
}
for line in __open('GV100.asc'):
line = line[:-1]
EF1_Satzart = line[0:0+2]
data = None
if gv100_format.has_key(EF1_Satzart):
data = {}
for atr in gv100_format[EF1_Satzart]:
key = atr[0].strip()
off = atr[1]-1
len = off+atr[2]
data[key] = __decode(line[off:len]).strip()
if type(atr[-1]) == dict:
if atr[-1].has_key(data[key]):
data[key] = atr[-1][data[key]]
if EF1_Satzart == '60':
bundesland_id = data['EF3U1']
bezirk_id = data['EF3U2']
kreis_id = data['EF3U3']
gemeindeverband_id = data['EF4']
gemeinde_id = data['EF3U4']
gemeinde_txt = data['EF5']
gemeinde_typ = data['EF7U1C']
plz_id = data['EF12U1']