Files
secondo/bin/Scripts/import_osm_germany.sh

107 lines
4.2 KiB
Bash
Raw Normal View History

2026-01-23 17:03:45 +08:00
#!/bin/bash
#
# Due to some limitations of the SHP file format
# (filesize must be < 2 GB) only the SHP files
# for the german states are available at geofabrik.de.
#
# This script download, import and merge the 16 german
# states into the database $database
#
# Author: Jan Nidzwetzki
#####################################################
# The base url
baseurl="http://download.geofabrik.de/europe/germany/"
# The regions to download
regions="baden-wuerttemberg bayern berlin brandenburg bremen hamburg hessen mecklenburg-vorpommern niedersachsen nordrhein-westfalen rheinland-pfalz saarland sachsen sachsen-anhalt schleswig-holstein thueringen"
# The name of the database in SECONDO
database="germany"
# Datadir
datadir="osm-germany"
cd $SECONDO_BUILD_DIR/bin
if [ ! -x ./SecondoBDB ]; then
echo "You are not inside the SECONDO dir, exting..."
exit -1
fi
if [ ! -d $datadir ]; then
echo "Creating the download directory"
mkdir osm-germany
fi
cd $datadir
# Create the secondo script
tmpfile=$(mktemp)
echo "create database $database;" > $tmpfile
echo "open database $database;" >> $tmpfile
# Remove invaid chars for region names
secondo_regions=$(echo $regions | sed s/-//g)
# Import the regions
for region in $regions; do
# Download the region if needed
if [ ! -d $region ]; then
mkdir $region
cd $region
filename="$region-latest-free.shp.zip"
echo "Downloading region $region"
wget $baseurl/$filename
unzip $filename
cd ..
fi
# Remove invaid chars for region name
secondo_region=$(echo $region | sed s/-//g)
echo "delete Natural_$secondo_region;" >> $tmpfile
echo "delete Roads_$secondo_region;" >> $tmpfile
echo "delete Buildings_$secondo_region;" >> $tmpfile
echo "let Natural_$secondo_region = dbimport2('../bin/$datadir/$region/gis_osm_natural_free_1.dbf') addcounter [No , 1] shpimport2 ('../bin/$datadir/$region/gis_osm_natural_free_1.shp') namedtransformstream [GeoData ] addcounter [No2, 1] mergejoin [No, No2] remove [No, No2 ] filter [ isdefined ( bbox(.GeoData ))] validateAttr consume;" >> $tmpfile
echo "let Roads_$secondo_region = dbimport2('../bin/$datadir/$region/gis_osm_roads_free_1.dbf') addcounter [No , 1] shpimport2 ('../bin/$datadir/$region/gis_osm_roads_free_1.shp') namedtransformstream [GeoData ] addcounter [No2, 1] mergejoin [No, No2] remove [No, No2 ] filter [ isdefined ( bbox(.GeoData ))] validateAttr consume;" >> $tmpfile
echo "let Buildings_$secondo_region = dbimport2('../bin/$datadir/$region/gis_osm_buildings_a_free_1.dbf') addcounter [No , 1] shpimport2 ('../bin/$datadir/$region/gis_osm_buildings_a_free_1.shp') namedtransformstream [GeoData ] addcounter [No2, 1] mergejoin [No, No2] remove [No, No2 ] filter [ isdefined ( bbox(.GeoData ))] validateAttr consume;" >> $tmpfile
echo "let Landuse_$secondo_region = dbimport2('../bin/$datadir/$region/gis_osm_landuse_a_free_1.dbf') addcounter [No , 1] shpimport2 ('../bin/$datadir/$region/gis_osm_landuse_a_free_1.shp') namedtransformstream [GeoData ] addcounter [No2, 1] mergejoin [No, No2] remove [No, No2 ] filter [ isdefined ( bbox(.GeoData ))] validateAttr consume;" >> $tmpfile
done
# Merge regions
arr=($secondo_regions)
firstregion=${arr[0]};
echo "delete Natural;" >> $tmpfile
echo "delete Roads;" >> $tmpfile
echo "delete Buildings;" >> $tmpfile
echo "delete Landuse;" >> $tmpfile
natural="let Natural=Natural_$firstregion feed "
roads="let Roads=Roads_$firstregion feed "
buildings="let Buildings=Buildings_$firstregion feed "
landuse="let Landuse=Landuse_$firstregion feed "
for ((i=1; i<${#arr[*]}; i++)); do
natural="$natural Natural_${arr[i]} feed concat "
roads="$roads Roads_${arr[i]} feed concat "
buildings="$buildings Buildings_${arr[i]} feed concat "
landuse="$landuse Landuse_${arr[i]} feed concat "
done
echo "$natural trimAllUndef consume;" >> $tmpfile
echo "$roads trimAllUndef consume;" >> $tmpfile
echo "$buildings trimAllUndef consume;" >> $tmpfile
echo "$landuse trimAllUndef consume;" >> $tmpfile
# Create forest region
echo "delete Forest;" >> $tmpfile
echo "let Forest = Landuse feed filter[.Fclass contains 'forest'] consume;" >> $tmpfile
# Create database in SECONDO
cat $tmpfile
cd $SECONDO_BUILD_DIR/bin
./SecondoBDB -i $tmpfile
rm $tmpfile