Perl obk csv2json.pl: verschil tussen versies
(→Input) |
|||
Regel 83: | Regel 83: | ||
<li>Haal een set variabelen uit de regel via '''NormalizeInput''' (niet elk veld is voor elke gemeente aanwezig) | <li>Haal een set variabelen uit de regel via '''NormalizeInput''' (niet elk veld is voor elke gemeente aanwezig) | ||
<li>Filter input evt. op bomen die binnen een bounding box staan (bijv. om alleen bomen uit 1 gebied op een kaart te zetten) | <li>Filter input evt. op bomen die binnen een bounding box staan (bijv. om alleen bomen uit 1 gebied op een kaart te zetten) | ||
<li>Sla | <li>Sla een boom over als we zijn nummer of coordinaten al bij '''Setup''' in de Overpass json file tegenkwamen | ||
<li>Kijk voor elke boom of die voorkomt in '''obk_park_trees.txt''', zo ja vul de data aan met place=parknaam. | |||
<li>Standaardiseer metrics via '''NormalizeMetrics''' | <li>Standaardiseer metrics via '''NormalizeMetrics''' | ||
<li>Check of boom met dit $id in eerdere versie van gemeentebestand een ander taxon (kan op genus, soort, cultivar nivo) vermeld was | <li>Check of boom met dit $id in eerdere versie van gemeentebestand een ander taxon (kan op genus, soort, cultivar nivo) vermeld was |
Huidige versie van 22 mei 2023 om 09:16
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.csv | Het 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 voor sommige bomen niet op basis van boomnummer met het gemeentebestand matcht (staat in ..data/Leiden/Gemeente folder) / (zie Selectielijsten) |
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) / (zie Selectielijsten) |
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.csv | Extract uit Wikipedia met cijfers per gemeente, nodig voor updaten obk_city_stats.csv (staat in ../data folder) |
taxon_names.js | Javascript 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.csv | Synopsis: totaal aantal bomen en soorten per park |
obk_leiden-counts.txt | Details: aantal bomen, per soort per park |
obk_leiden.csv | Bestand 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.log | Tellingen per veld, voor nerds |
obk_leiden.json | Zelfde 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.json | Het bestand dat op de OBK server wordt geplaatst, om vandaar door obk.htm opgehaald te worden |
obk_leiden.js | Variant 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.txt | Log file met resultaten van verwerken van obk_park_trees.txt |
obk_city_stats.csv | Centraal statistics bestand info over laatste run voor alle gemeentes |
Processing
functies binnen obk_csv2json.pl
main |
|
sub Setup | Bepaal alle bestandsnamen op basis van de gemeentenaam (uit de invoer obk_[leiden]_in.csv). Indien bestand aanwezig, lees boomnummers uit obk_skip_trees.txt en plaats deze in een hash %skip_trees. |
sub collectReferences | Lees door Overpass geexporteerde json bestand. Verzamel all boomnummers uit tags 'admin_ref' of 'tree:ref' in hash %admin_refs. Daarmee kunnen bomen in het gemeentebestand overgeslagen worden, omdat ze ook in OSM staan Leg en passant ook soortnaam en diameter in hashes vast. (normaliseer eerst inhoud van diameter) |
sub AddTreesFromOverpass | Nu alleen voor Leiden: voeg bomen uit OSM toe aan wat uit het gemeentebestand is gehaald. Dat zullen deels bomen zijn die nog niet in het gemeentebestand stonden. Maar ook bomen die er al waren, met betere data op OSM. Filteren van ongewenste bomen uit het gemeentebestand heeft plaatsgevonden, dus nu is het vooral inlezen van de Overpass json bestand en doorschrijven naar de output json bestand. |
sub SendLinesToOutput | Vervang locatie (straat , park) in de input, indien aanwezig, door andere locatie (uit obk_park_trees.txt), voordat json output door wordt gestuurd. Eerder ook: zorg dat laatste regel niet op een komma eindigt. (niet elke input regel wordt doorgestuurd naar output). |
sub FindPark | Check hash %park_trees of daar boom bekend is, zo ja retourneer park naam. |
sub FindPlace | Aangeroepen door SendLinesToOutput Vind nieuwe locatie via FindPark op basis van coordinaten of 'place=' tag of 'tree:ref' of 'admin_ref' tag |
sub NormalizeInput | Aanroep 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
|
sub NormalizeMetrics | Standaardiseer een aantal metrics, die per gemeente anders gecodeerd zijn. |
sub ConvertDelimitersEindhoven | (achterhaald) Converteer een gemeentebestand waar de delimiter een punt-comma is in plaats van een komma. |
sub ReplaceEmbeddedCommas | (aanroep door NormalizeInput) Vervang alle comma's uit de input die onderdeel zijn van een veld en niet bedoeld waren om velden te scheiden. |
sub FixTaxonName | Uit te breiden met naam correcties die nu vooral in javascript plaatsvinden, waar ze altijd aan bod komen, hier alleen voor gemeentes, maar hier geen performance kosten. |
sub CountSpeciesPerPark | Soorten tellen per park en formatteer namen voor kruisingen voor ze getoond worden Dat eerste is minder relevant nu tellingen vooral via obk_parks.csv lopen, dat laatste kan beter naar aparte routine |
sub ReportMunicipalityStats | Maak of update tellingen per gemeente in bestand obk_city_stats.csv (zie boven) |
sub StartChrome | Laadt de net gegenereerde json file automatisch in Chrome browser Alleen voor wie moe is om dat in een paar stappen zelf te doen. |
sub DoReport | Dupliceer info onder andere filenaam. Log tellingen, bijv. hoe vaak elke kruising (hybrid) voorkomt |
sub sub ReportWarningsToLog | Rapporteer anomalies, bijv. ongeldige reference numbers |
sub sub GetMunicipalityStats | Lees cijfers per gemeente uit obk_in_gemeenten.csv |
sub STDERR | Rapporteer alleen eerste 5 errors in running error log STDERR, maar alles in file STDERR |