Wir alle sind es gewohnt, die klassischen Basissubstrate im Internet zu betrachten, um die Siedlungen, Straßen und ihre Namen, Häuser mit ihrer Nummer zu sehen. Aber auch diese Eigenschaftsobjekte haben mehr als nur einen Namen oder eine Nummer. Für Gebäude ist dies eine Reihe von Stockwerken, für Straßen gibt es eine Reihe von Fahrspuren und für Städte eine Reihe von Einwohnern. Dies ist jedoch nur die Spitze des Eisbergs - OpenStreetMap ist so reich an einer Vielzahl von Geodaten, dass Sie einige davon einfach nie gesehen haben. Und ohne spezielle Renderings werden Sie nie sehen, es sei denn, Sie möchten die Daten dieser Zeile mit seltsamen Tags bearbeiten. Heute erstellen wir ein hochspezialisiertes Rendering für die Darstellung von Waldvierteln.

Schritt 1. Umfragen.
Sie können natürlich mit Ihrem Finger am Himmel erraten, wie sie bezeichnet werden könnten, aber es ist sicherer, zu Wiki-Osm zu gehen. Und dort finden wir folgendes: border = wood_compartment
Daher werden boundary=forest_compartment
durch Polygone mit dem Tag boundary=forest_compartment
. Es gibt zwar eine Klarstellung, dass es ursprünglich als boundary=forestry_compartment
, aber es war weniger gebildet. Und da die Anzahl der Verwendungen mit der alten Bezeichnung erheblich ist (laut taginfo etwa viertausendmal), werden wir sie nicht rabattieren.
Schritt 2. Daten.
Nehmen Sie die Daten von Geofabrik . Laden Sie eine Datei für ganz Russland herunter - russia-latest.osm.pbf
. Mit osmconvert
wir die Daten im o5m-Format für die anschließende Filterung.
osmconvert russia-latest.osm.pbf -o=russia-latest.o5m
Jetzt filtern wir nur die Daten, die wir mit osmfilter
benötigen
osmfilter russia-latest.o5m --keep="boundary=forest_compartment =forestry_compartment" -o=forest_compartment-local.o5m
Schritt 3. Vektorkacheln.
Eine kleine kurze Theorie. Der alte Ansatz besteht darin, einige Daten aus einer großen Datenbank anzufordern, ein Bild von ihnen zu erhalten und sie zu speichern, um sie dem Kunden in Zukunft zur Verfügung zu stellen. Fordern Sie in der neuen Datenbank aus einer großen Datenbank einige kleine Daten an und speichern Sie sie für die spätere Übertragung an den Client. Und lassen Sie den Kunden sie in ein Bild verwandeln. Profitieren Sie sozusagen vom Gesicht - wir haben die Last, das Bild zu rendern, auf die Schultern des Kunden übertragen. Von den Minuspunkten: Auf der Kaffeemaschine können Sie die Karte möglicherweise nicht sehen. Sie benötigen WebGL-Unterstützung.
Deshalb schlug Mapbox ein Format für Vektorkacheln und einen Container für diese in Form einer SQLite-Datenbank vor. Daher ist es jetzt keine Streuung von Dateien in Ordnern, sondern eine ordentlich einsame Datei. Eine Vektorkachel enthält logische Ebenen (Häuser, Straßen usw.), die aus Geometrie und Attributen bestehen.
Hier bereiten wir sie auf unsere Waldviertel vor. Ich werde das TileMaker- Tool verwenden. Es empfängt OSM-Daten im PDF-Format als Eingabe, daher müssen wir nach dem Filtern wieder in dieses Format konvertieren.
osmconvert forest_compartment-local.o5m -o=forest_compartment-local.pbf
Jetzt müssen wir TileMaker erklären, welche Ebenen und mit welchen Attributen wir gemäß der Dokumentation benötigen.
Schritt 4. Ebenen?
Und welche Schichten brauchen wir? Und es kommt darauf an, was wir zeigen. Das heißt, Zunächst müssen wir uns den visuellen Teil irgendwie vorstellen. Und wie kann dies aus den verfügbaren Daten erreicht werden? Aus den OSM-Daten haben wir ein Raster aus Polygonen und ihren Attributen. Die Attribute haben den Namen der Forstwirtschaft und die Viertelnummer.

Am einfachsten ist es, das Quartal anzuzeigen und mit Ihrer Nummer zu unterschreiben. Das heißt, Wir brauchen eine Polygonebene. In der Mitte des Polygons wird eine Inschrift mit ihrer Nummer angezeigt.
Und dann erscheint das erste Merkmal von Vektorkacheln. Wenn ein großes Quellpolygon in verschiedene Kacheln fällt, fallen nur seine Teile in die Kacheln. Und beim Rendern stellt sich heraus, dass es sich jeweils um zwei verschiedene Polygone handelt. Für sie befinden sich zwei Signaturen in der Mitte ihrer Hälften.

