Ajout d‘un indicateur liste_geo
Contexte
On peut maintenant mieux différencier les indicateurs selon leur type dans les requêtes GraphQL, on en profite pour revenir sur l’idée de mieux présenter les données géographiques.
Contenu
Définition de l’indicateur
On ajoute un nouveau return_type
: liste_geo
On attend qu’un indicateur avec ce type retourne au minimum ces 4 colonnes :
geo__code
geo__libelle
geo__contour
geo__point
Pour l’instant on doit le faire à la main, on peut imaginer les ajouter automatiquement dans un autre temps. Je n’ai pas trouvé comment s’assurer de manière statique que la requête renvoie bien ça.
Exemple de définition
- nom: Un indicateur
identifiant: un_indicateur_geo
return_type: liste_geo
maille_origine: commune
sql: |
SELECT
col1, col2, col3,
commune.insee_com AS geo__code, lib_com AS geo__libelle,
geom AS geo__contour,
ST_PointOnSurface(geom) AS geo__point
FROM monjdd
CROSS JOIN commune
LEFT JOIN contour_commune ON commune.insee_com = contour_commune.insee_com;
Requête de l’indicateur
On ajoute un nouveau type de retour IndicateurListeGeo
.
Ce type a 4 champs :
-
count
, qui renvoie un entier avec le nombre de valeurs dans l’indicateur comme sur les autres indicateurs de type liste -
properties
qui renvoie une liste de dictionnaire avec les valeurs de l’indicateur ainsi que les clésgeo__code
etgeo__libelle
contours
points
Les deux renvoient un objet GeoJSON de type FeatureCollection
, l’inconvénient ici c’est qu’il faut demander à l’intérieur de l’objet le détail du GeoJSON, par exemple
{
type
features {
properties
geometry {
type
coordinates
}
}
}
C’est pratique parce que c’est bien typé, mais c’est peut être un peu lourd, c’est à rediscuter si on veut faire autrement.
Exemple de requête
{
indicateurs(filtre: {identifiants: ["un_indicateur_geo"]}) {
identifiant
mailles {
departement(code: "80") {
... on IndicateurListeGeo {
properties
count
contours {
type
features {
properties
geometry {
type
coordinates
}
}
}
points {
type
features {
properties
geometry {
type
coordinates
}
}
}
}
}
}
}
}
Exemple de réponse
{
"data": {
"indicateurs": [
{
"identifiant": "un_indicateur_geo",
"mailles": {
"departement": {
"properties": [
{
"col1": 1,
"col2": "2",
"col3": "3",
"geo__code": "80001",
"geo__libelle": "Abbeville",
},
{
"col1": 1,
"col2": "2",
"col3": "3",
"geo__code": "80021",
"geo__libelle": "Amiens",
},
],
"count": 2,
"contours": {
"type": "FeatureCollection",
"features": [
{
"properties": {
"col1": 1,
"col2": "2",
"col3": "3",
"geo__code": "80001",
"geo__libelle": "Abbeville",
},
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[1.7896024, 50.106076699428435],
[1.7956428, 50.12227849942482],
[
1.8092144000000001,
50.126037899424,
],
[
1.8117727000000001,
50.14313819942021,
],
[1.8218866, 50.13531799942192],
[1.8345528, 50.140407399420795],
[1.8627332, 50.1210564994251],
[
1.8666668999999998,
50.09698379943046,
],
[
1.8742041000000003,
50.093745899431184,
],
[
1.8362959000000003,
50.07709359943491,
],
[1.7896024, 50.106076699428435],
]
],
},
},
{
"properties": {
"col1": 1,
"col2": "2",
"col3": "3",
"geo__code": "80021",
"geo__libelle": "Amiens",
},
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[2.2235574, 49.90260009947458],
[2.2378282, 49.91733499947119],
[2.2562, 49.91912209947078],
[
2.2425438999999994,
49.92329219946981,
],
[2.2763409, 49.95054869946358],
[2.2993154, 49.92835559946866],
[2.3328145, 49.9338802994674],
[2.3399056, 49.92845399946864],
[2.3314752, 49.92269669946997],
[2.3334087, 49.91097739947265],
[
2.3123479999999996,
49.89627209947603,
],
[
2.3351393999999996,
49.890537399477374,
],
[
2.3457766999999996,
49.865964499483034,
],
[
2.3265102999999994,
49.85995629948444,
],
[2.3198697, 49.84683699948748],
[
2.3124986999999995,
49.85137339948644,
],
[2.3136894, 49.86518879948323],
[
2.2957894000000003,
49.86239399948388,
],
[2.3008265, 49.87118959948182],
[2.28683, 49.863583299483615],
[2.2782859, 49.86696219948281],
[2.2815464, 49.87549559948084],
[2.2480411, 49.86993519948212],
[
2.2611062999999993,
49.876921799480485,
],
[
2.2533825999999997,
49.88061699947964,
],
[
2.2569972999999997,
49.887108999478166,
],
[2.2235574, 49.90260009947458],
]
],
},
},
],
},
"points": {
"type": "FeatureCollection",
"features": [
{
"properties": {
"col1": 1,
"col2": "2",
"col3": "3",
"geo__code": "80001",
"geo__libelle": "Abbeville",
},
"geometry": {
"type": "Point",
"coordinates": [
1.8281759618255178,
50.11356659942677,
],
},
},
{
"properties": {
"col1": 1,
"col2": "2",
"col3": "3",
"geo__code": "80021",
"geo__libelle": "Amiens",
},
"geometry": {
"type": "Point",
"coordinates": [
2.273633403662573,
49.89943609947531,
],
},
},
],
},
}
},
}
]
}
}
issue https://datahub.incubateur.tech/infrastructure/indicateurs/-/issues/297