[PYTHON] Obtenez toutes les tuiles XYZ qui contiennent une géométrie particulière

Résumé, résumé

Les données SIG sont grossièrement divisées en rasters (images) et vecteurs (points, lignes, polygones). Celles-ci sont souvent de taille énorme et le concept de tuiles XYZ existe pour une livraison efficace des données. Je vais omettre une explication détaillée du concept de tuiles XYZ, mais c'est un mécanisme qui divise d'énormes données et ne fournit que les parties nécessaires. Puisqu'il s'agit d'un standard, le globe entier à l'exception d'une partie des régions polaires est toujours divisé dans la même tuile quelle que soit la structure ou l'application. "Où appartient cette fonctionnalité aux tuiles XYZ?" "Je veux une liste des tuiles XYZ qui couvrent l'archipel japonais." J'ai eu récemment un besoin, donc le module Node.js et Python Chaque modèle du module est expliqué dans cet article. Les tuiles XYZ divisent la terre larguée sur une surface plane selon certaines règles, il est donc possible de calculer en fonction des paramètres (Référence: [Qiita --Summary of map tile calcul](https: // qiita) .com / MALORGIS / items / 1a9114dd090e5b891bf7)).

Exemple de sujet de données

Le thème est GeoJSON, qui dissout les polygones d'Hokkaido. Selon National Land Research Institute-Tile Coordinate Confirmation Page, les tuiles comprenant Hokkaido sont comme indiqué dans l'image ci-dessous. (Niveau de zoom 7 à titre d'exemple). Listez visuellement les tuiles pour vérification. スクリーンショット 2020-04-10 21.57.24.png

Toutes les tuiles qui incluent Hokkaido au niveau de zoom 7
[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]

Environnement d'exécution d'envs

JavaScript Node.js module / tile-cover

GitHub - Mapbox / tile-cover License:MIT

Installer Installer

npm install @mapbox/tile-cover

Utilisation Comment utiliser

Il s'agit d'un exemple qui lit un fichier GeoJSON local et obtient l'index de toutes les tuiles qui contiennent la fonctionnalité. Comme mentionné ci-dessus, les polygones d'Hokkaido sont traités comme une seule entité par dissolution (CRS est EPSG: 4326 car la couverture de tuiles est calculée par latitude et longitude).

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)

Exécutez ce script sur la console et affichez la liste des vignettes.

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 ]
]

Les 9 photos ont été répertoriées correctement.

Référence des astuces

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

Installer Installer

pip install tiletanic

Utilisation Comment utiliser

Comme pour l'édition Node.js, le thème est dissous Hokkaido, mais comme tiletanic utilise les coordonnées de Web Mercator au lieu de la latitude et de la longitude, réglez CRS sur EPSG: 3857 (il est également possible de convertir CRS en interne). Cependant, cela prend du temps, j'ai donc converti les données elles-mêmes avec QGIS à l'avance).

tileindex.py


import json

import shapely
import tiletanic

if __name__ == "__main__":
    zoomlevel = 7

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

    #Le nombre de fonctionnalités est de 1 en raison de la dissolution
    feature = geojson_dict['features'][0]['geometry']
    feature_shape = shapely.geometry.shape(feature)

    #Initialisation du schéma de tuiles
    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)

Exécuter en Python

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]]

L'ordre de sortie est différent de la couverture de tuiles node.js, mais l'index de 9 tuiles a été généré correctement.

Référence des astuces

Exemples de codes Exemple de code

GitHub - Kanahiro / tileindex-sample Tout le code, y compris le fichier GeoJSON, se trouve dans le référentiel ci-dessus.

Recommended Posts

Obtenez toutes les tuiles XYZ qui contiennent une géométrie particulière
Dans Blender, un script qui joint simplement tous les objets directement sous un groupe particulier