[PYTHON] Holen Sie sich alle XYZ-Kacheln, die eine bestimmte Geometrie enthalten

Abstrakte Zusammenfassung

GIS-Daten sind grob in Raster (Bilder) und Vektoren (Punkte, Linien, Polygone) unterteilt. Diese sind oft sehr groß und das Konzept der XYZ-Kacheln existiert für eine effiziente Datenlieferung. Ich werde eine detaillierte Erklärung des Konzepts von XYZ-Kacheln weglassen, aber es ist ein Mechanismus, der große Datenmengen aufteilt und nur die erforderlichen Teile liefert. Da es sich um einen Standard handelt, ist der gesamte Globus mit Ausnahme einiger Polarregionen unabhängig von Rahmen oder Anwendung immer in dieselben Kacheln unterteilt. „Wo gehört diese Funktion zu XYZ-Kacheln?“ „Ich möchte eine Liste von XYZ-Kacheln, die den japanischen Archipel abdecken.“ Ich hatte kürzlich einen Bedarf, also das Node.js-Modul und Python Jedes Muster des Moduls wird in diesem Artikel erläutert. Die XYZ-Kacheln teilen die auf eine ebene Fläche fallende Erde nach bestimmten Regeln auf, sodass eine Berechnung anhand der Parameter möglich ist (Referenz: [Qiita - Zusammenfassung der Berechnung der Kartenkacheln](https: // qiita) .com / MALORGIS / items / 1a9114dd090e5b891bf7)).

Beispiel betroffene Person

Das Thema ist GeoJSON, das die Polygone von Hokkaido auflöst. Laut Bestätigungsseite für die Koordinaten des Nationalen Landforschungsinstituts - Kacheln sind die Kacheln einschließlich Hokkaido wie in der Abbildung unten dargestellt. (Zoomstufe 7 als Beispiel). Listen Sie die Kacheln zur Überprüfung visuell auf. スクリーンショット 2020-04-10 21.57.24.png

Alle Kacheln, die Hokkaido in Zoomstufe 7 enthalten
[x, y, z]
[114, 45, 7]
[116, 45, 7]
[113, 46, 7]
[114, 46, 7]
[115, 46, 7]
[116, 46, 7]
[113, 47, 7]
[114, 47, 7]
[115, 47, 7]

Envs Ausführungsumgebung

JavaScript Node.js module / tile-cover

GitHub - Mapbox / tile-cover License:MIT

Installieren Installieren

npm install @mapbox/tile-cover

Verwendung Wie zu verwenden

Dies ist ein Beispiel, das eine lokale GeoJSON-Datei liest und den Index aller Kacheln abruft, die die Funktion enthalten. Wie oben erwähnt, wird das Polygon von Hokkaido durch Auflösen als ein Merkmal behandelt (CRS ist EPSG: 4326, da die Fliesenbedeckung nach Breite und Länge berechnet wird).

tileindex.js


//Library Import
var fs = require('fs')
var cover = require('@mapbox/tile-cover');

//Load local GeoJSON file
var geojson_str = fs.readFileSync('./dissolved_hokkaido.geojson')
var geojson_obj = JSON.parse(geojson_str);

//use tile-cover
var limits = {
    min_zoom: 7,
    max_zoom: 7
};
var tile_index = []
tile_index = cover.tiles(geojson_obj.features[0].geometry, limits)

console.log(tile_index)

Führen Sie dieses Skript auf der Konsole aus und geben Sie die Kachelliste aus.

node tileindex.js
[
  [ 114, 45, 7 ],
  [ 116, 45, 7 ],
  [ 113, 46, 7 ],
  [ 114, 46, 7 ],
  [ 115, 46, 7 ],
  [ 116, 46, 7 ],
  [ 113, 47, 7 ],
  [ 114, 47, 7 ],
  [ 115, 47, 7 ]
]

Alle 9 Blätter wurden ordnungsgemäß aufgelistet.

Tipps Referenz

Python module / tiletanic GitHub - DigitalGlobe / tiletanic License:MIT

Installieren Installieren

pip install tiletanic

Verwendung Wie zu verwenden

Wie bei der Node.js-Ausgabe ist das Thema Hokkaido aufgelöst. Da Tiletanic jedoch die Koordinaten von Web Mercator anstelle von Längen- und Breitengraden verwendet, setzen Sie CRS auf EPSG: 3857 (CRS kann auch intern konvertiert werden). Da es jedoch einige Zeit dauert, habe ich die Daten selbst im Voraus mit QGIS konvertiert.

tileindex.py


import json

import shapely
import tiletanic

if __name__ == "__main__":
    zoomlevel = 7

    #Geojson lesen
    geojson_dict = {}
    with open('./dissolved_hokkaido_3857.geojson', 'r') as f:
        geojson_dict = json.load(f)

    #Die Anzahl der Features beträgt 1, da sie sich auflösen
    feature = geojson_dict['features'][0]['geometry']
    feature_shape = shapely.geometry.shape(feature)

    #Initialisierung des Kachelschemas
    tiler = tiletanic.tileschemes.WebMercator()

    covering_tiles_itr = tiletanic.tilecover.cover_geometry(tiler, feature_shape, zoomlevel)
    covering_tiles = []
    for tile in covering_tiles_itr:
        tile_xyz = [tile[0], tile[1], tile[2]]
        covering_tiles.append(tile_xyz)

    print(covering_tiles)

In Python ausführen

python tileindex.py
[[114, 45, 7], [113, 46, 7], [113, 47, 7], [114, 46, 7], [115, 46, 7], [114, 47, 7], [115, 47, 7], [116, 45, 7], [116, 46, 7]]

Die Ausgabereihenfolge unterscheidet sich von der Kachelabdeckung von node.js, aber der Index von 9 Kacheln wurde ordnungsgemäß ausgegeben.

Tipps Referenz

Beispielcodes Beispielcode

GitHub - Kanahiro / tileindex-sample Der gesamte Code, einschließlich der GeoJSON-Datei, befindet sich im obigen Repository.

Recommended Posts

Holen Sie sich alle XYZ-Kacheln, die eine bestimmte Geometrie enthalten
In Blender ein Skript, das nur alle Objekte direkt unter einer bestimmten Gruppe verbindet