[Talk-it] Script per creare mappe obf (OsmAnd) senza problemi di OutOfMemory

Stefano Droghetti stefano.droghetti a gmail.com
Mar 5 Lug 2016 12:02:05 UTC


Il 05/07/2016 13:02, Max1234Ita ha scritto:
> Ho provato a scaricare lo "script": 419 mega mi sembrano un po' tantini per
> un po' di codice... o-O

Il "mero" script è questo:

=======================

#!/bin/bash

# Questo script utilizza Splitter e OsmAndCreator per suddividere
# un file .osm.pbf o un file .osm.bz2 in molte sottomappe,
# per ignuna di esse crea una mappa .obf navigabile con OsmAnd
# e un file unico per la ricerca degli indirizzi.

# Autore: Stefano Droghetti
# Licenza: GPL

# Schermata di presentazione

zenity --info --title="Osmux" --text="Questo script converte una 
mappa\nOSM dal formato .osm.bz2 o .osm.pbf\nnel formato obf per OsmAnd."

# Chiedo quanta memoria minima deve avere (richiesto per Java)

MINIMO=`zenity --entry --height=300 --width=240 --title="Osmux" 
--text="Memoria minima da utilizzare in MB (default=128MB)"`

# Se non viene scritto nulla, si prende il default

if [ "$MINIMO" = "" ]; then
     MINIMO=128
fi

# Se non è un nmero, esce

if ! [ "$MINIMO" -eq "$MINIMO" ] 2> /dev/null
then
     zenity --info --title="Osmux" --text="Solo numeri interi!\nBye bye!"
     exit
fi

echo $MINIMO

# Stessa cosa di prima, per la memoria massima

MASSIMO=`zenity --entry --height=300 --width=240 --title="Osmux" 
--text="Memoria massima da utilizzare in MB (default=3000MB)"`

if [ "$MASSIMO" = "" ]; then
     MASSIMO=3000
fi

if ! [ "$MASSIMO" -eq "$MASSIMO" ] 2> /dev/null
then
     zenity --info --title="Osmux" --text="Solo numeri interi!\nBye bye!"
     exit
fi

echo $MASSIMO

# Chiede dov'è il file OSM da convertire

DIRFILE=`zenity --file-selection --title="Seleziona il file .osm.bz2 o 
osm.pbf da convertire"`

if [ "$DIRFILE" = "" ]; then
     zenity --info --title="Osmux" --text="Bye bye!"
     exit
fi

# Controlla che il file sia di tipo consenstito e mette
# nome file, cartella, estensione eccetera in varie variabili

ESTENSIONE=".osm.bz2"
ESTENSION2=".osm.pbf"
NOMEFILE=`basename $DIRFILE`
BASEFILE=${NOMEFILE%%$ESTENSIONE}
if [ $BASEFILE = $NOMEFILE ]; then
     BASEFILE=${NOMEFILE%%$ESTENSION2}
