Skip to content

Instantly share code, notes, and snippets.

@jachym
Last active July 9, 2020 09:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jachym/78b4588983d27cfca780c0dbe4da0283 to your computer and use it in GitHub Desktop.
Save jachym/78b4588983d27cfca780c0dbe4da0283 to your computer and use it in GitHub Desktop.
MapServer Basemaps: instalace, publikace a vlastní styly

Cíle

  1. Publikovat mapovou službu nad daty OpenStreetMap, která bude publikovat tato data jako WMS v určitých stylech (Google, Default, BW, ...)
  2. Vytvořit vlastní styl, upravit, otestovat (např. v QGIS)

Linky

Příprava a stažení všeho potřebného

  1. Instalace potřebných balíků
  2. Vyklonovat projekt basemaps (použijeme fork OpenGeoLabs)
  3. Stáhnout potřebné pokladová globální mapa - hranice kontinentů a generalizované hranice kontinentů
  4. Nastavit databázi PostgreSQL

Instalace závislostí

Na Ubuntu:

sudo apt-get install mapserver-bin mapcache-tools cgi-mapserver gdal-bin postgresql postgis\
          build-essential python-dev protobuf-compiler libprotobuf-dev libtokyocabinet-dev python3-psycopg2 osmctools

Nainstalovat Imposm

  1. Připravit adresářovou strukturu
sudo make -p /opt
cd opt
  1. stáhnout imposm3 z githubu
wget https://github.com/omniscale/imposm3/releases/download/v0.10.0/imposm-0.10.0-linux-x86-64.tar.gz
  1. rozbalit
tar -xzf imposm-0.10.0-linux-x86-64.tar.gz
  1. Udělat si link, aby byl soubor spustitelný
sudo ln -s /opt/imposm-0.10.0-linux-x86-64/imposm /usr/local/bin/imposm
  1. ověřit fungování
imposm --help

Vytvoření databáze a instalace PostGIS

Pokud už nějakou podobnou databázi máš, tak samozřejmě nevytvářet

sudo -u postgres createdb osm

Vytvořit uživatele osm pro databázi osm a nastavit heslo

sudo -u postgres createuser -P osm
Enter password for new role: 
Enter it again:

V rámci databáze osm vytvořit extensi postgis

sudo -u postgres psql osm

osm=> CREATE EXTENSION postgis;
osm=> \q

Klon projektu basemaps

Vyklonujeme projekt basemaps (původně z MapServer, ale použijeme fork OpenGeoLabs, protože toho v sobě už má víc)

git clone ssh://git@github.com/opengeolabs/basemaps.git
cd basemaps

Stáhnout potřebná pokladová globální data

  1. Hranice kontintentů
  2. Generalizované hranice kontinentů

Uložit do adresáře basemaps/data/

mkdir data
cd data
wget https://osmdata.openstreetmap.de/download/land-polygons-complete-3857.zip
wget https://osmdata.openstreetmap.de/download/simplified-land-polygons-complete-3857.zip

Rozbalit

unzip land-polygons-complete-3857.zip
unzip simplified-land-polygons-complete-3857.zip

Nakopírovat obsah adresářů do adresáře basemaps/data

