Todos estamos acostumbrados a mirar los sustratos básicos clásicos en Internet, para ver los asentamientos, las carreteras y sus nombres, las casas con sus números. Pero incluso estos objetos de propiedad tienen más que solo un nombre o número. Para los edificios, se trata de una serie de pisos, para las carreteras hay varios carriles y para las ciudades, una cantidad de habitantes. Pero esto es solo la punta del iceberg: OpenStreetMap es tan rico en una variedad de datos espaciales que simplemente nunca viste algunos de ellos. Y sin representaciones especializadas que nunca verá, a menos que esté interesado en editar qué datos es esta línea con etiquetas extrañas. Hoy haremos una representación tan ultra especializada para mostrar vecindarios forestales.

Paso 1. Encuestas.
Por supuesto, puedes adivinar con el dedo en el cielo cómo se pueden denotar, pero es más seguro ir a wiki-osm. Y allí podemos encontrar lo siguiente: boundary = forest_compartment
Por lo tanto, los bloques forestales están designados por polígonos con la etiqueta boundary=forest_compartment
. Es cierto que hay una aclaración de que inicialmente se designó como boundary=forestry_compartment
, pero estaba menos alfabetizado. Y dado que el número de usos con la designación anterior es significativo (según taginfo unas 4 mil veces), no lo descontaremos.
Paso 2. Datos.
Toma los datos de Geofabrik . Descargue un archivo para toda Rusia: russia-latest.osm.pbf
. Usando osmconvert
obtenemos los datos en formato o5m para su posterior filtrado.
osmconvert russia-latest.osm.pbf -o=russia-latest.o5m
Ahora filtramos solo los datos que necesitamos con osmfilter
osmfilter russia-latest.o5m --keep="boundary=forest_compartment =forestry_compartment" -o=forest_compartment-local.o5m
Paso 3. Azulejos vectoriales.
Una pequeña teoría breve. El enfoque anterior es solicitar algunos datos de una gran base de datos, obtener una imagen de ellos, guardarla para dársela al cliente en el futuro. En la nueva, desde una gran base de datos, solicite un poco de datos y guárdelos para su posterior transmisión al cliente. Y deja que el cliente los convierta en una imagen. Beneficio en la cara: transferimos la carga de la representación de la imagen a los hombros del cliente. De las desventajas: en la cafetera es posible que no pueda ver el mapa, necesita soporte WebGL.
Y entonces Mapbox propuso un formato para mosaicos vectoriales y un contenedor para ellos en forma de una base de datos sqlite. Por lo tanto, ahora no es una dispersión de archivos en carpetas, sino un archivo limpio y solitario. Un mosaico vectorial contiene capas lógicas (casas, carreteras, etc.) que consisten en geometría y atributos.
Aquí los prepararemos para nuestros barrios forestales. Usaré la herramienta TileMaker . Recibe datos de OSM en formato pbf como entrada, por lo que después de filtrar necesitamos volver a convertir a este formato.
osmconvert forest_compartment-local.o5m -o=forest_compartment-local.pbf
Ahora debemos explicarle a TileMaker qué capas y con qué atributos necesitamos, de acuerdo con la documentación .
Paso 4. Capas?
¿Y qué capas necesitamos? Y depende de lo que mostramos. Es decir En primer lugar, debemos imaginar de alguna manera la parte visual. Y cómo se puede lograr a partir de los datos disponibles. A partir de los datos de OSM, tenemos una cuadrícula de polígonos y sus atributos. Los atributos tienen el nombre de la silvicultura y el número de trimestre.

A partir de esto, la forma más fácil es mostrar el trimestre y firmarlo con su número. Es decir necesitamos una capa de polígono, en el centro del polígono mostraremos una inscripción con su número.
Y luego aparece la primera característica de los mosaicos vectoriales. Cuando un gran polígono fuente cae en diferentes mosaicos, solo sus partes caen en los mosaicos. Y cuando se renderiza resultan ser dos polígonos diferentes, respectivamente, para ellos habrá dos firmas en el centro de sus mitades.

Por lo tanto, para los mosaicos vectoriales, se prepara una capa separada con inscripciones, cuando todavía hay toda la información necesaria sobre la geometría.
En pocas palabras: necesitamos dos capas, polígono para relleno y punto para firma. Cree el archivo config.json
.
{ "layers": { }, "settings": { "minzoom": 11, "maxzoom": 11, "basezoom": 14, "include_ids": false, "author": "freeExec", "name": "Forest Compartment RUS", "license": "ODbL 1.0", "version": "0.1", "description": "Forest compartment from OpenStreetMap", "compress": "gzip", "metadata": { "attribution": "<a href=\"http://www.openstreetmap.org/copyright/\" target=\"_blank\">© OpenStreetMap</a>", "json": { "vector_layers": [ ] } } } }
En la sección de capas, especifique lo que necesitamos
"layers": { "forest_compartment": { "minzoom": 11, "maxzoom": 11 }, "forest_compartment_label": { "minzoom": 11, "maxzoom": 11 } },
Se indican los nombres de las capas y a qué escala los mostraremos.
"json": { "vector_layers": [ { "id": "forest_compartment", "description": "Compartment", "fields": {}}, { "id": "forest_compartment_label", "description": "Compartment", "fields": {"ref":"String"}} ] }
En los metadatos, le decimos al futuro visualizador qué atributos están disponibles con nosotros. Para la capa de etiqueta, tendremos el número de cuarto en la ref
.
Paso 5. Procesamiento de datos.
Para este propósito, se utiliza un script en el lenguaje lua
, que decidirá qué objetos de los datos OSM necesitamos, en qué capa enviarlos y con qué atributos.
Comencemos con la plantilla de archivo process.lua
.
Lo que tenemos aquí:
node_keys: hay muchos puntos en los datos de OSM; si cada uno de nosotros introduce este script, el procesamiento llevará mucho tiempo. Este es un filtro que nos dice qué puntos clave nos interesan.
function node_function (node): se llamará a la función en cada punto que nos interese del párrafo anterior. Aquí debemos decidir qué hacer con él.
function way_function (way): una función que se invocará en cualquier línea y en las relaciones con los tipos de límite y multipolígono, porque se consideran objetos areales.
Comenzamos a escribir código. En primer lugar, indicamos qué puntos necesitamos:
node_keys = { "boundary" }
Ahora escribimos la función para procesarlos:
function node_function(node) local boundary = node:Find("boundary") if boundary == "forestry_compartment" or boundary == "forest_compartment" then local ref = node:Find("ref") if ref ~= "" then node:Layer("forest_compartment_label", false) node:Attribute("ref", ref) end end end
Lo que sucede aquí: leemos el valor de la clave de boundary
través del node:Find("")
. Si esto es forest_compartment
, entonces lea el número de trimestre de la etiqueta de ref
. Si no está vacío, este objeto se agrega a nuestra capa con etiquetas, a través de Layer("_", ___)
. En el atributo de la capa de ref
guardamos el número de cuarto.
Casi tan simple para bloques cuadrados:
function way_function(way) local boundary = way:Find("boundary") if way:IsClosed() and ( boundary == "forestry_compartment" or boundary == "forest_compartment" ) then way:Layer("forest_compartment", true) way:AttributeNumeric("nomerge", way:Id()) local ref = way:Find("ref") if ref ~= "" then way:LayerAsCentroid("forest_compartment_label", false) way:Attribute("ref", ref) end end end
Aquí también verificamos que la línea esté cerrada, porque sucede que las etiquetas están presentes simplemente en segmentos. Vale la pena señalar que la capa forest_compartment
área (por lo tanto, el segundo argumento de la función Layer("", true))
, y tomamos el lugar para la firma como el centro de la LayerAsCentroid
.
También vale la pena prestar atención al atributo que estamos agregando, aunque no lo especificamos en el config - nomerge
. Es necesario para derrotar a otra característica, esta vez ya el convertidor TileMaker (aunque el parámetro para deshabilitarlo apareció en la nueva versión).
La peculiaridad es que para la optimización, cuando hay muchos objetos con los mismos atributos en una capa, el convertidor para ellos combina las geometrías en una. Por ejemplo, tenemos una calle que consta de tres segmentos separados, que como resultado se enviarán tres veces para renderizar. Esto es más largo, en comparación con el hecho de que enviaríamos un objeto al renderizado, pero con una geometría un poco más compleja (uniéndolos a todos).
En nuestro caso, todos los cuartos adyacentes se unirían en un gran polígono, pero no necesitamos esto. Por lo tanto, agregamos el número de objeto para que sean diferentes y no combinados.
Ahora es el momento de comenzar el proceso de creación de mosaicos vectoriales.
tilemaker forest_compartment-local.pbf --output forest_compartment-local.mbtiles
Como resultado, deberíamos tener el archivo forest_compartment-local.mbtiles
Paso 6. Crea un estilo.
Creamos una cuenta en mapbox.com . En Mapbox Studio, en la sección Conjunto de fichas, cree un nuevo conjunto de fichas arrastrando nuestro archivo creado anteriormente a la ventana de descarga. En un minuto, debe procesarse y agregarse a la lista.
Ahora vamos a la sección Estilos y creamos uno nuevo basado en la Luz terminada, para que podamos ver los elementos principales del mapa, como carreteras, asentamientos, etc. Partimos hacia Cheboksary porque se vieron bloques forestales.
Bajamos al nivel 11 de la escala (solo creamos mosaicos para él) y hacemos clic en el botón Agregar capa. En la pestaña de fuente de datos, encontramos nuestra fuente de datos forest_compartment-local-XXXXX
, en ella seleccionamos la capa de polígono. Debe resaltarse en verde a la derecha.

A continuación, en la pestaña de estilo, configure el color de relleno en verde y el trazo en marrón.

Ahora queda por agregar la firma. Agregue una nueva capa, solo que esta vez seleccionamos forest_compartment_label
en los datos y seleccionamos el symbol
tipo, los números deben aparecer a la derecha.

En la pestaña de estilo, especifique que necesitamos mostrar nuestro atributo ref
.

Así es, haga clic en el lado derecho de la pantalla de publicación y podemos compartir el enlace para que otros puedan ver nuestra creación. PERO la visualización de las tarjetas no es gratuita, como en otros lugares, por lo que no le daré mi enlace, para no caer en el efecto habr.
PD: Quizás en un artículo adicional les cuente cómo logré la ubicación de la firma con el nombre de la silvicultura en un grupo de bloques incluidos en ella.