OSM, PostGIS ve Docker: Otomatik İşleme için Bir Yaklaşım
2019 yazında Michael Marz, en önemli eşyaları çıkarmaya başladı. Openstreet haritası ve bunları yayınladı coğrafi paketler olarak alıntılar üzerinde web sayfası. O zamanlar onun koduna baktım ve bunun için Docker tabanlı bir iş akışı oluşturmaya söz verdim. Yarım yıl sonra ilk çalışan Docker konteynerimi sunmak istiyorum.
Michael'ın senaryolarının iş akışı basit:
- Postgis'i bir Ubuntu makinesine yükleyin
- Seçtiğiniz OSM alıntısını indirin (o seviyor küresel)
- DB'de biraz yer kazanmak için parçalara ayırın
- Verileri Postgis'e yükleyin
- Verileri bir coğrafi pakete dışa aktarın
- damla masası
- Bir sonraki parçayı al
Bir Docker kabının ana avantajı: Üç satır kod ve Docker takılı olan her Compter'da çalıştırabilirsiniz…
Docker: Başla
Basit sevdiğim gibi başlıyorum Basit bir Ubuntu kurulumu ile ve birçok kişiden birini seçmedim Postgis Docker kapları orada olan. Bu Docker'ın talimatı PostgreSQL dockerize etmek için harika bir başlangıç noktasıydı. Yine de en son kullanımı kullanmak istedim Postgresql Ve Postgil sürümler. Lütfen aşağıdaki kodu kaydedin Dockerfile:
# use of an ubuntu base for simplicity and transparency FROM ubuntu:18.04 MAINTAINER Riccardo Klinger # getting postgres RUN apt-get update && apt-get -y install wget gnupg2 RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - # Add PostgreSQL's repository. It contains the most recent stable release # of PostgreSQL, ``12``. RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main" > /etc/apt/sources.list.d/pgdg.list # Install software-properties-common and PostgreSQL 12 # and some other packages for ftp RUN apt-get update RUN DEBIAN_FRONTEND=noninteractive apt-get install -y software-properties-common postgresql-12 postgresql-client-12 postgresql-contrib-12 postgresql-12-postgis-3 postgresql-12-postgis-3-scripts aptitude unzip openssh-client openssh-server sshpass && aptitude update && aptitude install -y nano axel wput screen p7zip-full osmium-tool vnstat gdal-bin
Gördüğünüz gibi: Çok sayıda paket var. Ama sonunda, esas olarak Michael'ın adım adım talimatını takip ettim.
Docker dosya sistemi
Bir sonraki adım, indirilen dosyaları PBF özlerini tutmak için bir temel klasör oluştururken bazı dosya sistemi çalışmaları içerir ve ortaya çıkan coğrafi paketler:
WORKDIR /home/osmdata RUN mkdir /home/osmdata/pbf RUN mkdir /home/osmdata/gpkg COPY ./import_osm.sh /home/osmdata/pbf COPY ./mapping.yml /home/osmdata/pbf RUN RUN
Son satırda, yerel ana bilgisayardan makineye kopyalanan kabuk komut dosyasını yürütülebilir hale getirdim. Bu kabuk komut dosyası, makine PostGIS veritabanıyla çalışır ve çalışır durumda olduğunda tüm işi yapar.
Klasörler şu anda mevcut olduğu için, PBF dosyasını ilgilendiriyorum (bu durumda, sadece küçük bir veri kümesi olduğu için Bremen şehrinin OSM verilerini kullanıyorum. Ayrıca, etiketlenen PBF'ler olduğunda verileri postgilere itmek için ihtiyaç duyduğum için yükleme yüklüyorum:
## download imposm3 RUN wget https://github.com/omniscale/imposm3/releases/download/v0.10.0/imposm-0.10.0-linux-x86-64.tar.gz -P /home/osmdata && tar -xf /home/osmdata/imposm-0.10.0-linux-x86-64.tar.gz && cp -R /home/osmdata/imposm-0.10.0-linux-x86-64/* /home/osmdata/pbf/ && rm -R /home/osmdata/imposm-0.10.0-linux-x86-64 # Get the data and push it to the database RUN axel -n 3 -a -v https://download.geofabrik.de/europe/germany/bremen-latest.osm.pbf && osmium tags-filter bremen-latest.osm.pbf nwr/aerialway -o pbf/bremen-latest_aerialway.osm.pbf && osmium tags-filter bremen-latest.osm.pbf nwr/aeroway -o pbf/bremen-latest_aeroway.osm.pbf && osmium tags-filter bremen-latest.osm.pbf nwr/water -o pbf/bremen-latest_water.osm.pbf
PostgreSQL'den postgis'e
Dosya sistemi ve veriler şu anda mevcutken, postgilleri ve diğer bazı uzantıları “yüklüyorum”. Ayrıca 5432 bağlantı noktasını açıyorum ve dış adresleri dinlemeye izin veriyorum:
# switch USER USER postgres # Adjust PostgreSQL configuration so that remote connections to the # database are possible. RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/12/main/pg_hba.conf # And add ``listen_addresses`` to ``/etc/postgresql/12/main/postgresql.conf`` RUN echo "listen_addresses='*'" >> /etc/postgresql/12/main/postgresql.conf # Expose the PostgreSQL port EXPOSE 5432 # Create a PostgreSQL role named ``osmdata`` with ``osmdata`` as the password and # then create a database `osmdata` owned by the ``osmdata`` role and add # the postgis extension RUN /etc/init.d/postgresql start && psql --command "CREATE USER osmdata WITH SUPERUSER PASSWORD 'osmdata';" && createdb -O osmdata osmdata && psql -d osmdata --command "CREATE EXTENSION IF NOT EXISTS postgis;" && psql -d osmdata --command "CREATE EXTENSION IF NOT EXISTS postgis_topology;" && psql -d osmdata --command "CREATE EXTENSION hstore;" && psql -d osmdata --command "CREATE SCHEMA import;"
Sonraki satırlar, yukarıda belirtilen Dockerize PostgreSQL talimatından alınmıştır:
# Add VOLUMEs to allow backup of config, logs and databases VOLUME # Set the default command to run when starting the container CMD
GPKG klasörünü ekledim, çünkü bu, tüm dışa aktarımın depolanacağı klasör olacak. Daha sonra bu dosyalara erişmek için bu klasörü ana bilgisayara monte edeceğiz.
Konteyneri oluşturun ve çalıştırın
Bu Dockerfile Etiketle mevcut yolda Docker konteynerini oluşturmak için kullanılır osmgis:
docker build -t osmgis .
Yukarıdaki tüm adımlar yürütüldüğünde bu biraz zaman alacaktır. Bir şeyler ters giderse, bu çizgiyi yeniden canlandırabilirsiniz ve Docker, en son “başarılı” adımını kullanacaktır. Dockerfile Ve oradan başlayın. Önbelleğe alınmayan bina işlemi baştan sona yaklaşık 3 dakika sürer.
Yapım işlemi bittikten sonra, OSMGIS konteynerini çalıştırmanın zamanı geldi:
docker run --volume aLocalPath:/home/osmdata/gpkg --rm -P -p 0.0.0.0:55432:5432 -d --name osmgis osmgis
Lütfen kontrol edin: 55432 bağlantı noktasıyla ana bilgisayardaki postgis veritabanını kullanabilirsiniz. alocalpat Shell komut dosyasını yürüttükten sonra dışa aktarılan dosyalara erişmenizi sağlayacaktır.
Verileri içe aktarma ve coğrafi paketlerin çıkarılması
Konteyner çalışmaya başladıktan sonra, kopyalanan kabuk komut dosyasını içe aktarıyorum_osm.sh. Bu senaryo Bütün sihir. Ana noktalar:
- PBF dosyalarını yineleyin
- PBF'lerin IMPOSM3 ve önceden tanımlanmış bir haritalama
- OGR2ogr kullanarak tablolardan puan, çizgiler ve çokgenlerle bir jeop paketin çıkarılması
- Üç tabloyu bir sonraki parçalar için biraz yer açmak için bırakmak
Bu yapıldıktan sonra, coğrafi paketleri alocalpat. Verileri hemen bir FTP sunucusuna göndermek istiyorsanız. Komut dosyasını üç parametre ile başlatın ve gidin:
docker exec -it osmgis /home/osmdata/pbf/import_osm.sh
GPKG'leri bir FTP sunucusuna itmek istiyorsanız:
docker exec -it osmgis /home/osmdata/pbf/import_osm.sh USERNAME FTPSERVER password
Ekstrakt başarılı ise ve konteynere artık ihtiyacınız yoksa, kabı kapatmak isteyebilirsiniz:
docker stop osmgis
Hepsini indirebilirsiniz Dosyalar doğrudan GitHub'daki Michaels Deposu'ndan.