<div dir="ltr">Ciao a tutti,<div><br></div><div>volevo informarvi che in questi giorni ho fatto un refactor del progetto cambiando diverse cose.</div><div>In buona fede speravo di offrire alla comunità qualcosa di nuovo, ma visti i vari scogli incontrati ho deciso di eliminare tutti gli automatismi e ridurre allo stretto necessario le funzionalità: convertire un csv in un file osm.</div><div><br></div><div>Premetto che trovate tutto qui:</div><div><br></div><div>- OSM wiki: 

<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><a href="https://wiki.openstreetmap.org/wiki/OpenData_Puglia_Import">https://wiki.openstreetmap.org/wiki/OpenData_Puglia_Import</a><span> </span></span>

</div><div>- repo GitHub: <a href="https://github.com/londrake/jcsv2osm/">https://github.com/londrake/jcsv2osm/</a></div><div><br></div><div>ovviamente la wiki verrà aggiornata di pari passo, non appena si avranno nuovi file (osm, nuovi dataset) o individuati i tag e comunicando alla comunità i progressi fatti.</div><div><br></div><div>In breve: dato che i csv da processare non sono ben formattati per una diretta conversione in osm (con csv2osm) ho dovuto fare una fase di pre-processing (attraverso un mio script) dove mappo ciascun header - di interesse - del csv con una chiave di osm (se la corrispondenza è univoca).</div><div><br></div><div>Banalmente header = "titolo del bene rappresentato" --> key = "name" il cui valore v, sarà il contenuto di ciascuna riga per la colonna 

<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">"titolo del bene rappresentato"</span>

.</div><div><br></div><div>Data la natura dei dataset, non tutti gli header possono essere mappati in un unico valore di k ma il valore di k e v dipendono delle volte dal contenuto della cella legata ad h.</div><div><br></div><div>Per esempio, la colonna Genere_1 contenente il valore MASSERIA identifica la tipologia del nodo, ma il tag corrispondente a MASSERIA è k = place e v = hamlet.</div><div>Per questa operazione viene usato un dizionario (json) popolato a mano che tiene traccia proprio di questa corrispondenza.</div><div>Sperando di fare cosa gradita l'ho "esteso al multilingua", ovvero ogni oggetto del json è corredato di una serie di localizzazioni del vocabolo: it_IT = Valore, en_EN = Value legati a una lista di tag espressi come coppia di chiave-valore, in modo tale che in base alla lingua predefinita, l'algoritmo di ricerca andrà a guardare nel linguaggio selezionato.</div><div><br></div><div>L'output di questo script è un csv "well formatted" per csv2osm e quindi si ottiene il file osm corrispondente al dataset.</div><div><br></div><div>Ricapitolando:</div><div><br></div><div>Dataset.csv => Dataset_clean.csv(* )=> Dataset2osm.csv => dataset.osm(**)</div><div><br></div><div><br></div><div>*Per alcuni dataset come quelli contenenti le collezioni, ad esempio quello sulle masserie, vi sono diversi record che fanno capo a un bene fisico: la MASSERIA X. Per questi dataset, oltre alla fase di pulizia dei record le cui colonne di interesse (da mappare) contengono valori nulli o incorretti, viene eseguito un processo di "accorpamento" dove emerge il solo BENE FISICO, ma mantenendo il riferimento alla risorsa digitale nella Digital Library (concatenate dalla sequenza di caratteri -|-).</div><div><br></div><div>Spiego meglio: il dataset D contiene delle foto (F) riguardanti un bene o collezione (B) ed un riferimento della foto del bene sul portale (L) che contiene info aggiuntive.</div><div>F1 | B1 | L1</div><div>

<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">F2 | B1 | L2</span><br></div><div>

<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">F2 | B1 | L3</span> <br></div><div>

<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">F1 | B2 | L1</span>

<br></div><div>

<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration-style:initial;text-decoration-color:initial;background-color:rgb(255,255,255);float:none;display:inline">F2 | B2 | L12</span> <br></div><div><br></div><div>diventa</div><div><br></div><div>