Daher wird für Vektorkacheln eine separate Ebene mit Inschriften erstellt, wenn noch alle erforderlichen Informationen zur Geometrie vorliegen.
Fazit: Wir benötigen zwei Ebenen, Polygon zum Füllen und Punkt zum Signieren. Erstellen Sie die Datei 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": [ ] } } } }
Geben Sie im Abschnitt Ebenen an, was wir benötigen
"layers": { "forest_compartment": { "minzoom": 11, "maxzoom": 11 }, "forest_compartment_label": { "minzoom": 11, "maxzoom": 11 } },
Die Namen der Ebenen werden angezeigt und in welchem Maßstab werden sie angezeigt.
"json": { "vector_layers": [ { "id": "forest_compartment", "description": "Compartment", "fields": {}}, { "id": "forest_compartment_label", "description": "Compartment", "fields": {"ref":"String"}} ] }
In den Metadaten teilen wir dem zukünftigen Visualizer mit, welche Attribute bei uns verfügbar sind. Für die Tag-Ebene haben wir die Viertelnummer in ref
Schritt 5. Datenverarbeitung.
Zu diesem Zweck wird ein Skript in der Sprache lua
verwendet, das entscheidet, welche Objekte aus den OSM-Daten wir benötigen, in welcher Ebene sie gesendet werden sollen und mit welchen Attributen.
Beginnen wir mit der Dateivorlage process.lua.
Was wir hier haben:
node_keys - Es gibt viele Punkte in den OSM-Daten. Wenn wir jeweils dieses Skript aufrufen, dauert die Verarbeitung sehr lange. Dies ist ein Filter, der uns sagt, an welchen wichtigen Punkten wir interessiert sind.
Funktion node_function (node) - Die Funktion wird an jedem Punkt aufgerufen, der für uns aus dem vorherigen Absatz interessant ist. Hier müssen wir entscheiden, was wir damit machen wollen.
function way_function (way) - eine Funktion, die in jeder Zeile und in Beziehungen zu den Multipolygon- und Grenztypen aufgerufen wird, weil Sie werden als Flächenobjekte betrachtet.
Wir beginnen Code zu schreiben. Zunächst geben wir an, welche Punkte wir benötigen:
node_keys = { "boundary" }
Jetzt schreiben wir die Funktion, um sie zu verarbeiten:
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
Was hier passiert: Wir lesen den Wert des boundary
durch den node:Find("")
. Wenn dies forest_compartment
, lesen Sie die Viertelnummer aus dem ref
Tag. Wenn es nicht leer ist, wird dieses Objekt über Layer("_", ___)
zu unserer Ebene mit Beschriftungen Layer("_", ___)
. Im Attribut der ref
Ebene speichern wir die Viertelnummer.
Fast so einfach für quadratische Blöcke:
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
Hier prüfen wir zusätzlich, ob die Leitung geschlossen ist, weil Es kommt vor, dass Tags einfach auf Segmenten vorhanden sind. Es ist erwähnenswert, dass die forest_compartment
Fläche ist (daher das zweite Argument für die Funktion Layer("", true))
, und wir nehmen den Platz für die Signatur als Zentrum der LayerAsCentroid
.
Es lohnt sich auch, auf das Attribut zu achten, das wir hinzufügen, obwohl wir es in der Konfiguration nicht angegeben nomerge
. Es ist erforderlich, um eine andere Funktion zu deaktivieren, diesmal bereits den TileMaker-Konverter (obwohl der Parameter zum Deaktivieren in der neuen Version angezeigt wurde).
Die Besonderheit ist, dass zur Optimierung, wenn sich viele Objekte mit denselben Attributen in einer Ebene befinden, der Konverter für sie die Geometrien zu einer kombiniert. Zum Beispiel haben wir eine Straße, die aus drei separaten Segmenten besteht, die als Ergebnis dreimal zum Rendern gesendet werden. Dies ist länger im Vergleich zu der Tatsache, dass wir ein Objekt an das Rendering senden würden, jedoch mit einer etwas komplexeren Geometrie (die alle vereint).
In unserem Fall würden alle benachbarten Viertel zu einem großen Polygon zusammengefasst, aber das brauchen wir nicht. Daher fügen wir die Objektnummer so hinzu, dass sie unterschiedlich und nicht kombiniert sind.
Jetzt ist es Zeit, mit dem Erstellen von Vektorkacheln zu beginnen.
tilemaker forest_compartment-local.pbf --output forest_compartment-local.mbtiles
Daher sollten wir die Datei forest_compartment-local.mbtiles
Schritt 6. Erstellen Sie einen Stil.
Wir erstellen ein Konto auf mapbox.com . Erstellen Sie in Mapbox Studio im Abschnitt Tileset ein neues Tileet, indem Sie unsere zuvor erstellte Datei in das Download-Fenster ziehen. Innerhalb einer Minute sollte es verarbeitet und der Liste hinzugefügt werden.
Jetzt gehen wir zum Abschnitt Stile und erstellen einen neuen basierend auf dem fertigen Licht, damit wir die Hauptelemente der Karte sehen können, wie Straßen, Siedlungen usw. Wir fahren nach Cheboksary, weil dort Waldblöcke gesehen wurden.
Wir gehen zu Level 11 der Skala (wir haben nur Kacheln für ihn erstellt) und klicken auf die Schaltfläche Ebene hinzufügen. Auf der Registerkarte Datenquelle finden wir unsere forest_compartment-local-XXXXX
wählen wir die Polygonebene aus. Es sollte rechts grün hervorgehoben sein.

Stellen Sie als Nächstes auf der Registerkarte Stil die Füllfarbe auf Grün und den Strich auf Braun ein.

Nun bleibt die Signatur hinzuzufügen. Fügen Sie eine neue Ebene hinzu. Nur dieses Mal wählen wir forest_compartment_label
in den Daten aus und wählen das forest_compartment_label
Die Zahlen sollten rechts forest_compartment_label
.

Geben Sie auf der Registerkarte Stil an, dass unser ref
Attribut angezeigt werden soll.

So ist es, klicken Sie auf die rechte Seite des Veröffentlichungsbildschirms und wir können den Link freigeben, damit andere unsere Kreation sehen können. ABER die Anzeige von Karten ist nicht kostenlos, wie auch anderswo, daher werde ich Ihnen meinen Link nicht geben, um nicht in den Habreffekt zu geraten.
PS: Vielleicht werde ich Ihnen in einem zusätzlichen Artikel erzählen, wie ich den Ort der Signatur mit dem Namen der Forstwirtschaft auf einer Gruppe von darin enthaltenen Blöcken erreicht habe.