OpenStreetMap Part Medium: Visualisation de données cachées

Nous sommes tous habituĂ©s, en regardant les substrats de base classiques sur Internet, Ă  voir les colonies, les routes et leurs noms, les maisons avec leur nombre. Mais mĂȘme ces objets de propriĂ©tĂ© ont plus qu'un nom ou un numĂ©ro. Pour les bĂątiments, il s'agit d'un certain nombre d'Ă©tages, pour les routes il y a un certain nombre de voies et pour les villes, d'un certain nombre d'habitants. Mais ce n'est que la pointe de l'iceberg - OpenStreetMap est si riche en une variĂ©tĂ© de donnĂ©es spatiales que vous n'en avez tout simplement jamais vu. Et sans rendus spĂ©cialisĂ©s, vous ne verrez jamais, sauf si, lors de la modification des donnĂ©es, vous ĂȘtes intĂ©ressĂ© par le type de ligne avec des balises Ă©tranges. Aujourd'hui, nous allons crĂ©er un rendu ultra-spĂ©cialisĂ© pour montrer les quartiers forestiers.


Quartiers forestiers


Étape 1. EnquĂȘtes.
Vous pouvez bien sĂ»r deviner avec votre doigt dans le ciel comment ils pourraient ĂȘtre indiquĂ©s, mais il est plus sĂ»r d’aller sur wiki-osm. Et lĂ , nous pouvons trouver ce qui suit: border = forest_compartment


Par conséquent, les blocs forestiers sont désignés par des polygones avec la balise boundary=forest_compartment . Certes, il est précisé qu'au départ, il était désigné comme boundary=forestry_compartment , mais il était moins alphabétisé. Et comme le nombre d'utilisations avec l'ancienne désignation est important (selon taginfo environ 4 000 fois), nous ne l'escompterons pas.


Étape 2. DonnĂ©es.
Prenez les données de Geofabrik . Téléchargez un fichier pour toute la Russie - russia-latest.osm.pbf . En utilisant osmconvert nous obtenons les données au format o5m pour un filtrage ultérieur.


 osmconvert russia-latest.osm.pbf -o=russia-latest.o5m 

Maintenant, nous osmfilter uniquement les données dont nous avons besoin avec osmfilter


 osmfilter russia-latest.o5m --keep="boundary=forest_compartment =forestry_compartment" -o=forest_compartment-local.o5m 

Étape 3. Tuiles vectorielles.
Une petite thĂ©orie brĂšve. L'ancienne approche consiste Ă  demander des donnĂ©es Ă  une grande base de donnĂ©es, Ă  en obtenir une image, Ă  la sauvegarder afin de la donner au client Ă  l'avenir. Dans la nouvelle, Ă  partir d'une grande base de donnĂ©es, demandez un peu de donnĂ©es et enregistrez-les pour une transmission ultĂ©rieure au client. Et laissez le client les transformer en image. Profit pour ainsi dire sur le visage - nous avons transfĂ©rĂ© la charge du rendu de l'image sur les Ă©paules du client. Parmi les inconvĂ©nients - sur la cafetiĂšre, vous ne pourrez peut-ĂȘtre pas voir la carte, vous avez besoin du support WebGL.


Mapbox a donc proposé un format pour les tuiles vectorielles et un conteneur pour celles-ci sous la forme d'une base de données sqlite. Par conséquent, maintenant ce n'est pas une dispersion de fichiers dans des dossiers, mais un fichier solitaire soigné. Une tuile vectorielle contient des couches logiques (maisons, routes, etc.) constituées de géométrie et d'attributs.


Ici, nous les préparerons pour nos quartiers forestiers. J'utiliserai l'outil TileMaker . Il reçoit les données OSM au format pbf en entrée, donc aprÚs le filtrage, nous devons reconvertir ce format.


 osmconvert forest_compartment-local.o5m -o=forest_compartment-local.pbf 

Nous devons maintenant expliquer Ă  TileMaker quelles couches et avec quels attributs nous avons besoin, selon la documentation .


Étape 4. Calques?
Et de quelles couches avons-nous besoin? Et cela dĂ©pend de ce que nous montrons. C'est-Ă -dire Tout d'abord, nous devons en quelque sorte imaginer la partie visuelle. Et comment y parvenir Ă  partir des donnĂ©es disponibles. À partir des donnĂ©es OSM, nous avons une grille de polygones et leurs attributs. Les attributs ont le nom de la forĂȘt et le numĂ©ro du trimestre.


Données OSM brutes


À partir de lĂ , le moyen le plus simple consiste Ă  afficher le trimestre et Ă  le signer avec votre numĂ©ro. C'est-Ă -dire nous avons besoin d'une couche polygonale, au centre du polygone nous afficherons une inscription avec son numĂ©ro.
Et puis la premiÚre fonctionnalité des tuiles vectorielles apparaßt. Lorsqu'un grand polygone source tombe dans différentes tuiles, seules ses parties tombent dans les tuiles. Et lors du rendu, il s'avÚre qu'il s'agit de deux polygones différents, respectivement, pour eux, il y aura deux signatures au centre de leurs moitiés.



Par conséquent, pour les tuiles vectorielles, une couche séparée avec des inscriptions est préparée, quand il y a encore toutes les informations nécessaires sur la géométrie.


Conclusion: nous avons besoin de deux couches, un polygone pour le remplissage et un point pour la signature. Créez le fichier 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\">&copy;  OpenStreetMap</a>", "json": { "vector_layers": [ ] } } } } 

Dans la section des calques, spécifiez ce dont nous avons besoin


  "layers": { "forest_compartment": { "minzoom": 11, "maxzoom": 11 }, "forest_compartment_label": { "minzoom": 11, "maxzoom": 11 } }, 

Les noms des couches sont indiqués et à quelle échelle nous allons les afficher.


  "json": { "vector_layers": [ { "id": "forest_compartment", "description": "Compartment", "fields": {}}, { "id": "forest_compartment_label", "description": "Compartment", "fields": {"ref":"String"}} ] } 

Dans les métadonnées, nous indiquons au futur visualiseur quels attributs sont disponibles avec nous. Pour la couche tag, nous aurons le numéro de trimestre en ref .


Étape 5. Traitement des donnĂ©es.
À cet effet, un script en langage lua est utilisĂ©, qui dĂ©cidera quels objets des donnĂ©es OSM nous avons besoin, dans quelle couche les envoyer et avec quels attributs.


Commençons par le modÚle de fichier process.lua .


 -- Nodes will only be processed if one of these keys is present node_keys = { } -- Initialize Lua logic function init_function() end -- Finalize Lua logic() function exit_function() end -- Assign nodes to a layer, and set attributes, based on OSM tags function node_function(node) end -- Similarly for ways function way_function(way) end 

Ce que nous avons ici:


node_keys - il y a beaucoup de points dans les données OSM, si nous poussons chacun ce script, alors le traitement prendra trÚs longtemps. Il s'agit d'un filtre qui nous indique les points clés qui nous intéressent.


function node_function (node) - la fonction sera appelée sur chaque point intéressant pour nous à partir du paragraphe précédent. Ici, nous devons décider quoi en faire.


function way_function (way) - une fonction qui sera appelée sur n'importe quelle ligne et sur les relations avec les types multipolygone et limite, car ils sont considérés comme des objets surfaciques.


Nous commençons à écrire du code. Tout d'abord, nous indiquons de quels points nous avons besoin:


 node_keys = { "boundary" } 

Maintenant, nous écrivons la fonction pour les traiter:


 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 

Que se passe-t-il ici: nous lisons la valeur de la clé de boundary via le node:Find("") . S'il s'agit de forest_compartment , lisez le numéro du trimestre dans la balise ref . S'il n'est pas vide, cet objet est ajouté à notre calque avec des étiquettes, via Layer("_", ___) . Dans l'attribut de la couche ref , nous enregistrons le numéro de trimestre.
Presque aussi simple pour les blocs carrés:


 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 