mv land-polygons-complete-3857/* ../
mv simplified-land-polygons-complete-3857/* ../

Vytvořit indexy

# cd basemaps/data
make

Vytvořit wrapper pro hlavní Makefile: Soubor basemaps/aname.mk, který nastaví některé potřebné proměnné pro výslední MapFile

OSM_SRID = 3857
OSM_PREFIX = osm_new_
OSM_DB_CONNECTION = host=localhost dbname=osm user=osm password=HESLO_UZIVAKA_OSM port=5432
include Makefile

Import dat

Použijeme Luxembursko, protože je rozumně velké. Je dohromady jedno, na čem to budeš testovat

cd basemaps
wget http://download.geofabrik.de/europe/luxembourg-latest.osm.pbf

Import do PostgreSQL

imposm import -connection postgis://osm:osm@localhost/osm -mapping CESTA_K_BASEMAPS/basemaps/imposm3-mapping.json -read luxembourg-latest.osm.pbf -write -optimize -overwritecache -srid 3857

V databázi by měly být tabulky s prefixem osm_new_ s daty (takhle jsme si to už dřív napsali do souboru aname.mk

sudo -u postgres psql osm

osm=# \dt
                  List of relations
 Schema |           Name           | Type  |  Owner   
--------+--------------------------+-------+----------
 public | osm_new_admin            | table | osm
 public | osm_new_aeroways         | table | osm
 public | osm_new_amenities        | table | osm
 public | osm_new_buildings        | table | osm
 public | osm_new_landusages       | table | osm
 public | osm_new_landusages_gen0  | table | osm
 public | osm_new_landusages_gen00 | table | osm
 public | osm_new_landusages_gen1  | table | osm
 public | osm_new_places           | table | osm
 public | osm_new_railways         | table | osm
 public | osm_new_railways_gen0    | table | osm
 public | osm_new_railways_gen1    | table | osm
 public | osm_new_roads            | table | osm
 public | osm_new_roads_gen0       | table | osm
 public | osm_new_roads_gen1       | table | osm
 public | osm_new_transport_areas  | table | osm
 public | osm_new_transport_points | table | osm
 public | osm_new_waterareas       | table | osm
 public | osm_new_waterareas_gen0  | table | osm
 public | osm_new_waterareas_gen1  | table | osm
 public | osm_new_waterways        | table | osm
 public | osm_new_waterways_gen0   | table | osm
 public | osm_new_waterways_gen1   | table | osm
 public | spatial_ref_sys          | table | postgres
(24 rows)

osm=#

Vygenerování stylů

Stačí dát jenom make a jako vstupní soubor námi předpřipravený aname.mk. Jako parametr musíme explicitně uvézt styl

make -f aname.mk STYLE=google
make -f aneme.mk STYLE=bw

Měly by vzniknout dva soubory: osm-google.map a osm-bw.map

Měly by v nich být koretní napojení do databáze, v SQL Selectech je vidět správné jméno tabulky s prefixem osm_new_

MAP
          ...
          LAYER
                    ...
                    CONNECTIONTYPE postgis
                    CONNECTION "host=localhost dbname=osm user=osm password=HESLO_OSM port=5432"
                    DATA "geometry from (select geometry,osm_id, name as name from osm_new_buildings) as foo using unique osm_id using srid=3857"

         ...
...
END

Nainstalovat a rozchodit HTTPD webový server s MapServerem

Je možné použít lighthttpd, nginx, cokoliv, ale ukážu to na Apach2. Nejlépe je to popsané na https://github.com/mapserver/mapserver/wiki/Install-mapserver-on-ubuntu-18.04-from-official-repository takže parafrázuju:

  1. Nainstalovat apache2 a všechny potřebné balíky
sudo apt-get install apache2 apache2-bin apache2-utils cgi-mapserver mapserver-bin
  1. Povolit mod-cgi do serveru
sudo a2enmod cgi fcgid
  1. Nakonfigurovat spustitelnost skriptu v Apachi, podívat se, jestli je v souboru /etc/apache2/sites-available/000-default.conf něco takového a případně to tam doplnit nebo upravit
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin/">
            AllowOverride All
            Options +ExecCGI -MultiViews +FollowSymLinks
            AddHandler fcgid-script .fcgi
            Require all granted
    </Directory>
  1. Server restart
sudo service apache2 restart

Testování, ověření

  1. V příkazové řádce
mapserv -v
  1. V prohlížeči http://localhost/cgi-bin/mapserv?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities

  2. Přidat cestu k našemu google mapfile http://localhost/cgi-bin/mapserv?MAP=/home/USER/src/basemaps/osm-google.map&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities

  3. Přidat adresu http://localhost/cgi-bin/mapserv?MAP=/home/USER/src/basemaps/osm-google.map do QGIS jako vrstvu WMS a vyzkoušet

@jachym
Copy link
Author

jachym commented Mar 25, 2020

CGI skript pro případné přidání do /usr/lib/cgi-bin/google

#!/bin/bash

export MAP=/home/USER/src/basemaps/osm-google.map

mapserv

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment