Configurer l’environnement de développement

Prérequis système

Cloner le dépôt

Exemple pour Oslandia avec l’utilisateur geojulien :

git clone --config 'credential.helper=store' https://geojulien@gitlab.gpf-tech.ign.fr/geoplateforme/altimetrie/api-rest-calcul-altimetrique.git

Derrière le proxy

L’Usine Logicielle étant en accès restreint derrière un filtre IP, les personnes ne disposant pas d’IP fixe passent par un proxy qui pointe sur un serveur de rebond dont l’IP fixe est autorisée.

Exemple avec un proxy de type socks :

git clone --config http.proxy='socks5://127.0.0.1:8645' --config 'credential.helper=store' https://geojulien@gitlab.gpf-tech.ign.fr/geoplateforme/altimetrie/api-rest-calcul-altimetrique

Démarrage rapide

Exemple sur une distribution Linux de type Ubuntu LTS (22.04 à date).

Installation des prérequis Rok4

sudo apt install python3-rados python3-gdal

Pour plus d’informations, vous pouvez vous référencer à la documentation Rok4.

Installation de l’environnement Python

Environnement virtuel

Installer dans un environnement virtuel :

# environnement virtuel lié aux packages système pour obtenir la librados
python3 -m venv .venv --system-site-packages
source .venv/bin/activate
# mise à jour de pip dans l'environnement virtuel
python -m pip install -U pip setuptools wheel
# installation du projet en mode développement
python -m pip install -e .

Système

Pour une installation au niveau du système :

python3 -m pip install -U setuptools wheel
python3 -m pip install -e .

Derrière un proxy

Pour les proxy de type socks, installer préalablement PySocks dans le même environnement que le reste :

python -m pip install -U "PySocks<2"

Puis installer tour à tour les dépendances issues de <pypi.org> puis celles du registre de l’Usine Logicielle :

python -m pip install -e .

Installer les dépendances supplémentaires pour le développement :

python -m pip install -e '.[dev,doc,test]'

Configuration initiale avec variables d’environnement

Se créer un fichier de variables d’environnement .env à partir du fichier .example.env et modifier les différentes variables.

cp .example.env .env

En fonction de votre système d’exploitation, les commandes à exécuter pour installer les librairies nécessaires au bon fonctionnement sont différentes.

Lancer l’API

# lancer l'API
python3 -m uvicorn alti_api.main:fast_api_app --reload

Une fois lancée, un swagger est visualisable http://localhost:8000/api/index.html

Au lancement de l’API, il n’y aura aucune ressource. Vous pouvez par exemple en créer une avec les commandes CURL suivantes.

Si la protection CSRF a été activée :

curl -c cookies.txt -s -X GET "http://localhost:8000/csrf-token" -o csrf.json

CSRF_TOKEN=$(jq -r '.csrf_token' csrf.json)

curl -X 'POST' \
  'http://localhost:8000/1.0/resources/' \
  -b cookies.txt \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -H "X-CSRF-Token: $CSRF_TOKEN" \
  -d '{