<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">F1 | B1 | L1</span> -|- L2 -|- L3<br></div><div>

<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration-style:initial;text-decoration-color:initial;background-color:rgb(255,255,255);float:none;display:inline">F1 | B2 | L1</span><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"> -|- L2 </span><br></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br></span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">quindi banalmente B1 e B2 verranno prese in considerazione come la risorsa fisica che si vuol mappare per il dataset D.</span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br></span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br></span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">** In realtà lo script implementa qualche features aggiuntiva, come il resume su i nodi che non hanno trovato alcuna corrispondenza sulla categoria 

<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">(evitando di riprocessare l'intero csv)</span>

o integrando (quasi totalmente) la funzione di serializzazione e controllo delle coordinate di csv2osm, serializza direttamente un file osm evitando il penultimo step.</span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Un dataset di esempio è scaricabile qui: <a href="https://github.com/londrake/jcsv2osm/tree/master/test%20and%20result/masserie_clean_csv">https://github.com/londrake/jcsv2osm/tree/master/test%20and%20result/masserie_clean_csv</a></span></div><div><br></div><div><br></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br></span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Per quanto riguarda la conflation, come suggerito da Maurizio Napolitano nei primi post,  prima la eseguivo facendo un controllo stretto (soglia del 60%, che secondo la letteratura individua due stringhe identiche) tra 

<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">il nome del mio PO</span>  il valore del tag "name"  di una lista di node e way ottenuti attraverso una query Overpassturbo in un raggio di 200mt dalle coordinate in mio possesso.</span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Questo meccanismo l'ho già implementato, e posso integrarlo facilmente, se per voi risulta idoneo. In alternativa, come espresso nella pagina del progetto la conflation verrà eseguita col plugin di JOSM.</span></div><div><br></div><div>N.B. Per via della concatenazione  L1 -|- ... -|- Ln, csv2osm è stato modificato lievemente per gestire questo fattore. Ovvero se il valore contiene -|-, viene fatto una esplosione su quel carattere e per ogni valore viene generato un tag k = L1, k = L2,..., k = Ln.</div><div><br></div><div>Fatemi sapere se è tutto ok ed accettabile, ed in caso positivo come procedere per ottenere l'autorizzazione.</div><div><br></div><div>P.s. Per quanto riguarda il consiglio sugli edit, la persona che gestirà l'upload si sta attrezzando per prendere dimestichezza con l'ambiente. :)</div><div><br></div><div>Luca Riccardi</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">Il giorno 29 gennaio 2018 10:50, Andrea Musuruane <span dir="ltr"><<a href="mailto:musuruan@gmail.com" target="_blank">musuruan@gmail.com</a>></span> ha scritto:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Ciao,<br><div class="gmail_extra"><br><div class="gmail_quote"><span class="">2018-01-29 10:45 GMT+01:00 Luca Riccardi <span dir="ltr"><<a href="mailto:l.riccardi90@gmail.com" target="_blank">l.riccardi90@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Ciao,<div><br></div><div>proverò a fare qualche import, ho già seguito il tutorial che mette a disposizione OSM, e stavo provando a creare un nodo con JOSM, anche solo per vedere il file OSM XML che genera ( nel caso fosse possibile).</div></div></blockquote><div><br></div></span><div>Il suggerimento era di fare qualche edit (non qualche import) prima di avventurarsi con l'import per capire il funzionamento di OSM (ad esempio cos'è un changeset).</div><div><br></div><div>Ciao,</div><div><br></div><div>Andrea</div><div><br></div></div></div></div>
<br>______________________________<wbr>_________________<br>
Talk-it mailing list<br>
<a href="mailto:Talk-it@openstreetmap.org">Talk-it@openstreetmap.org</a><br>
<a href="https://lists.openstreetmap.org/listinfo/talk-it" rel="noreferrer" target="_blank">https://lists.openstreetmap.<wbr>org/listinfo/talk-it</a><br>
<br></blockquote></div><br></div>