Skip to content

Ajout d‘un indicateur liste_geo

Vincent Lara requested to merge ajout-liste-geo into main

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és geo__code et geo__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

Edited by Vincent Lara

Merge request reports