"_id": "test",
"title": "RGE Alti - Calvados échantillon - 8 bits",
"keywords": [
    "NL",
    "ALTI"
],
"bbox": {
    "west": -1.1923,
    "south": 48.7882,
    "east": -1.1262,
    "north": 48.8464
},
"used_data": [
    {
        "title": "RGE Alti 1 m : CAPA",
        "bbox": {
            "west": -1.1923,
            "south": 48.7882,
            "east": -1.1262,
            "north": 48.8464
        },
        "source": {
            "mapping": {
                "0": "Autre - Pas de données",
                "2": "Autre - Raccord aux dépens du LiDAR",
                "3": "Autre - Raccord aux dépens de la Corrélation",
                "4": "Autre - Raccord aux dépens du RADAR",
                "28": "LiDAR mixte Bathy SHOM",
                "29": "LiDAR mixte BAthy SHOM interpolation > 10 m",
                "30": "LiDAR Bathy SHOM",
                "39": "LiDAR Bathy SHOM interpolation > 10m",
                "40": "SMF SHOM",
                "49": "SMF SHOM interpolation > 10 m",
            },
            "stored_data": {
                "type": "ROK4-PYRAMID-RASTER",
                "name": "rgealti_14_sbe",
                "status": "GENERATED",
                "srs": "EPSG:3857",
                "extent": {
                    "geometry": {
                        "type": "Polygon",
                        "coordinates": [
                            [
                                [
                                    -1.15666898,
                                    48.82133951
                                ],
                                [
                                    -1.15666898,
                                    48.83079441
                                ],
                                [
                                    -1.16955313,
                                    48.83079441
                                ],
                                [
                                    -1.16955313,
                                    48.82133951
                                ],
                                [
                                    -1.15666898,
                                    48.82133951
                                ]
                            ]
                        ]
                    },
                    "type": "Feature"
                },
                "size": 7756028,
                "storage": {
                    "name": "S3",
                    "type": "S3",
                    "_id": "ab032611-13eb-4a18-8d04-9b7604a031cc",
                    "type_infos": {
                        "pot_name": "telechargement-qlf"
                    }
                },
                "ancestors": [],
                "_id": "fc3b31ad-bfe3-40f3-a073-4b6b20491d32",
                "type_infos": {
                    "tms": "PM",
                    "levels": [
                        "11",
                        "12",
                        "13",
                        "14",
                        "15",
                        "16",
                        "17",
                        "0",
                        "1",
                        "2",
                        "3",
                        "4",
                        "5",
                        "6",
                        "7",
                        "8",
                        "9",
                        "10"
                    ],
                    "channels_format": "FLOAT32",
                    "channels_number": 1,
                    "compression": "ZIP",
                    "nodata_value": "-99999"
                }
            }
        },
        "accuracy": {
            "mapping": {
                "1": "1"
            },
            "stored_data": {
                "type": "ROK4-PYRAMID-RASTER",
                "name": "rgealti_14_sbe",
                "status": "GENERATED",
                "srs": "EPSG:3857",
                "extent": {
                    "geometry": {
                        "type": "Polygon",
                        "coordinates": [
                            [
                                [
                                    -1.15666898,
                                    48.82133951
                                ],
                                [
                                    -1.15666898,
                                    48.83079441
                                ],
                                [
                                    -1.16955313,
                                    48.83079441
                                ],
                                [
                                    -1.16955313,
                                    48.82133951
                                ],
                                [
                                    -1.15666898,
                                    48.82133951
                                ]
                            ]
                        ]
                    },
                    "type": "Feature"
                },
                "size": 7756028,
                "storage": {
                    "name": "S3",
                    "type": "S3",
                    "_id": "ab032611-13eb-4a18-8d04-9b7604a031cc",
                    "type_infos": {
                        "pot_name": "telechargement-qlf"
                    }
                },
                "ancestors": [],
                "_id": "fc3b31ad-bfe3-40f3-a073-4b6b20491d32",
                "type_infos": {
                    "tms": "PM",
                    "levels": [
                        "11",
                        "12",
                        "13",
                        "14",
                        "15",
                        "16",
                        "17",
                        "0",
                        "1",
                        "2",
                        "3",
                        "4",
                        "5",
                        "6",
                        "7",
                        "8",
                        "9",
                        "10"
                    ],
                    "channels_format": "FLOAT32",
                    "channels_number": 1,
                    "compression": "ZIP",
                    "nodata_value": "-99999"
                }
            }
        },
        "stored_data": {
            "type": "ROK4-PYRAMID-RASTER",
            "name": "rgealti_14_sbe",
            "status": "GENERATED",
            "srs": "EPSG:3857",
            "extent": {
                "geometry": {
                    "type": "Polygon",
                    "coordinates": [
                        [
                            [
                                -1.15666898,
                                48.82133951
                            ],
                            [
                                -1.15666898,
                                48.83079441
                            ],
                            [
                                -1.16955313,
                                48.83079441
                            ],
                            [
                                -1.16955313,
                                48.82133951
                            ],
                            [
                                -1.15666898,
                                48.82133951
                            ]
                        ]
                    ]
                },
                "type": "Feature"
            },
            "size": 7756028,
            "storage": {
                "name": "S3",
                "type": "S3",
                "_id": "ab032611-13eb-4a18-8d04-9b7604a031cc",
                "type_infos": {
                    "pot_name": "telechargement-qlf"
                }
            },
            "ancestors": [],
            "_id": "fc3b31ad-bfe3-40f3-a073-4b6b20491d32",
            "type_infos": {
                "tms": "PM",
                "levels": [
                    "11",
                    "12",
                    "13",
                    "14",
                    "15",
                    "16",
                    "17",
                    "0",
                    "1",
                    "2",
                    "3",
                    "4",
                    "5",
                    "6",
                    "7",
                    "8",
                    "9",
                    "10"
                ],
                "channels_format": "FLOAT32",
                "channels_number": 1,
                "compression": "ZIP",
                "nodata_value": "-99999"
            }
        }
    }
],
"abstract": "RGE Alti - Calvados échantillon - 8 bits"
}'

