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

Installer RADOS

sudo apt install python-rados

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 la commande CURL suivante :

curl -X 'POST' \
  'http://127.0.0.1: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",
                "50": "LiDAR Topo IGN densité d’acquisition théorique non renseignée ou inférieure à 1 pt / m²",
                "51": "LiDAR Topo IGN densité d’acquisition théorique 1 point au m²",
                "52": "LiDAR Topo IGN densité d’acquisition théorique 2 points au m²",
                "53": "LiDAR Topo IGN densité d’acquisition théorique 3 points au m²",
                "54": "LiDAR Topo IGN densité d’acquisition théorique 4 points au m²",
                "55": "LiDAR Topo IGN densité d’acquisition théorique 5 points au m²",
                "56": "LiDAR Topo IGN densité d’acquisition théorique 6 points au m²",
                "57": "LiDAR Topo IGN densité d’acquisition théorique 7 points au m²",
                "58": "LiDAR Topo IGN densité d’acquisition théorique 8 points ou plus au m²",
                "59": "LiDAR Topo IGN interpolation > 10m",
                "60": "Translation en Z à partir du MNE LiDAR Topo IGN densité acquisition théorique non renseignée ou inférieure à 1 pt / m²",
                "61": "Translation en Z à partir du MNE LiDAR Topo IGN densité d’acquisition théorique 1 point au m²",
                "62": "Translation en Z à partir du MNE LiDAR Topo IGN densité d’acquisition théorique 2 points au m²",
                "63": "Translation en Z à partir du MNE LiDAR Topo IGN densité d’acquisition théorique 3 points au m²",
                "64": "Translation en Z à partir du MNE LiDAR Topo IGN densité d’acquisition théorique 4 points au m²",
                "65": "Translation en Z à partir du MNE LiDAR Topo IGN densité d’acquisition théorique 5 points au m²",
                "66": "Translation en Z à partir du MNE LiDAR Topo IGN densité d’acquisition théorique 6 points au m²",
                "67": "Translation en Z à partir du MNE LiDAR Topo IGN densité d’acquisition théorique 7 points ou plusau m²",
                "68": "LiDAR Topo IGN sans corrections interactives",
                "69": "LiDAR Topo IGN Point Fictif",
                "70": "Origines multiples produit Litto3D®",
                "80": "LiDAR Topo externe densité acquisition théorique non renseignée ou inférieure à 1 pt / m²",
                "81": "LiDAR Topo externe densité d’acquisition théorique 1 point au m² (de 81 à 87)",
                "82": "LiDAR Topo externe densité d’acquisition théorique 2 points au m² (de 81 à 87)",
                "83": "LiDAR Topo externe densité d’acquisition théorique 3 points au m² (de 81 à 87)",
                "84": "LiDAR Topo externe densité d’acquisition théorique 4 points au m² (de 81 à 87)",
                "85": "LiDAR Topo externe densité d’acquisition théorique 5 points au m² (de 81 à 87)",
                "86": "LiDAR Topo externe densité d’acquisition théorique 6 points au m² (de 81 à 87)",
                "87": "LiDAR Topo externe densité d’acquisition théorique 7 points au m² (de 81 à 87)",
                "88": "LiDAR Topo densité d’acquisition théorique 8 points ou plus au m²",
                "89": "LiDAR Topo externe interpolation > 10m",
                "98": "LiDAR Topo externe sans corrections interactives",
                "99": "LiDAR Topo externe Point Fictif",
                "100": "Corrélation automatique PVA HR 30 cm >= pixel => 20 cm Zone Rurale",
                "101": "Corrélation automatique PVA HR 30 cm >= pixel => 20 cm Zone Urbaine",
                "102": "Corrélation automatique PVA HR 30 cm >= pixel => 20 cm BD ALTI® recalée",
                "103": "Corrélation automatique PVA HR 30 cm >= pixel => 20 cm BD ALTI® non recalée",
                "104": "Reprise interactive sur Corrélation automatique de PVA HR 30 >= pixel =>20 cm Zone Rurale",
                "105": "Reprise interactive sur Corrélation automatique de PVA HR 30 >= pixel =>20 cm Zone Urbaine",
                "110": "Corrélation automatique PVA HR 20 cm > pixel => 10 cm Zone Rurale",
                "111": "Corrélation automatique PVA HR 20 cm > pixel => 10 cm Zone Urbaine",
                "112": "Corrélation automatique PVA HR 20 cm > pixel => 10 cm BD ALTI® non recalée",
                "113": "Corrélation automatique PVA HR 20 cm > pixel => 10 cm BD ALTI® recalée",
                "114": "Reprise interactive sur Corrélation automatique de PVA HR 20 cm > pixel => 10 cm Zone Rurale",
                "115": "Reprise interactive sur Corrélation automatique de PVA HR 20 cm > pixel => 10 cm Zone Urbaine",
                "120": "Corrélation automatique PVA HR pixel < 10 cm Zone Rurale",
                "121": "Corrélation automatique PVA HR pixel < 10 cm Zone Urbaine",
                "123": "Corrélation automatique PVA HR pixel < 10 cm BD ALTI® recalée",
                "124": "Corrélation automatique PVA HR pixel < 10 cm BD ALTI® non recalée",
                "125": "Reprise interactive sur Corrélation automatique de PVA HR pixel < 10 cm Zone Rurale",
                "126": "Reprise interactive sur Corrélation automatique de PVA HR pixel < 10 cm Zone Urbaine",
                "135": "Corrélation automatique acquisition externe PVA HR 30 cm >= pixel => 20 cm Zone Rurale",
                "136": "Corrélation automatique acquisition externe PVA HR 30 cm >= pixel => 20 cm Zone Urbaine",
                "140": "Corrélation automatique acquisition externe PVA HR 20 cm > pixel => 10 cm Zone Rurale",
                "141": "Corrélation automatique acquisition externe PVA HR 20 cm > pixel => 10 cm Zone Urbaine",
                "145": "Corrélation automatique acquisition externe PVA HR pixel < 10 cm Zone Rurale",
                "146": "Corrélation automatique acquisition externe PVA HR pixel < 10 cm Zone Urbaine",
                "150": "Corrélation automatique PVA non HR pixel > 30 cm",
                "151": "Corrélation automatique acquisition externe PVA non HR pixel > 30 cm",
                "160": "Données interpolées à partir de données existantes (radar ou ancillaires) EMQ<7m",
                "161": "Données Radar EMQ<7m",
                "162": "Données ancillaire (BD ALTI®) EMQ<7m",
                "163": "Données interpolées sur des surfaces d’eau EMQ<7m",
                "164": "Données interpolées sur des zones sans données disponibles EMQ<7m",
                "165": "MNT grille externe au pas de 1m à 5m issu d’acquisition LiDAR",
                "166": "MNT grille externe au pas de 6m à 10m issu d’acquisition LiDAR",
                "167": "MNT grille externe au pas de 2m à 5m issu de corrélation automatique",
                "168": "MNT grille externe au pas de 6m à 10m issu de corrélation automatique",
                "170": "LiDAR Topo IGN en forêt densité d’acquisition théorique non renseignée ou inférieure à 1 pt / m²",
                "171": "LiDAR Topo IGN en forêt densité d’acquisition théorique 1 point au m²",
                "172": "LiDAR Topo IGN en forêt densité d’acquisition théorique 2 points au m²",
                "173": "LiDAR Topo IGN en forêt densité d’acquisition théorique 3 points au m²",
                "174": "LiDAR Topo IGN en forêt densité d’acquisition théorique 4 points au m²",
                "175": "LiDAR Topo IGN en forêt densité d’acquisition théorique 5 points au m²",
                "176": "LiDAR Topo IGN en forêt densité d’acquisition théorique 6 points au m²",
                "177": "LiDAR Topo IGN en forêt densité d’acquisition théorique 7 points au m²",
                "178": "LiDAR Topo IGN en forêt densité d’acquisition théorique 8 points ou plus au m²",
                "179": "LiDAR Topo IGN en forêt interpolation > 10m",
                "188": "LiDAR Topo IGN en forêt sans corrections interactives",
                "189": "LiDAR Topo IGN en forêt Point Fictif"
            },
            "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