Tegola es un servidor de teselas vectoriales de código abierto para OpenStreetMap . Anteriormente explicamos el proceso de configuración del servidor de teselas de OSM con mapnik y mod_tile, que es un ráster servidor de teselas basado en. Este tutorial le mostrará cómo configurar Tegola vector servidor de teselas en Ubuntu 20.04.
Beneficios de los mosaicos vectoriales
- Mejor calidad de visualización para dispositivos de alto DPI (pantalla retina)
- Pequeño formato eficiente (no se necesitan imágenes de 512 x 512)
- Texto más claro y legible
- Etiquetado sobre la marcha para visualización frontal
- Separe el contenido y el estilo, lo que permite crear varios estilos que apunten a la misma pila de mosaicos.
- Modo día y noche
Formatos de teselas vectoriales
Hay varios formatos para teselas vectoriales.
- GeoJSON
- TopoJSON
- Tesela vectorial de Mapbox (MVT)
- 05m
- OpenScienceMap binario
- Arc GeoServices JSON
Tegola utiliza el formato de mosaico vectorial Mapbox.
Requisitos previos/Requisitos de hardware
La memoria RAM y el espacio en disco necesarios dependen del mapa del país que vaya a utilizar. Por ejemplo,
- El mapa del Reino Unido requiere al menos 12 GB de RAM y 100 GB de espacio en disco.
- Todo el mapa del planeta requiere al menos 32 GB de RAM y 1 TB de SSD (unidad de estado sólido). No es viable utilizar un disco duro giratorio para todo el mapa del planeta.
Lleva mucho tiempo importar datos de mapas grandes, como todo el planeta, a la base de datos PostgreSQL. Considere agregar más RAM y especialmente usar SSD en lugar de girar el disco duro para acelerar el proceso de importación.
Si vas a alojar todo el mapa del mundo, te recomiendo que compres el VPS extragrande de Contabo, que presume
- Una CPU de 10 núcleos
- 60 GB de RAM
- SSD Intel Optane de 1,6 TB
Cuesta solo 26,99 €/mes.
Paso 1:Actualización del software
Siempre es una buena práctica actualizar el software del servidor antes de realizar cualquier trabajo importante en su servidor. Inicie sesión en su servidor a través de SSH y ejecute el siguiente comando.
sudo apt update; sudo apt upgrade
Paso 2:Instale el servidor de base de datos PostgreSQL y la extensión PostGIS
Usaremos PostgreSQL para almacenar datos de mapas. PostGIS es una extensión geoespacial de PostgreSQL. Ejecute los siguientes comandos para instalarlos.
sudo apt install postgresql postgresql-contrib postgis postgresql-12-postgis-3
El servidor de la base de datos PostgreSQL se iniciará automáticamente y escuchará en 127.0.0.1:5432
. El postgres
El usuario se creará en el sistema operativo durante el proceso de instalación. Es el superusuario del servidor de base de datos PostgreSQL. De forma predeterminada, este usuario no tiene contraseña y no es necesario establecer una porque puede usar sudo
para cambiar a postgres
usuario e inicie sesión en el servidor PostgreSQL.
sudo -u postgres -i
Ahora puede crear un usuario de base de datos PostgreSQL osm
.
createuser osm
Establezca una contraseña para el usuario de osm.
psql -c "ALTER USER osm WITH PASSWORD 'secret_password';"
Luego crea una base de datos llamada osm
y al mismo tiempo hacer osm
como propietario de la base de datos. -E UTF8
especifica que el esquema de codificación de caracteres que se usará en la base de datos es UTF8.
createdb -E UTF8 -O osm osm
A continuación, cree el postgis
y hstore
extensión para osm
base de datos.
psql -c "CREATE EXTENSION postgis;" -d osm psql -c "CREATE EXTENSION hstore;" -d osm
Establecer osm
como propietario de la mesa.
psql -c "ALTER TABLE spatial_ref_sys OWNER TO osm;" -d osm
Crea una base de datos llamada natural_earth
y al mismo tiempo hacer osm
como propietario de la base de datos.
createdb -E UTF8 -O osm natural_earth
A continuación, cree el postgis
y hstore
extensión para la natural_earth
base de datos.
psql -c "CREATE EXTENSION postgis;" -d natural_earth psql -c "CREATE EXTENSION hstore;" -d natural_earth
Salir de postgres
usuario.
exit
Paso 3:optimizar el rendimiento del servidor PostgreSQL
El proceso de importación puede llevar algún tiempo. Para acelerar este proceso, podemos ajustar algunas configuraciones del servidor PostgreSQL para mejorar el rendimiento. Edite el archivo de configuración principal de PostgreSQL.
sudo nano /etc/postgresql/12/main/postgresql.conf
Primero, debemos cambiar el valor de shared_buffer
. La configuración predeterminada es:
shared_buffers = 128MB
Esto es demasiado pequeño. La regla general es establecerlo en el 25% de su RAM total (excluyendo el espacio de intercambio). Por ejemplo, mi VPS tiene 60 G de RAM, así que lo configuré en:
shared_buffers = 15GB
Busque la siguiente línea.
#work_mem = 4MB #maintenance_work_mem = 64MB
Una vez más, el valor es demasiado pequeño. Yo uso la siguiente configuración.
work_mem = 1GB maintenance_work_mem = 8GB
Luego busque la siguiente línea.
#effective_cache_size = 4GB
Si tiene mucha RAM como yo, puede establecer un valor más alto para el tamaño_caché_efectivo como 20G.
effective_cache_size = 20GB
Guarde y cierre el archivo. Reinicie PostgreSQL para que los cambios surtan efecto.
sudo systemctl restart postgresql
De forma predeterminada, PostgreSQL intentaría usar páginas enormes en la RAM. Sin embargo, Linux por defecto no asigna páginas grandes. Compruebe el ID de proceso de PostgreSQL.
sudo head -1 /var/lib/postgresql/12/main/postmaster.pid
Salida de muestra:
7031
Luego verifique el valor de VmPeak de este ID de proceso.
grep ^VmPeak /proc/7031/status
Salida de muestra:
VmPeak: 16282784 kB
Este es el tamaño máximo de memoria que utilizará PostgreSQL. Ahora compruebe el tamaño de la página enorme en Linux.
cat /proc/meminfo | grep -i huge
Salida de muestra:
AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB
Podemos calcular cuántas páginas grandes necesitamos. Divida el valor de VmPeak por el tamaño de la página grande:16282784 kB / 2048 kB =7950. Edite el archivo /etc/sysctl.conf.
sudo nano /etc/sysctl.conf
Agregue la siguiente línea para asignar 7950 páginas grandes.
vm.nr_hugepages = 7950
Guarde y cierre el archivo. Luego aplique los cambios.
sudo sysctl -p
Si vuelves a consultar el meminfo,
cat /proc/meminfo | grep -i huge
Podemos ver que hay 7950 páginas enormes disponibles.
AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 7950 HugePages_Free: 7950 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
Reinicie PostgreSQL para usar páginas grandes.
sudo systemctl restart postgresql
Usar pantalla en servidores remotos
Dado que el proceso de importación puede llevar mucho tiempo y su computadora puede estar desconectada de Internet, se recomienda usar la utilidad de pantalla para mantener activa su sesión. Pantalla de instalación en el servidor Ubuntu 20.04:
sudo apt install screen
Luego pantalla de inicio:
screen
En el primer lanzamiento, verá un texto de introducción, simplemente presione Enter
para terminar. Entonces podrá ejecutar comandos como de costumbre.
Paso 4:Importe los datos del mapa a PostgreSQL
Para importar datos de mapas, usaremos imposm
que convierte los datos de OpenStreetMap en bases de datos PostgreSQL habilitadas para postGIS. Descárguelo de Github.
wget https://github.com/omniscale/imposm3/releases/download/v0.11.1/imposm-0.11.1-linux-x86-64.tar.gz
Extraiga el archivo.
tar xvf imposm-0.11.1-linux-x86-64.tar.gz
Muévalo a /opt/
directorio.
sudo mv imposm-0.11.1-linux-x86-64 /opt/imposm
Descargar tegola-osm
guiones.
git clone https://github.com/go-spatial/tegola-osm.git
Muévalo a /opt/
directorio.
sudo mv tegola-osm /opt/
A continuación, ejecute el siguiente comando para descargar los datos del mapa de todo el planeta (50G) en formato PBF (ProtoBufBinary).
wget -c http://planet.openstreetmap.org/pbf/planet-latest.osm.pbf
Tenga en cuenta que las velocidades de descarga de openstreetmap.org actualmente están restringidas a 2048 KB/s. Puede descargar el mapa de la planta desde otro espejo, como
wget -c https://download.bbbike.org/osm/planet/planet-latest.osm.pbf
Si desea un mapa de un país/estado/provincia/ciudad individual, vaya a http://download.geofabrik.de. Además, BBBike.org ofrece extractos de más de 200 ciudades y regiones de todo el mundo en diferentes formatos. Por ejemplo, descargue los datos del mapa de Gran Bretaña (1.1G) con el siguiente comando.
wget -c http://download.geofabrik.de/europe/great-britain-latest.osm.pbf
Ejecute el siguiente comando para importar datos de mapas.
/opt/imposm/imposm import -connection postgis://osm:osm_password@localhost/osm -mapping /opt/tegola-osm/imposm3.json -read great-britain-latest.osm.pbf -write
Ahora probablemente no necesite hacer otras cosas en su servidor. Ya que está utilizando Pantalla, puede presionar Ctrl+A , suelte esas teclas y luego presione D para desconectarse de la sesión de pantalla actual. Verá un mensaje como el siguiente.
[detached from 32113.pts-1.focal]
Esto me dice que el ID de sesión de pantalla anterior es 32113. Puede cerrar la sesión de SSH e incluso apagar su computadora. No te preocupes, el proceso de importación de OSM aún se está ejecutando. Cuando necesite regresar y verificar el progreso de la importación, acceda a SSH a su servidor y ejecute el siguiente comando para obtener el ID de sesión de pantalla anterior.
screen -ls
Salida de muestra:
There is a screen on: 32113.pts-1.focal (05/19/2020 03:45:29 PM) (Detached) 1 Socket in /run/screen/S-linuxbabe.
Luego puede volver a adjuntar a la sesión de pantalla anterior.
screen -r 32113
Y podrás continuar con tu trabajo.
Una vez que se hayan importado los datos del mapa, ejecute el siguiente comando para implementarlo en producción.
/opt/imposm/imposm import -connection postgis://osm:osm_password@localhost/osm -mapping /opt/tegola-osm/imposm3.json -deployproduction
Paso 5:Descarga Tegola
Vaya a la página de Tegola Github y descargue la versión de Linux. Puede usar el siguiente comando para descargarlo en la terminal.
wget https://github.com/go-spatial/tegola/releases/download/v0.13.0/tegola_linux_amd64.zip
Descomprímelo.
sudo apt install unzip unzip tegola_linux_amd64.zip
Mueva el binario a /usr/local/bin/
directorio.
sudo mv tegola /usr/local/bin/
Paso 6:Importe el conjunto de datos OSM Land y Natural Earth
Edite el /opt/tegola-osm/osm_land.sh
archivo.
sudo nano /opt/tegola-osm/osm_land.sh
Ingrese los detalles de su base de datos.
# database connection variables DB_NAME="osm" DB_HOST="localhost" DB_PORT="5432" DB_USER="osm" DB_PW="osm_password"
Guarde y cierre el archivo. Instalar gdal
.
sudo apt install gdal-bin
Generar relación land_polygons
en el gis
base de datos.
/opt/tegola-osm/osm_land.sh
A continuación, edite el /opt/tegola-osm/natural_earth.sh
archivo.
sudo nano /opt/tegola-osm/natural_earth.sh
Ingrese los detalles de su base de datos.
# database connection variables DB_NAME="natural_earth" DB_HOST="localhost" DB_PORT="5432" DB_USER="osm" DB_PW="osm_password"
Guarde y cierre el archivo. Luego genera tablas en el natural_earth
base de datos.
/opt/tegola-osm/natural_earth.sh
Ejecute postgis_helpers
secuencia de comandos SQL.
sudo -u postgres psql -d osm -a -f /opt/tegola-osm/postgis_helpers.sql
Ejecute el postgis_index.sql
script para agregar índices a las columnas de la tabla OSM para aumentar el rendimiento de las consultas.
sudo -u postgres psql -d osm -a -f /opt/tegola-osm/postgis_index.sql
Paso 7:Inicie Tegola
Edite el archivo de configuración.
sudo nano /opt/tegola-osm/tegola.toml
Configure el puerto de escucha, el tipo de caché y el proveedor de datos de la siguiente manera.
[webserver] port = ":8080" # Tegola offers three tile caching strategies: "file", "redis", and "s3" [cache] type = "file" basepath="/tmp/tegola-cache" # OpenStreetMap (OSM) [[providers]] name = "osm" type = "postgis" host = "127.0.0.1" port = "5432" database = "osm" user = "osm" password = "osm_password" # Natural Earth [[providers]] name = "ne" type = "postgis" host = "127.0.0.1" port = "5432" database = "natural_earth" user = "osm" password = "osm_password"
Busque la siguiente línea.
center = [-76.275329586789, 39.153492567373, 8.0] # optional center value. part of the TileJSON spec
Puede establecer una ubicación central personalizada (longitud y latitud) para su mapa y el nivel de zoom predeterminado. Tenga en cuenta que debe usar valores decimales y no puede usar valores enteros.
center = [0.8, 55.5, 5.0] # optional center value. part of the TileJSON spec
Guarde y cierre el archivo. Entonces empieza Tegola.
/usr/local/bin/tegola serve --config=/opt/tegola-osm/tegola.toml
Ahora Tegola está escuchando en el puerto 8080.
Paso 8:Cree un servicio Systemd para Tegola
Tegola corre en primer plano. Para ejecutarlo en segundo plano, podemos crear un servicio systemd, que también permite que Tegola se inicie automáticamente en el momento del arranque del sistema. Presiona Ctrl+C
para detener el proceso Tegola actual, luego cree el archivo tegola.service.
sudo nano /etc/systemd/system/tegola.service
Agregue las siguientes líneas a este archivo.
[Unit] Description=Tegola Vector Tile Server [Service] Type=simple User=www-data ExecStart=/usr/local/bin/tegola serve --config=/opt/tegola-osm/tegola.toml Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
Guarde y cierre el archivo. Hacer www-data
como propietario del /tmp/tegola-cache/
directorio.
sudo chown www-data:www-data /tmp/tegola-cache/ -R
Luego habilite e inicie este servicio.
sudo systemctl enable tegola --now
Compruebe su estado. Asegúrate de que se esté ejecutando.
systemctl status tegola
Luego, en la barra de direcciones de su navegador web, escriba
your-server-ip-address:8080
Debería ver el mapa de teselas vectoriales. ¡Felicitaciones! Acaba de crear con éxito su propio servidor de teselas vectoriales. Tenga en cuenta que las versiones anteriores de Firefox no pueden mostrar estos mosaicos vectoriales. Debe usar una biblioteca de terceros para mostrar mapas basados en mosaicos vectoriales, lo cual se explica al final de este tutorial.
Paso 9:Configuración del proxy inverso
Para acceder a Tegola usando un nombre de dominio, podemos configurar un proxy inverso para Tegola con Nginx o Apache. Esto también nos permitirá habilitar HTTPS con el certificado Let's Encrypt gratuito.
Nginx
Nginx es un servidor web y proxy inverso muy popular. Si prefiere usar Nginx, ejecute el siguiente comando para instalarlo.
sudo apt install nginx
A continuación, cree un archivo de bloqueo del servidor para Tegola.
sudo nano /etc/nginx/conf.d/tegola.conf
Agregue el siguiente contenido a este archivo. Reemplace tile.example.com
con su propio nombre de dominio. También debe crear un registro DNS A para este subdominio. Si no tiene un nombre de dominio real, le recomiendo ir a NameCheap para comprar uno. El precio es bajo y brindan protección de privacidad whois gratis de por vida.
server { listen 80; listen [::]:80; server_name tile.example.com; access_log /var/log/nginx/tegola.access; error_log /var/log/nginx/tegola.error; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Protocol $scheme; proxy_set_header X-Forwarded-Host $http_host; } }
Guarde y cierre este archivo. Luego pruebe la configuración de Nginx.
sudo nginx -t
Si la prueba es exitosa, vuelva a cargar Nginx para que el cambio surta efecto.
sudo systemctl reload nginx
Ahora puede acceder a Tegola a través de tile.example.com
.
Apache
Si prefiere Apache sobre Nginx, instale el servidor web Apache usando el siguiente comando.
sudo apt install apache2
Para usar Apache como proxy inverso, debemos habilitar el proxy
módulos y el módulo de cabecera.
sudo a2enmod proxy proxy_http headers
Luego cree un archivo de host virtual para Tegola.
sudo nano /etc/apache2/sites-available/tegola.conf
Coloque las siguientes configuraciones en el archivo. Reemplace tile.example.com
con su nombre de dominio real. No olvide crear un registro DNS A para este subdominio. Si no tiene un nombre de dominio real, le recomiendo ir a NameCheap para comprar uno. El precio es bajo y brindan protección de privacidad whois gratis de por vida.
<VirtualHost *:80> ServerName tile.example.com ErrorDocument 404 /404.html #HTTP proxy ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ ProxyPreserveHost On </VirtualHost>
Guarde y cierre el archivo. Luego habilite este servidor virtual.
sudo a2ensite tegola.conf
Reiniciar Apache
sudo systemctl restart apache2
Ahora puede acceder a Tegola usando el nombre de dominio tile.example.com
.
Paso 10:habilite HTTPS
Para cifrar el tráfico HTTP cuando visita el servidor de Tegola desde el exterior, podemos habilitar HTTPS instalando un certificado TLS gratuito emitido por Let's Encrypt. Ejecute el siguiente comando para instalar el cliente Let's Encrypt (certbot) en Ubuntu 20.04.
sudo apt install certbot
Si usa Nginx, también necesita instalar el complemento Certbot Nginx.
sudo apt install python3-certbot-nginx
A continuación, ejecute el siguiente comando para obtener e instalar el certificado TLS.
sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email [email protected] -d tile.example.com
Si usa Apache , entonces necesita instalar el complemento Certbot Apache.
sudo apt install python3-certbot-apache
A continuación, ejecute el siguiente comando para obtener e instalar el certificado TLS.
sudo certbot --apache --agree-tos --redirect --hsts --staple-ocsp --uir --email [email protected] -d tile.example.com
donde:
--nginx
:use el complemento nginx.--apache
:Utilice el complemento de Apache.--agree-tos
:Acepto los términos del servicio.--redirect
:Forzar HTTPS por redirección 301.--hsts
:agregue el encabezado Strict-Transport-Security a cada respuesta HTTP. Obligar al navegador a usar siempre TLS para el dominio. Protege contra la eliminación de SSL/TLS.--staple-ocsp
:activa el grapado OCSP. Se grapa una respuesta OCSP válida al certificado que ofrece el servidor durante TLS.--uir
:actualizar solicitudes inseguras.
Ahora se debe obtener el certificado e instalarlo automáticamente. Y puede acceder a Tegola a través de HTTPS:https://tile.example.com
.
Configurar un mapa de ejemplo
Debe usar una biblioteca de terceros para mostrar un mapa basado en mosaicos vectoriales. Uso OpenLayer como ejemplo. Crea un map.html
archivo en su servidor y coloque los siguientes códigos.
<!doctype html> <html lang="en"> <head> <link rel="stylesheet" href="https://openlayers.org/en/v5.3.0/css/ol.css" type="text/css"> <style> #map{height:1000px;width:100%;background-color:#1C79B5;} </style> <script src="https://openlayers.org/en/v5.3.0/build/ol.js" type="text/javascript"></script> <title>OpenLayers example</title> </head> <body> <div id="map" class="map"></div> <script type="text/javascript"> var defaultStyle = new ol.style.Style({ fill: new ol.style.Fill({ color: [234,231,221,1] }), stroke: new ol.style.Stroke({ color: [182,177,162,1], width: 1 }) }); var waterStyle = new ol.style.Style({ fill: new ol.style.Fill({ color: [28,121,181,1] }), stroke: new ol.style.Stroke({ color: [27,107,159,1], width: 1 }) }); var streetStyle = new ol.style.Style({ fill: new ol.style.Fill({ color: [111,44,173,1] }), stroke: new ol.style.Stroke({ color: [93,32,150,1], width: 1 }) }); function styleFunction(feature, resolution){ if (feature.get('type') == 'water' || feature.get('layer') == 'water_areas' || feature.get('layer') == 'water_lines'){ return [waterStyle]; } if (feature.get('layer') == 'transport_lines'){ return [streetStyle]; } if (feature.get('layer') == 'country_polygons' || feature.get('layer') == 'landuse_areas'){ return null; // return null for no style to be applied } return [defaultStyle]; } var map = new ol.Map({ target: 'map', layers: [ new ol.layer.VectorTile({ source: new ol.source.VectorTile({ format: new ol.format.MVT(), url:'https://tile.linuxbabe.com/maps/osm/{z}/{x}/{y}.pbf' }), style:styleFunction }) ], view: new ol.View({ center: ol.proj.fromLonLat([0.5,54.5]), //coordinates the map will center on initially zoom: 6 }) }); </script> </body> </html>
Guarde y cierre el archivo. Así es como se ve.
Conclusión
Espero que este artículo le haya ayudado a configurar Tegola Vector Tile Server en Ubuntu 20.04. Como siempre, si esta publicación le resultó útil, suscríbase a nuestro boletín informativo gratuito para obtener más consejos y trucos. Cuídate 🙂