Si la protection CSRF n’a pas été activée :

curl -X 'POST' \
  'http://localhost:8000/1.0/resources/' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
"_id": "test",
"title": "RGE Alti - Calvados échantillon - 8 bits",
"keywords": [
    "NL",
    "ALTI"
],
"bbox": {
    "west": -1.1923,
    "south": 48.7882,
    "east": -1.1262,
    "north": 48.8464
},
"used_data": [
    {
        "title": "RGE Alti 1 m : CAPA",
        "bbox": {
            "west": -1.1923,
            "south": 48.7882,
            "east": -1.1262,
            "north": 48.8464
        },
        "source": {
            "mapping": {
                "0": "Autre - Pas de données",
                "2": "Autre - Raccord aux dépens du LiDAR",
                "3": "Autre - Raccord aux dépens de la Corrélation",
                "4": "Autre - Raccord aux dépens du RADAR",
                "28": "LiDAR mixte Bathy SHOM",
                "29": "LiDAR mixte BAthy SHOM interpolation > 10 m",
                "30": "LiDAR Bathy SHOM",
                "39": "LiDAR Bathy SHOM interpolation > 10m",
                "40": "SMF SHOM",
                "49": "SMF SHOM interpolation > 10 m"
            },
            "stored_data": {
                "type": "ROK4-PYRAMID-RASTER",
                "name": "rgealti_14_sbe",
                "status": "GENERATED",
                "srs": "EPSG:3857",
                "extent": {
                    "geometry": {
                        "type": "Polygon",
                        "coordinates": [
                            [
                                [
                                    -1.15666898,
                                    48.82133951
                                ],
                                [
                                    -1.15666898,
                                    48.83079441
                                ],
                                [
                                    -1.16955313,
                                    48.83079441
                                ],
                                [
                                    -1.16955313,
                                    48.82133951
                                ],
                                [
                                    -1.15666898,
                                    48.82133951
                                ]
                            ]
                        ]
                    },
                    "type": "Feature"
                },
                "size": 7756028,
                "storage": {
                    "name": "S3",
                    "type": "S3",
                    "_id": "ab032611-13eb-4a18-8d04-9b7604a031cc",
                    "type_infos": {
                        "pot_name": "telechargement-qlf"
                    }
                },
                "ancestors": [],
                "_id": "fc3b31ad-bfe3-40f3-a073-4b6b20491d32",
                "type_infos": {
                    "tms": "PM",
                    "levels": [
                        "11",
                        "12",
                        "13",
                        "14",
                        "15",
                        "16",
                        "17",
                        "0",
                        "1",
                        "2",
                        "3",
                        "4",
                        "5",
                        "6",
                        "7",
                        "8",
                        "9",
                        "10"
                    ],
                    "channels_format": "FLOAT32",
                    "channels_number": 1,
                    "compression": "ZIP",
                    "nodata_value": "-99999"
                }
            }
        },
        "accuracy": {
            "mapping": {
                "1": "1"
            },
            "stored_data": {
                "type": "ROK4-PYRAMID-RASTER",
                "name": "rgealti_14_sbe",
                "status": "GENERATED",
                "srs": "EPSG:3857",
                "extent": {
                    "geometry": {
                        "type": "Polygon",
                        "coordinates": [
                            [
                                [
                                    -1.15666898,
                                    48.82133951
                                ],
                                [
                                    -1.15666898,
                                    48.83079441
                                ],
                                [
                                    -1.16955313,
                                    48.83079441
                                ],
                                [
                                    -1.16955313,
                                    48.82133951
                                ],
                                [
                                    -1.15666898,
                                    48.82133951
                                ]
                            ]
                        ]
                    },
                    "type": "Feature"
                },
                "size": 7756028,
                "storage": {
                    "name": "S3",
                    "type": "S3",
                    "_id": "ab032611-13eb-4a18-8d04-9b7604a031cc",
                    "type_infos": {
                        "pot_name": "telechargement-qlf"
                    }
                },
                "ancestors": [],
                "_id": "fc3b31ad-bfe3-40f3-a073-4b6b20491d32",
                "type_infos": {
                    "tms": "PM",
                    "levels": [
                        "11",
                        "12",
                        "13",
                        "14",
                        "15",
                        "16",
                        "17",
                        "0",
                        "1",
                        "2",
                        "3",
                        "4",
                        "5",
                        "6",
                        "7",
                        "8",
                        "9",
                        "10"
                    ],
                    "channels_format": "FLOAT32",
                    "channels_number": 1,
                    "compression": "ZIP",
                    "nodata_value": "-99999"
                }
            }
        },
        "stored_data": {
            "type": "ROK4-PYRAMID-RASTER",
            "name": "rgealti_14_sbe",
            "status": "GENERATED",
            "srs": "EPSG:3857",
            "extent": {
                "geometry": {
                    "type": "Polygon",
                    "coordinates": [
                        [
                            [
                                -1.15666898,
                                48.82133951
                            ],
                            [
                                -1.15666898,
                                48.83079441
                            ],
                            [
                                -1.16955313,
                                48.83079441
                            ],
                            [
                                -1.16955313,
                                48.82133951
                            ],
                            [
                                -1.15666898,
                                48.82133951
                            ]
                        ]
                    ]
                },
                "type": "Feature"
            },
            "size": 7756028,
            "storage": {
                "name": "S3",
                "type": "S3",
                "_id": "ab032611-13eb-4a18-8d04-9b7604a031cc",
                "type_infos": {
                    "pot_name": "telechargement-qlf"
                }
            },
            "ancestors": [],
            "_id": "fc3b31ad-bfe3-40f3-a073-4b6b20491d32",
            "type_infos": {
                "tms": "PM",
                "levels": [
                    "11",
                    "12",
                    "13",
                    "14",
                    "15",
                    "16",
                    "17",
                    "0",
                    "1",
                    "2",
                    "3",
                    "4",
                    "5",
                    "6",
                    "7",
                    "8",
                    "9",
                    "10"
                ],
                "channels_format": "FLOAT32",
                "channels_number": 1,
                "compression": "ZIP",
                "nodata_value": "-99999"
            }
        }
    }
],
"abstract": "RGE Alti - Calvados échantillon - 8 bits"
}'

Une fois la ressource créée, vous devriez utiliser la valeur _id dans le paramètre resource. Dans l’exemple ci-dessus, la ressource s’apelle test.

Parallélisation

Il est aussi possible de lancer plusieurs instances de l’API pour améliorer les temps de réponse (incompatible avec l’option reload) :

# lancer l'API avec 10 workers en parallele
python3 -m uvicorn alti_api.main:fast_api_app --workers 10