Ici, nous vérifions en outre que la ligne est fermée, car il arrive que des balises soient présentes simplement sur des segments. Il convient de noter que la couche forest_compartment zone (par conséquent, le deuxiÚme argument de la fonction Layer("", true)) , et nous prenons la place de la signature comme centre de la LayerAsCentroid .


Il convient Ă©galement de prĂȘter attention Ă  l'attribut que nous ajoutons, bien que nous ne l'ayons pas spĂ©cifiĂ© dans la configuration. Il est nĂ©cessaire de vaincre une autre fonctionnalitĂ©, cette fois dĂ©jĂ  le convertisseur TileMaker (bien que le paramĂštre pour le dĂ©sactiver soit apparu dans la nouvelle version).


La particularitĂ© est que pour l'optimisation, lorsqu'il y a plusieurs objets avec les mĂȘmes attributs dans une couche, le convertisseur pour eux combine les gĂ©omĂ©tries en une seule. Par exemple, nous avons une rue composĂ©e de trois segments distincts, qui seront par consĂ©quent envoyĂ©s trois fois pour ĂȘtre rendus. C'est plus long, par rapport au fait que nous enverrions un objet au rendu, mais avec une gĂ©omĂ©trie lĂ©gĂšrement plus complexe (en les unissant tous).


Dans notre cas, tous les quartiers adjacents seraient réunis en un seul grand polygone, mais nous n'en avons pas besoin. Par conséquent, nous ajoutons le numéro d'objet afin qu'ils soient différents et non combinés.


Il est maintenant temps de commencer le processus de création de tuiles vectorielles.


 tilemaker forest_compartment-local.pbf --output forest_compartment-local.mbtiles 

Par conséquent, nous devrions avoir le fichier forest_compartment-local.mbtiles


Étape 6. CrĂ©ez un style.
Nous crĂ©ons un compte sur mapbox.com . Dans Mapbox Studio, dans la section Ensemble de tuiles, crĂ©ez un nouveau ensemble de tuiles en faisant glisser notre fichier créé prĂ©cĂ©demment dans la fenĂȘtre de tĂ©lĂ©chargement. En une minute, il doit ĂȘtre traitĂ© et ajoutĂ© Ă  la liste.


Maintenant, nous allons dans la section Styles et en créons un nouveau basé sur la lumiÚre finie, afin que nous puissions voir les principaux éléments de la carte, tels que les routes, les colonies, etc. Nous partons pour Cheboksary car on a vu des blocs forestiers.


Nous descendons au niveau 11 de l'Ă©chelle (nous n'avons créé que des tuiles pour lui) et cliquez sur le bouton Ajouter une couche. Dans l'onglet source de donnĂ©es, nous trouvons notre source de donnĂ©es forest_compartment-local-XXXXX , nous y sĂ©lectionnons la couche de polygones. Il doit ĂȘtre surlignĂ© en vert Ă  droite.


Ajout de calque


Ensuite, dans l'onglet Style, définissez la couleur de remplissage sur vert et le trait sur brun.


Réglage des couleurs


Reste maintenant à ajouter la signature. Ajoutez une nouvelle couche, mais cette fois, nous sélectionnons forest_compartment_label dans les données et sélectionnons le symbol type, les chiffres devraient apparaßtre à droite.


Ajoutez un calque d'étiquette.


Dans l'onglet style, spécifiez que nous devons afficher notre attribut ref .


Attribut pour la signature


C'est comme ça, cliquez sur le cÎté droit de l'écran de publication et nous pouvons partager le lien afin que d'autres puissent regarder notre création. MAIS l'affichage des cartes n'est pas gratuit, comme ailleurs, donc je ne vous donnerai pas mon lien, pour ne pas tomber dans l'effet habr.


PS: Peut-ĂȘtre que dans un article supplĂ©mentaire, je vous dirai comment j'ai rĂ©alisĂ© l'emplacement de la signature avec le nom de la forĂȘt sur un groupe de blocs inclus.

Source: https://habr.com/ru/post/fr441296/


All Articles