fi
ESTENS=${NOMEFILE##$BASEFILE}
echo "DIRFILE = $DIRFILE"
echo "NOMEFILE = $NOMEFILE"
echo "BASEFILE = $BASEFILE"
echo "ESTENS = $ESTENS"
if [ "$ESTENS" != "$ESTENSIONE" -a "$ESTENS" != "$ESTENSION2" ]; then
     zenity --error --title="Errore" --text="Sono ammessi soltanto file 
di tipo $ESTENSIONE o $ESTENSION2"
     exit
fi


# Cancella file inutili

cd osmand-gen
rm *.*
cd ..

cd osmand-pbf
rm *.*
cd ..

cd tmp
rm *.*
cd ..

cd osmand-obf
rm *.*
cd ..

rm *.log

# Fa partire il cronometro

START=$(date +%s.%N)

# Usa splitter per suddividere le mappe

cd tmp

echo -e "\n\n\n\nDivisione della mappa in piccole sottomappe...\n\n\n\n\n"

java -Xms${MINIMO}M -Xmx${MASSIMO}M -jar ../splitter/splitter.jar $DIRFILE
mv *.osm.pbf ../osmand-pbf
cd ..

# Converte ognuna della mappe in .obf

echo -e "\n\n\n\nCreazione delle mappe .obf...\n\n\n\n\n"

cd OsmAndMapCreator-main
java -Djava.util.logging.config.file=logging.properties -Xms${MINIMO}M 
-Xmx${MASSIMO}M -cp 
"./OsmAndMapCreator.jar:lib/OsmAnd-core.jar:./lib/*.jar" 
net.osmand.data.index.IndexBatchCreator ../batch-normale.xml

# Usa le mappe .obf create per creare un unico file di indirizzi

echo -e "\n\n\n\nUnione delle mappe in un unico file...\n\n\n\n\n"

java -Djava.util.logging.config.file=logging.properties -Xms${MINIMO}M 
-Xmx${MASSIMO}M -cp 
"./OsmAndMapCreator.jar:lib/OsmAnd-core.jar:./lib/*.jar" 
net.osmand.MainUtilities merge-index ../osmand-obf/${BASEFILE}.obf 
--address ../osmand-obf/${1}*.obf

cd ..

# Cancella i file inutili e rinomina le mappe.

cd osmand-obf
rm *.log
rm 6324*.*
cd ..

cd osmand-gen
rm *.*
cd ..

cd osmand-pbf
rm *.*
cd ..

cd tmp
rm *.*
cd ..

# Ferma il cronometro e calcola quanto ci ha messo

END=$(date +%s.%N)
DIFF=$(echo "$END - $START" | bc)
TEMPO=`date -d@$DIFF -u +%H:%M:%S`

# Schermata finale con apertura cartella con i file creati

zenity --info --title="Osmux" --text="Si aprira' ora una 
finestra\ncontenente il file da copiare\nnella cartella di OsmAnd sullo 
smartphone.\n\nMappa creata in $TEMPO"

xdg-open osmand-obf

echo "Bye bye!"
exit

=============================

A cui bisogna aggiungere il file chiamato batch-normale.html

<?xml version="1.0" encoding="utf-8"?>
<batch_process>
     <process_attributes mapZooms="" renderingTypesFile=""
                 zoomWaySmoothness="" osmDbDialect="sqlite" 
mapDbDialect="sqlite" />
     <process directory_for_osm_files="../osmand-pbf"
         directory_for_index_files="../osmand-obf"
         directory_for_generation="../osmand-gen"
         skipExistingIndexesAt="../osmand"
         indexPOI="true" indexRouting="true" indexMap="true"
         indexTransport="true" indexAddress="true"/>
</batch_process>

===============================

Lo script auto.sh l'ho modificato ulteriormente e adesso mette la data 
nel nome del file:

#!/bin/bash

# Questo script utilizza Splitter e OsmAndCreator per suddividere
# un file .osm.pbf o un file .osm.bz2 in molte sottomappe,
# per ignuna di esse crea una mappa .obf navigabile con OsmAnd
# e un file unico per la ricerca degli indirizzi.

# Versione automatizzata per l'Italia: scarica e compila tutto da solo

# Autore: Stefano Droghetti
# Licenza: GPL

echo -e "\n\nQuesto script converte una mappa\nOSM dal formato .osm.bz2 
o .osm.pbf\nnel formato obf per OsmAnd.\n\n\n"

# Parametri da cambiare all'uopo

MINIMO=128
MASSIMO=2000
FILEPAESE=italy-latest # Nome del file .osm.pbf corrispondente al paese 
da scaricare (controllare su http://download.geofabrik.de/europe.html)
PAESE=Italy            # Nome del paese da scaricare

# Scarica l'ultima mappa

echo -e "Scarico l'ultima mappa disponibile per la seguente nazione: 
$PAESE\n\n\n"

# Trova la data della mappa e la aggiunge al nome del file

VERSIONE=`curl -s "http://download.geofabrik.de/europe.html" | egrep -o 
"contains all OSM data up to .{10}" | egrep -o ".{10}$"`

rm *.pbf
aria2c http://download.geofabrik.de/europe/italy-latest.osm.pbf
mv ./$FILEPAESE.pbf ./$PAESE.osm.pbf

# Cancella file inutili

echo -e "Rimozione file obsoleti\n\n\n"

cd osmand-gen
rm *.*
cd ..

cd osmand-pbf
rm *.*
cd ..

cd tmp
rm *.*
cd ..

cd osmand-obf
rm *.*
cd ..

rm *.log

# Fa partire il cronometro

START=$(date +%s.%N)

# Usa splitter per suddividere le mappe

cd tmp

echo -e "\n\n\n\nDivisione della mappa in piccole sottomappe...\n\n\n\n\n"

java -Xms${MINIMO}M -Xmx${MASSIMO}M -jar ../splitter/splitter.jar 
../$PAESE.osm.pbf
mv *.osm.pbf ../osmand-pbf
cd ..

# Converte ognuna della mappe in .obf

echo -e "\n\n\n\nCreazione delle mappe .obf...\n\n\n\n\n"

cd OsmAndMapCreator-main
java -Djava.util.logging.config.file=logging.properties -Xms${MINIMO}M 
-Xmx${MASSIMO}M -cp 
"./OsmAndMapCreator.jar:lib/OsmAnd-core.jar:./lib/*.jar" 
net.osmand.data.index.IndexBatchCreator ../batch-normale.xml

# Usa le mappe .obf create per creare un unico file di indirizzi

echo -e "\n\n\n\nUnione delle mappe in un unico file...\n\n\n\n\n"

java -Djava.util.logging.config.file=logging.properties -Xms${MINIMO}M 
-Xmx${MASSIMO}M -cp 
"./OsmAndMapCreator.jar:lib/OsmAnd-core.jar:./lib/*.jar" 
net.osmand.MainUtilities merge-index ../osmand-obf/Italy.obf --address 
../osmand-obf/${1}*.obf

cd ..

# Cancella i file inutili e rinomina le mappe.

cd osmand-obf
rm *.log
rm 6324*.*
cd ..

cd osmand-gen
rm *.*
cd ..

cd osmand-pbf
rm *.*
cd ..

cd tmp
rm *.*
cd ..

# Ferma il cronometro e calcola quanto ci ha messo

END=$(date +%s.%N)
DIFF=$(echo "$END - $START" | bc)
TEMPO=`date -d@$DIFF -u +%H:%M:%S`

# Rinomina il file aggiungendo la data di download dei dati originali

cd osmand-obf
mv ./$PAESE.obf ./$PAESE.$VERSIONE.obf
cd ..

# apertura cartella con i file creati

echo -e "Mappa creata in $TEMPO"
echo -e "\nSi aprirà ora una finestra\ncontenente il file da 
copiare\nnella cartella di OsmAnd sullo smartphone"

xdg-open osmand-obf

echo -e "\n\nBye bye!"

exit

===============================

Dentro la cartella in cui metti auto.sh, go.sh e batch-normale.html devi 
mettere anche queste cartelle:

osmand-gen (vuota)
osmand-pbf (vuota)
osmand-obf (vuota)
tmp (vuota)
splitter (con dentro l'ultima versione di Splitter)
OsmAndMapCreator-main (con dentro l'ultima versione di OsmAndMapCreator)

-- 
Stefano Droghetti
www.stefanodroghetti.it
stefano.droghetti at gmail.com




Maggiori informazioni sulla lista Talk-it