# openstreetmap tools

### Beschreibung:

Man kann mit dem Linux tool openstreetmaptolls, Daten aus einer downgeloadeten Openstreetmap Datei pbf exportieren in eine csv.  
  
Unter [https://download.geofabrik.de](https://download.geofabrik.de) lassen sich Ganze Kontinente oder nur Regionen oder einzelne Länder downloaden

### Vorrausetzung:

```
sudo apt install osmctools python3 python3-pandas python3-geopy python3-geopandas
```

### Parsen

Nach dem man seine gewünschte Datei downgeloadet hat, kann man die Adressen exportieren.  
uns interessieren Straße, Hausnummer PLZ, Ort und Ortsteil.  
Der Parameter -o gibt die Ausgabe Datei an.

```
osmconvert germany-latest.osm.pbf --csv="@id addr:street addr:housenumber addr:postcode addr:city addr:suburb" -o=addresses.csv
```

### Unvollständige Daten entfernen

Python Script um nur Vollständige Adressen zu behalten in der csv  
Denn sonst sieht das so aus, mit grep Wunderburgpark

<table id="bkmrk-id-stra%C3%9Fe-hausnummer"><thead><tr><th>**ID**</th><th>**Straße**</th><th>**Hausnummer**</th><th>**Postleitzahl**</th><th>**Ort**</th></tr></thead><tbody><tr><td>540052</td><td>Am Wunderburgpark</td><td>5b</td><td>26135</td><td>Oldenburg</td></tr><tr><td>1582540056</td><td>Am Wunderburgpark</td><td>6</td><td>26135</td><td>Oldenburg</td></tr><tr><td>1582540114</td><td>Am Wunderburgpark</td><td>7</td><td>26135</td><td>Oldenburg</td></tr><tr><td>1582540118</td><td>Am Wunderburgpark</td><td>8</td><td>26135</td><td>Oldenburg</td></tr><tr><td>1582540163</td><td>Am Wunderburgpark</td><td>9</td><td>26135</td><td>Oldenburg</td></tr><tr><td>1582540165</td><td>Am Wunderburgpark</td><td>9b</td><td>26135</td><td>Oldenburg</td></tr><tr><td>35624089</td><td>Am Wunderburgpark</td><td>  
</td><td>26135</td><td>Oldenburg</td></tr><tr><td>35624098</td><td>Am Wunderburgpark</td><td>  
</td><td>26135</td><td>Oldenburg</td></tr><tr><td>35624100</td><td>  
</td><td>  
</td><td>  
</td><td>  
</td></tr><tr><td>35624102</td><td>  
</td><td>  
</td><td>  
</td><td>  
</td></tr></tbody></table>

Das Script

```
import pandas as pd
import argparse
import sys

def clean_csv(input_file, output_file):
    """Bereinigt eine CSV-Datei, indem unvollständige Datensätze entfernt werden."""
    try:
        # CSV-Datei laden
        df = pd.read_csv(input_file, sep="\t", names=["id", "street", "housenumber", "postcode", "city", "suburb"])

        # Filter für vollständige Datensätze
        filtered_df = df.dropna(subset=["street", "housenumber", "postcode", "city"])  # Entfernt Zeilen mit leeren Werten
        filtered_df = filtered_df[filtered_df["housenumber"].notnull() & (filtered_df["housenumber"] != "")]

        # Bereinigte Daten speichern
        filtered_df.to_csv(output_file, index=False, sep="\t", encoding="utf-8")
        print(f"Bereinigte Datei wurde gespeichert: {output_file}")
    except Exception as e:
        print(f"Fehler bei der Verarbeitung: {e}")
        sys.exit(1)

def main():
    # Argument-Parser einrichten
    parser = argparse.ArgumentParser(description="Bereinigt eine CSV-Datei, indem unvollständige Datensätze entfernt werden.")
    parser.add_argument("input_file", metavar="INPUT", type=str, help="Pfad zur Eingabedatei (CSV, Tab-separiert)")
    parser.add_argument("output_file", metavar="OUTPUT", type=str, help="Pfad zur Ausgabedatei (bereinigte CSV)")
    args = parser.parse_args()

    # CSV-Bereinigung durchführen
    clean_csv(args.input_file, args.output_file)

if __name__ == "__main__":
    if len(sys.argv) == 1 or "--help" in sys.argv:
        print("""
Verwendung:
    python script.py INPUT OUTPUT

Beschreibung:
    Dieses Skript bereinigt eine CSV-Datei, indem unvollständige Datensätze (z. B. fehlende Hausnummern)
    entfernt werden. Die bereinigte Datei wird als neue CSV gespeichert.

Parameter:
    INPUT   Pfad zur Eingabedatei (CSV, Tab-separiert)
    OUTPUT  Pfad zur Ausgabedatei (bereinigte CSV)

Beispiel:
    python script.py addresses_raw.csv addresses_cleaned.csv
        """)
        sys.exit(0)

    main()

```

Ausführen:

```
python3 adresses.py addresses.csv addresses_clean.csv 
```

Da das cleanen sehr Recheninstensiv ist, einfach geduld.