Osmfilter: gegevens zonder addr data wegfilteren

Hey ik probeer een OSM file om te zetten naar CSV, met:

osmconvert64.exe netherlands-latest.osm --max-objects=999999--all-to-nodes --csv="@lat @lon addr:street addr:housenumber addr:postcode addr:city" -o=streets.csv

De CSV wil ik in MySQL importeren. Ik merkte dat in de CSV er soms alleen lat/lon is, maar geen addr data. Is er een manier om de gegevens te filteren die geen addr data hebben (zodat de final CSV kleiner is, plus geen onnodige data heeft).

Ik probeerde:

osmfilter.exe netherlands-latest.osm --keep="@lat @lon addr:street= and addr:housenumber= and addr:postcode= and addr:city=" --drop="@lat==null @lon==null addr:street==null addr:housenumber==null addr:postcode==null addr:city==null" -o=netherlands-filtered.osm

En vervolgens:

osmconvert64.exe netherlands-filtered.osm --max-objects=999999--all-to-nodes --csv="@lat @lon addr:street addr:housenumber addr:postcode addr:city" -o=streets.csv

Echter met head streets.csv krijg ik deze output, nog steeds de te wegfilteren regels met lege cellen.

50.8469717      5.6951123
50.8454855      5.6948405
50.8455008      5.6952500
52.0979188      5.1179062       Lijsterstraat   49      3514TB  Utrecht
52.0816566      5.1235152       Tolsteegbrug    3       3511ZN  Utrecht
52.0817878      5.1241932       Tolsteegbrug    1       3511ZN  Utrecht
51.4454199      5.4847854
51.8438309      5.8659531       Tweede Walstraat        21      6511LN  Nijmegen
51.8479247      5.8635052       Achter de Hoofdwacht    3       6511VW  Nijmegen
52.0953797      5.0867812       Broerestraat    12      3532CP  Utrecht

Hoe moeten de regels zonder addr data correct weggefilterd worden?

Voor het filteren van text files (dus ook .csv files) gebruik ik zelf regelmatig “findstr”.

Oke Jan, dat is weer een alternatief. Had gehoopt dat er een heldere osmfilter commando mogelijk was.
Aangezien er een patroon in zit heb ik een regex bedacht, die matched met volledige data namelijk:

.*\s+.*\s+.*\s+.*\s+\d{4}\w{2}\s+.*

.

Volledig commando zou zijn, denk ik:

sed -n -s "/.*\s+.*\s+.*\s+.*\s+\d{4}\w{2}\s+.*/p" streets.csv > streetsv2.csv

Hoor graag of dit klopt, want weet niet zeker of ik sed met het patroon correct gebruik nu.

Bij een klein testbestandje werkte dit bij mij:

osmfilter invoer.osm --verbose --keep="addr:street=" -o=uitvoer.osm

Hierna hield ik alleen nodes over met een tag addr:street=…, ik neem aan dat de bedoeling was.

Alphensebezorger ik wil @lat, @lon, addr:street, addr:housenumber, addr:postcode, addr:city overhouden. Dus niet regels met alleen de geocoordinaten (lat, lon), maar ook de addr gegevens. Misschien moet ik in de --keep=“@lat= and @lon=” typen, dus echt met and erbij?

Kunt u een commando aandragen met

findstr

Jan? Vraag me af of ik het beste een patroon moet schrijven die matched met wat ik over wil houden, of met wat ik wil wegfilteren.

Met findstr moet je inderdaad een patroon hebben. Ik dacht even (onterecht) dat de tag mee in de regel stond).

Als het eenmalig is, dan kun de .csv file in excel importeren en de filter functie gebruiken.

Bij nadere studie lijkt je probleem te maken te hebben met het omzetten van vlakken met een adres naar nodes door osmconvert. Met osmfilter gooi je wel alle punten zonder adresinformatie weg, maar daarna maakt osmconvert weer nieuwe punten. Het lijkt alsof een vlak met een adres wel omgezet wordt naar een node, maar de bijbehorende addr=tags worden niet meegenomen naar die node. Edit: de nodes van een gebouw met addr-tags blijven echter bewaard, om het renderen van het gebouw mogelijk te maken.
Als je die punten echt wilt weggooien zou ik aan een grep commando denken, dat geeft alleen regels met de gezocht tekst erin door. “egrep [0-9]{4}[A-Z]{2}” zou dan moeten werken, tenzij ergens nog een postcode-achtige tekst staat in een straatnaam o.i.d. Je kunt ze ook met osmfilter wegfilteren door --keep-nodes te gebruiken.

Kortom: mijn osmfilter opdracht werkt zoals verwacht, daarna levert osmconvert weer ongewenste resultaten.

Edit:
De netste oplossing lijkt me een drie-staps-aanpak:

 osmconvert64.exe invoer.osm --max-objects=999999 --all-to-nodes -o=alleen_nodes.osm
  1. (Vervangt alle way&relaties door een node toe met dezelfde tags, voegt dus adrespunten toe voor ways/relations met een adres)
osmfilter.exe alleen_nodes.osm --keep="addr:street=" -o=gefilterd.osm
  1. (Gooit alle nodes weg die geen tag addr:street=… hebben, bv. vuilnisbakken, bankjes, nodes van straten/landuse-vlakken enz. enz.)
osmconvert64.exe gefilterd.osm --csv="@lat @lon addr:street addr:housenumber addr:postcode addr:city" -o=adressen.csv
  1. (Zet het bestand om naar csv-formaat)

Domme vraag, maar er zit geen spatie voor --all-to-nodes. Kan dat de fout veroorzaakt hebben?

Ik was ook wel geïnteresseerd in iets dergelijks en probeerde bovenstaande op een osm extract met alle data van Zeeland.
Dat leverde een bestand op dat vrijwel helemaal klopte, op 15 regels na waarin uitlsuitend @lat en @lon stonden. Er zit dus nog iets in de brondata dat niet weggefilterd wordt met bovenstaande filters.

Maar wat ik overhield was dus een bestand met 248.765 adressen in Zeeland waarvan er 739 niet aan de regels van een NL adres voldeden omdat óf de postcode óf het huisnummer óf de plaats ontbrak. Meestal plaats en postcode, soms zelfs alledrie. Ik heb bv. 11 keer een Bergstraat mét huisnummer maar geen postcode/woonplaats. Ik ga ervan uit dat die fouten in OSM zitten en niet een gevolg zijn van de filtertechniek.

Even uit nieuwsgierigheid… ben je eigenlijk niet op zoek naar de BAG adres gegevens aangevuld met de lat/lon? Zo ja dan is het wellicht beter de BAG als bron te gebruiken en niet OSM NL. Ik had een vergelijkbaar probleem en heb toen mbv de postgis DB dumps van NL-Extract aan de gang gegaan. Nu heb ik een tabel met alle ruim 9 mio adressen met een groot aantal attributen.
Een ander alternatief is misschien de CSV die NL-extract levert.