Configurer l’environnement de développement¶
Prérequis système¶
Python >= 3.10
Linux : Debian (fortement recommandée)
Dépendances liées à Rok4 Core Python. À date (août 2023), il faut notamment :
Accès réseau sur :
l’instance GitLab : https://gitlab.gpf-tech.ign.fr
le dépôt officiel de paquets Python : https://pypi.org/
un jeton d’accès personnel (Personal Access Token (PAT)) avec le scope
read_apiou a minimaread_registry.
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