Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ajout de l'outil TMSIZER #18

Merged
merged 4 commits into from
Apr 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[run]
include =
*/src/*
omit =
*/__init__.py
command_line =
pytest
52 changes: 50 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,16 +114,64 @@ Possibilités de contenu du fichier JSON (généré à partir du schéma JSON av

MAKE-LAYER est un outil générant un descripteur de couche compatible avec le serveur à partir des pyramides de données à utiliser

Utilisation : `make-layer [-h] --pyramids storage://path/to/pyr.json[>BOTTOM>TOP] [storage://path/to/pyr.json[>BOTTOM>TOP] ...] --name my data [--styles normal [normal ...]] [--title my data]`
Utilisation : `make-layer [-h] [--version] --pyramids storage://path/to/pyr.json[>BOTTOM>TOP] [storage://path/to/pyr.json[>BOTTOM>TOP] ...] --name my_data [--styles normal [normal ...]] [--title my data] [--abstract my data description] [--resampling {nn,linear,bicubic,lanczos_2,lanczos_3,lanczos_4}] [--directory s3://layers_bucket]`

* `-h, --help` : affiche l'aide et quitte
* `--version` : affiche la version et quitte
* `--pyramids storage://path/to/pyr.json[>BOTTOM>TOP] [storage://path/to/pyr.json[>BOTTOM>TOP] ...]` : descripteur des pyramides à utiliser dans la couche et niveaux d'utilisation
* `--name my_data` : nom technique de la couche
* `--styles normal [normal ...]` : identifiants des styles disponibles pour la couche (pas de contrôle sur les identifiants)
* `--title my data` : titre de la couche
* `--abstract "my data description"` : résumé de la couche
* `--resampling {nn,linear,bicubic,lanczos_2,lanczos_3,lanczos_4}` : type d'interpolation pour le réechantillonnage
* `--directory s3://layers_bucket` : dossier, fichier ou objet, dans lequel écrire le descripteur de pyramide. Affiche dans la sortie standard si non fourni

### PYROLYSE

PYROLYSE est un outil d'analyse d'une pyramide, permettant d'avoir le nombre et la taille des dalles et tuiles, au global et par niveau. Les tailles des dalles et des tuiles ne sont pas toutes récupérées : un ratio permet de définir le nombre de mesures (un ratio de 100 entraînera la récupération de la taille d'une dalle sur 100 et d'une de ses tuile). Ce ratio s'applique par niveau (pour ne pas avoir que des données sur le meilleur niveau, celui qui contient le plus de dalles). Lorsque les statistiques sur les tuiles sont activées, on mesure le temps de lecture du header.

Concernant les tailles et mes temps d'accès, il est possible de demander le calcul des déciles plutôt que de garder toutes les valeurs.
Concernant les tailles et les temps d'accès, il est possible de demander le calcul des déciles plutôt que de garder toutes les valeurs.

Utilisation : `pyrolyse [-h] [--version] --pyramid storage://path/to/pyr.json [--json storage://path/to/conf.json] [--tiles] [--progress] [--deciles] [--ratio N]`

* `-h, --help` : affiche l'aide et quitte
* `--version` : affiche la version et quitte
* `--pyramid storage://path/to/pyr.json` : descripteur de la pyramide à analyser
* `--output storage://path/to/conf.json` : fichier ou objet dans lequel écrire le résultat. Affiche dans la sortie standard si non fourni
* `--tiles` : avoir l'analyse de la taille des tuiles
* `--progress` : affiche une barre de progression, seulement avec l'option `--output`
* `--deciles` : avoir les déciles plutôt que toutes les valeurs de taille et de temps d'accès
* `--ratio N` : ratio à appliquer sur la mesure de taille (un parmi <ratio>, 100 par défaut). Toutes les dalles sont comptées

### TMSIZER

TMSIZER est un outil permettant de convertir des informations selon différents formats en accord avec un Tile Matrix Set en particulier. Les données en entrée peuvent être lues depuis un fichier, un objet ou l'entrée standard. Les données en sortie peuvent être écrites dans un fichier, un objet ou la sortie standard.

Utilisation : `tmsizer [-h] [--version] --tms <TMS identifier> [-i storage://path/to/data] -if <format> [-io <KEY>:<VALUE> [<KEY>:<VALUE> ...]] [-o storage://path/to/results] -of <format> [-oo <KEY>:<VALUE> [<KEY>:<VALUE> ...]] [--progress]`

* `-h, --help` : affiche l'aide et quitte
* `--version` : affiche la version et quitte
* `--tms <TMS identifier>` : identifiant du TMS
* `-i storage://path/to/data, --input storage://path/to/data` : fichier ou objet contenant la donnée en entrée. Lecture depuis l'entrée standard si non fourni
* `-if <format>, --input-format <format>` : format des données en entrée
* `-io <KEY>:<VALUE> [<KEY>:<VALUE> ...], --input-option <KEY>:<VALUE> [<KEY>:<VALUE> ...]` : options pour les données en entrée (dépend du format)
* `-o storage://path/to/results, --output storage://path/to/results` : fichier ou objet où écrire la donnée en sortie. Écriture dans la sortie standard si non fourni
* `-of <format>, --output-format <format>` : format des données en sortie
* `-oo <KEY>:<VALUE> [<KEY>:<VALUE> ...], --output-option <KEY>:<VALUE> [<KEY>:<VALUE> ...]` : options pour les données en sortie (dépend du format)
* `--progress` : affiche une barre de progression, seulement avec l'option `--output`

Conversions possibles (options obligatoires en gras, options facultatives en italique) :

| Format en entrée | Options d'entrée | Format en sortie | Options de sortie | Description |
|------------------|------------------|------------------|---------------------------------------------------------------|---------------------------------------------------------------------------------------------------------|
| GETTILE_PARAMS | *`level=<id>`* | COUNT | | Compte le nombre de GetTile dans les URLs en entrée utilisant le TMS pivot et l'éventuel niveau fourni |
| GETTILE_PARAMS | *`level=<id>`* | HEATMAP | **`bbox=<xmin>,<ymin>,<xmax>,<ymax>`**, **`dimensions=<width>x<height>`** | Génère une carte de chaleur des tuiles interrogées sur la zone demandée et sur l'éventuel niveau fourni |
| GEOMETRY | **`format=<WKT\|GeoJSON\|WKB>`**,**`level=<id>`** | GETTILE_PARAMS | | Génére les paramètres de requête GetTile des tuiles nu niveau fourni intersectant les géométries en entrée |

Exemple (GETTILE_PARAMS -> HEATMAP) :

`tmsizer -i logs.txt --tms PM -io level=15 -if GETTILE_PARAMS -of HEATMAP -oo bbox=65000,6100000,665000,6500000 -oo dimensions=600x400 -o heatmap.tif`

## Compiler la suite d'outils

```sh
Expand Down
55 changes: 53 additions & 2 deletions README.pypi.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ The `rok4-tools` package help to use [ROK4 project](https://rok4.github.io/) con
## Installation

Required system packages :

* debian : `apt install python3-rados python3-gdal`

The `rok4` package is available on :

* [PyPI](https://pypi.org/project/rok4/) : `pip install rok4`
* [GitHub](https://github.com/rok4/core-python/releases/) : `pip install https://github.com/rok4/core-python/releases/download/<version>/rok4-<version>-py3-none-any.whl`

Expand Down Expand Up @@ -107,15 +109,64 @@ MAKE-LAYER generate a layer's descriptor, [ROK4 server](https://github.com/rok4/

#### Usage

`make-layer [-h] --pyramids storage://path/to/pyr.json[>BOTTOM>TOP] [storage://path/to/pyr.json[>BOTTOM>TOP] ...] --name my data [--styles normal [normal ...]] [--title my data]`
`make-layer [-h] [--version] --pyramids storage://path/to/pyr.json[>BOTTOM>TOP] [storage://path/to/pyr.json[>BOTTOM>TOP] ...] --name my_data [--styles normal [normal ...]] [--title my data] [--abstract my data description] [--resampling {nn,linear,bicubic,lanczos_2,lanczos_3,lanczos_4}] [--directory s3://layers_bucket]`

* `-h, --help` : show this help message and exit
* `--version` : show program's version number and exit
* `--pyramids storage://path/to/pyr.json[>BOTTOM>TOP] [storage://path/to/pyr.json[>BOTTOM>TOP] ...]` : Pyramids' descriptors, with extrem levels to use if not all levels have to be used
* `--name my_data` : Layer's technical name
* `--styles normal [normal ...]` : Styles ID available for the layer (no controls, ID are added as provided)
* `--title my data` : Layer title
* `--abstract "my data description"` : Layer description
* `--resampling {nn,linear,bicubic,lanczos_2,lanczos_3,lanczos_4}` : Layer resampling
* `--directory s3://layers_bucket` : Directory (file or object) where to write layer's descriptor. Print in standard output if not provided

### PYROLYSE

PYROLYSE analyse a pyramid, to get slab/tile size and count, for hte entire pyramide and per level. Slab and tile sizes are not all processed : a ratio limits the number of measures. This ratio is assumed for a level (to avoid to have mainly data for the best level). If tile statistics is enabled, access time are compiled.
PYROLYSE analyse a pyramid, to get slab/tile size and count, for the entire pyramide and per level. Slab and tile sizes are not all processed : a ratio limits the number of measures. This ratio is assumed for a level (to avoid to have mainly data for the best level). If tile statistics is enabled, access time are compiled.

For size and access time, it's possible to get deciles and not all values.

#### Usage

`pyrolyse [-h] [--version] --pyramid storage://path/to/pyr.json [--json storage://path/to/conf.json] [--tiles] [--progress] [--deciles] [--ratio N]`

* `-h, --help` : show this help message and exit
* `--version` : show program's version number and exit
* `--pyramid storage://path/to/pyr.json` : pyramid's descriptor, to analyse
* `--output storage://path/to/conf.json` : file/object to write results. Print in standard output if not provided
* `--tiles` : get size analysis for tiles
* `--progress` : Print a progress bar (only with --output option)
* `--deciles` : get deciles for sizes and read times rather than values
* `--ratio N` : ratio of measured slabs and tiles (<ratio> choose one). All slabs are counted

### TMSIZER

TMSIZER converts data according to a pivot Tile Matrix Set. Input data can be read from a file, an object or standard input. The output data can be write to a file, an object or standard output. Several input and output formats are allowed.

#### Usage

`tmsizer [-h] [--version] --tms <TMS identifier> [-i storage://path/to/data] -if <format> [-io <KEY>:<VALUE> [<KEY>:<VALUE> ...]] [-o storage://path/to/results] -of <format> [-oo <KEY>:<VALUE> [<KEY>:<VALUE> ...]] [--progress]`

* `-h, --help` : show this help message and exit
* `--version` : show program's version number and exit
* `--tms <TMS identifier>` : tile matrix set identifier
* `-if <format>, --input-format <format>` : input format
* `-of <format>, --output-format <format>` : output format
* `-i storage://path/to/data, --input storage://path/to/data` : file/object to read data. Read from standard input if not provided
* `-o storage://path/to/results, --output storage://path/to/results` : file/object to write results. Print in standard output if not provided
* `-oo <KEY>:<VALUE> [<KEY>:<VALUE> ...], --output-option <KEY>:<VALUE> [<KEY>:<VALUE> ...]` : options for output
* `-io <KEY>:<VALUE> [<KEY>:<VALUE> ...], --input-option <KEY>:<VALUE> [<KEY>:<VALUE> ...]` : options for input
* `--progress` : print a progress bar (only with --output option)

Availables conversions (mandatory options in bold, optionnal options in italic) :

| Input format | Input options | Output format | Output options | Description |
|----------------|---------------------------------------------------|----------------|---------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|
| GETTILE_PARAMS | *`level=<id>`* | COUNT | | Count the GetTiles requests using the pivot TMS and optionnally the provided level |
| GETTILE_PARAMS | *`level=<id>`* | HEATMAP | **`bbox=<xmin>,<ymin>,<xmax>,<ymax>`**, **`dimensions=<width>x<height>`** | Create an heat map of requested tiles on the provided area, optionnaly filtering with provided level |
| GEOMETRY | **`format=<WKT\|GeoJSON\|WKB>`**,**`level=<id>`** | GETTILE_PARAMS | | Generate GetTile query parameters for tiles intersecting input geometries for the provided level |

Example (GETTILE_PARAMS -> HEATMAP) :

`tmsizer -i logs.txt --tms PM -io level=15 -if GETTILE_PARAMS -of HEATMAP -oo bbox=65000,6100000,665000,6500000 -oo dimensions=600x400 -o heatmap.tif`
2 changes: 2 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ classifiers = [
dependencies = [
"jsonschema",
"tqdm",
"rasterio",
"rok4 >= 2.1.5, < 3.0.0"
]

Expand Down Expand Up @@ -64,6 +65,7 @@ pyr2pyr = "rok4_tools.pyr2pyr:main"
make-layer = "rok4_tools.make_layer:main"
joincache = "rok4_tools.joincache:main"
pyrolyse = "rok4_tools.pyrolyse:main"
tmsizer = "rok4_tools.tmsizer:main"

[tool.setuptools.package-data]
"rok4_tools.joincache_utils" = ["*.json"]
Expand Down
14 changes: 7 additions & 7 deletions src/rok4_tools/pyrolyse.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,11 @@ def parse() -> None:
)

parser.add_argument(
'--json',
'--output',
metavar='storage://path/to/conf.json',
action='store',
dest='output',
help='JSON file to write with results. Print in standard output if not provided',
dest='output_path',
help='File/object to write results. Print in standard output if not provided',
required=False
)

Expand All @@ -97,7 +97,7 @@ def parse() -> None:
'--progress',
action='store_true',
dest='progress',
help='Print a progress bar (only with --json option)',
help='Print a progress bar (only with --output option)',
required=False
)

Expand Down Expand Up @@ -127,7 +127,7 @@ def parse() -> None:
stats["global"]["tile_sizes"] = []
stats["perfs"] = []

if args.progress and args.output is None:
if args.progress and args.output_path is None:
raise Exception("Print a progress bar is not possible without output file for statistics (--json option)")


Expand Down Expand Up @@ -228,10 +228,10 @@ def work() -> None:
def write() -> None:
"""Write the informations as JSON, in the standard output or a file
"""
if args.output is None:
if args.output_path is None:
print(json.dumps(stats))
else:
put_data_str(json.dumps(stats), args.output)
put_data_str(json.dumps(stats), args.output_path)


def main() -> None:
Expand Down
Loading
Loading