Perl obk csv2json.pl

Uit wiki.openbomenkaart.org
Naar navigatie springen Naar zoeken springen

Terug naar Perl scripts

script naam is eigenlijk obk_csv2json.pl (incl underscore)

Hoofddoel: Dit script vormt een gemeentebestand in csv formaat om naar een json bestand, klaar om in obk.htm ingeladen te worden.

Tevens genereert het tellingen, en input voor een tile set die in editor ID gebruikt kan worden om species, positie en admin_ref over te halen naar OSM.

Main script:

Modules

Initieel

Download data archief van STRATO

Download met FileZilla alle folders binnen /data/..

Download perl bestanden (6) van STRATO

  • Haal alle perl files die met obk_.. beginnen op van STRATO server en sla die lokaal op (allemaal in dezelfde folder ../perl..)
Het gaat om deze modules:
obk_csv2json.pl  hoofdscript , dit run je in de IDE
obk_setup.pl     genereer alle bestandsnamen, de meeste worden afgeleid uit de naam van het invoerbestand (csv bestand)
obk_parse_csv.pl breek een regel uit het csv bestand op in bruikbare kolommen 
obk_counts.pl    genereer tellingen 
obk_normalize.pl standaardiseer zaken als hoogte en stamdikte, die worden in elke gemeente weer iets anders gecodeerd 
obk_report.pl    rapporteer over de uitkomst

Test met een bestaand bestand

Zie voorbereiding

Input

voorbeeld voor Leiden:

obk_leiden_in.csvHet gemeentebestand (na omzetting in Excel naar csv)
(staat in ..data/Leiden/Gemeente/[yyyy-mm-dd] folder)
obk_leiden_overpass_2023_01_23.json(optioneel) Extract uit OSM voor bomen die door ons zelf zijn geinventariseerd (en die in plaats moeten komen van data uit het gemeentebestand)
(staat in ..data/Leiden/Gemeente/[yyyy-mm-dd] folder)
obk_skip_trees.txt(optioneel) Nummers van bomen die niet uit het gemeentebestand geladen moeten worden want er is OSM een versie met recentere data, maar die niet of basis van boomnummer met het gemeentebestand matcht
(staat in ..data/Leiden/Gemeente folder) / (procedure voor aanmaken van deze nummers nog te beschrijven)
obk_park_trees.txt(optioneel) Lijst van parken, met per park id's van bomen (ref:id of coordinaten)
(staat in ..data/Leiden/Gemeente folder) / (procedure voor aanmaken van deze nummers nog te beschrijven)
diff_revisions_taxon.csv(optioneel) Lijst van verschillen tussen twee revisies van het gemeentebestand, gegenereerd met Perl_diff_revisions.pl
(staat in ..data/Leiden/Gemeente/[yyyy-mm-dd]/diff subfolder)
obk_in_gemeenten.csvExtract uit Wikipedia met cijfers per gemeente, nodig voor updaten obk_city_stats.csv (staat in ../data folder)
taxon_names.jsJavascript bestand met ale naamdefinities voor soorten (staat in ../scripts/active folder)

Output

Als het goed is heb je nu een aantal nieuwe bestanden, aantal kan verschillen per gemeente. Twee daarvan zijn qua inhoud identiek, en verschillen alleen in naam, namelijk obk_[gemeente].json en trees_[gemeente].json.

Reden: de javascript files verwachten prefix trees_... Voor dit perl script is prefix obk_... standaard voor input en output. De file handmatig renamen van obk_... naar trees_... had ook gekund, maar zou mogelijk net zo verwarrend zijn geweest. Daarom twee identieke bestanden bestanden, de ene (obk_...) om het generatieproces te reviewen, en de andere (trees_...) om naar de folder te copieren, waar de web pagina het kan downloaden.

voorbeeld voor Leiden:

obk_leiden-counts.csvSynopsis: totaal aantal bomen en soorten per park
obk_leiden-counts.txtDetails: aantal bomen, per soort per park
obk_leiden.csvBestand dat in QGIS omgezet kan worden in een tegelset (tile set) voor gebruik in OSM editor ID, met per boom coordinaten, id, species, diameter, hoogte, plantjaar, kort label (bijv: '2028728'-Que rob), owner
obk_leiden.logTellingen per veld, voor nerds
obk_leiden.jsonZelfde als volgende bestand (copy), alleen om bestandsnamen consequent te houden
(json file met bomendata die door web site ingelezen wordt begint altijd met trees_..., vandaar
trees_leiden.jsonHet bestand dat op de OBK server wordt geplaatst, om vandaar door obk.htm opgehaald te worden
obk_leiden.jsVariant van obk_leiden.json voor lokaal testen, bestand is met 1 regel uitgebreid, en wordt als javascript module geladen, zie ook hier
obk_park_trees_log.txtLog file met resultaten van verwerken van obk_park_trees.txt
obk_city_stats.csvCentraal statistics bestand info over laatste run voor alle gemeentes

Processing

functies binnen obk_csv2json.pl

sub SetupBepaal alle bestandsnamen op basis van de gemeentenaam (uit de invoer obk_[leiden]_in.csv) en open de bestanden.

Indien bestand aanwezig, lees boomnummers uit obk_skip_trees.txt en plaats deze in een hash %skip_trees.
Indien bestand aanwezig, lees boomnummers uit obk_park_trees.txt en plaats deze in een hash %park_trees.
Lees taxonnamen uit javascript bestand ..scripts/active/taxon_names.js en plaats deze in een hash %taxons_defined.

sub NormalizeInputAanroep per regel uit het gemeentebestand. Normaliseer (standaardiseer) input:

Vervang via sub ReplaceEmbeddedCommas alle comma's uit de input die onderdeel zijn van een veld en niet bedoeld waren om velden te scheiden
Per gemeente wisselt de layout van de csv input (kolomnamen, volgorde van kollommen).
Voor elke gemeentenaam is er een blok code die een csv regel interpreteert, en evt. iets aan de data verandert, voorbeelden:

  • Samenvoegen van $straat en $huisnummer in veld $locatie
  • Uitfilteren van bomen met een bepaald (hardcoded) nummer (obsolete?)
  • Uitblanken (of reparen) van ongeldige diameters
  • Bomen tellen per 'straat' (eigenlijk park)
  • Alleen voor Leiden: Overslaan van bomen voor een aantal locaties (eigenlijk parknamen), want die gaan uit OSM komen.

Zie ook