IV- Ajouter un onglet “Mutations immobilières” à la pop-up cadastre de Lizmap

../../_images/schema_dvf_cadastre.png

Le jeu de données « Demandes de valeurs foncières », publié et produit par la direction générale des finances publiques, permet de connaître les transactions immobilières intervenues au cours des cinq dernières années. Les données contenues sont issues des actes notariés et des informations cadastrales.

Il est disponible sur le site datagouv.fr

Les fichiers correspondant chacun à un millésime sont mis à disposition au format.txt. sur cinq ans.

Les fichiers mis à disposition font l’objet d’une mise à jour semestrielle, en avril et en octobre.

A partir de ce fichier, le pôle SIG du Département du Calvados, propose de consulter l’historique des mutations immobilières et leurs valeures foncières à l’échelle d’une parcelle.

../../_images/mutation_immo.gif

1- Champ HTML historique déroulant

L’objectif est ici de pouvoir consulter l’historique des mutations immobilières et les valeurs foncières à l’échelle de la parcelle.

L’utilisateur peut en cliquant sur une parcelle, consulter les différentes mutations immobilières opérées sur la parcelle ces 5 dernières années.

Pour cela on utilise une fonction postgresql/gis pour alimenter la table parcelle_info du cadastre et une mise en forme du formulaire QGIS en HTML pour publication sur le portail cartographique Lizmap.

1.1 - Fonction postgresql/gis

  • On créé le champ contenant l’html des déroulants détaillant les filiations du plus récent au plus ancien

    ALTER TABLE cadastre.parcelle_info
    ADD column deroulant_dvf varchar;
    

On lance ensuite une fonction postgresql/gis dont le code SQL se trouve à cet endroit

  • Dans un premier temps, on sélectionne des valeurs de champs distincts pour éviter les doublons

    select  distinct on (
                a.code_ch,
                a.ref_doct,
                a.no_disposition,...
    
  • On joint les natures de cultures et cultures spéciales (créer une table à partir de la notice descriptive disponible sur le site datagouv.fr ), ainsi que les numéros de parcelles du cadastre.

      row_number() over() as id, -- creation d'un id unique
         b.geo_parcelle, b.geom, date_mutation, nature_mutation, valeur_fonciere , concat(no_voie, ' ', type_de_voie,' ', a.voie,' ', code_postal) as adresse ,
         type_local, nb_piece_princ,  surf_reelle_bati, surf_terrain,
            c.libelle as nature_culture, -- ajout de la nature culture
            d.libelle as nature_culture_speciale -- ajout de la nature culture spéciale
      from cadastre.parcelle_info b --- jointure de la tbale parcelle_info
      inner join  ref_foncier.valeurs_foncieres a
      on b.geo_parcelle = concat(concat(code_dep, '0'),
      case when length(code_com) = 1 then concat('00', code_com)
      when length(code_com) = 2 then concat('0', code_com)
      else code_com end  , pref_section,
    case when length(section) = 1 then concat('0', section)
       else  section end, no_plan)
      left join ref_foncier.valeurs_foncieres_cultures c on a.nature_culture = c.code
      left join ref_foncier.valeurs_foncieres_cultures_speciales d on a.nature_culture_speciale = d.code)
    
      pars as (select a.geo_parcelle, a.date_mutation, valeur_fonciere, nature_mutation, adresse,surf_terrain, a.type_local,a.nb_piece_princ, a.surf_reelle_bati,   a.nature_culture,  a.nature_culture_speciale
          from    parcelles_dvf a
          group by
      a.geo_parcelle, a.date_mutation, valeur_fonciere, nature_mutation, adresse,surf_terrain, a.type_local,a.nb_piece_princ, a.surf_reelle_bati, a.nature_culture,  a.nature_culture_speciale, a.surf_terrain
    
      ),
    
  • Création du champ html : bloc html + info mutation, décomposition type local + nature culture

         group_parcelle as (--- creation du champ html : bloc html + info mutation, decomposition type local + nature culture
             select a.geo_parcelle, a.date_mutation,
    
             concat('<br><details class="accordion_valeur_fonc"><summary>', nature_mutation,' / ', coalesce(valeur_fonciere,null, 'xx'),' euros <br>',
             date_mutation,'<br>',coalesce(a.adresse,null, ''), '</summary>',
             string_agg( ('<br> '|| case when a.type_local = 'Maison' then '<img class="fit-picture" src="https://raw.githubusercontent.com/sig14/sig14.github.io/main/img/house.png" width="20"'
                               when a.type_local = 'Appartement' then '<img class="fit-picture" src="https://raw.githubusercontent.com/sig14/sig14.github.io/main/img/apartment-xxl.png" width="20"'
                               when a.type_local = 'Local industriel. commercial ou assimilé' then '<img class="fit-picture" src="https://raw.githubusercontent.com/sig14/sig14.github.io/main/img/shop.png" width="20"'
                               when a.type_local = 'Dépendance' then '<img class="fit-picture" src="https://raw.githubusercontent.com/sig14/sig14.github.io/main/img/dependance.png" width="20"'
                               else '' end || '</img>     '||-- decompostion du type de local : ajout d'un lien vers image github associé selon le type
    
               concat(a.type_local,' <br>     ')
               ||case when (a.nb_piece_princ = '0' or a.nb_piece_princ is null) then ''
                else concat(a.nb_piece_princ::text, ' pièces<br>     ') end ||
               case when (a.surf_reelle_bati = '0' or a.surf_reelle_bati is null) then '' else concat(a.surf_reelle_bati::text, 'm²<br>') end), '' order by date_mutation::date DESC
               )) as html_general,
    
    
           concat(
               --- ajout de la nature terrain si present : surface terrain avec image terrain associé , null si pas de valeur de surface
          nullif(concat( '<br><br><img class="fit-picture" src="https://raw.githubusercontent.com/sig14/sig14.github.io/main/img/grass.png" width="20" </img> Terrain<br>' , surf_terrain, ' m² <br>'),
       '<br><br><img class="fit-picture" src="https://raw.githubusercontent.com/sig14/sig14.github.io/main/img/grass.png" width="20" </img> Terrain<br> m² <br>'),
    
        nullif(translate(array_agg( DISTINCT nature_culture::text )::text, '{}', '' ), 'NULL'),'<br>' --- aggregation des natures de cultures, null si pas de valeur
       , nullif(replace(translate(array_agg( DISTINCT nature_culture_speciale::text)::text, '{}', ''), 'NULL', ''), '')  --- aggregation des natures de cultures    spéciales, null si pas de valeur
          ) as html_terrain
       from pars a
       group by a.geo_parcelle, a.date_mutation, valeur_fonciere, nature_mutation, adresse,surf_terrain
          ),
    
    concatenation as (select a.geo_parcelle, a.date_mutation, concat(html_general, string_agg((html_terrain), ''), '</details>' ) as deroulant_dvf
    from group_parcelle a
    group by a.geo_parcelle, a.date_mutation, html_general)
    
  • Agréger les déroulants par parcelle et les ordonner par date de mutation

    select a.geo_parcelle, string_agg((deroulant_dvf), '' order by date_mutation::date DESC) as deroulant_dvf
    from concatenation a
    group by a.geo_parcelle;
    
  • indexation de la table, vider et updater le champ déroulant html de cadastre.parcelle_info au niveau du numéro de parcelle

    CREATE INDEX index_temp_dvf  ON temp_dvf  USING btree (geo_parcelle);
    
    update cadastre.parcelle_info set deroulant_dvf = null;
    
    update cadastre.parcelle_info set deroulant_dvf = b.deroulant_dvf from temp_dvf b where b.geo_parcelle = parcelle_info.geo_parcelle;
    

2.2 - Paramètrage Qgis/plugin Lizmap

  • Mise à jour de l’info bulle HTML dans les propriétés de la couche QGIS

../../_images/18_info_bulle_html.png

Le code HTML (onglet mutation immobilière + partie deroulant_dvf) se trouve par ici

1.3 - Rendu lizmap

  • Mise à jour du CSS dans le panneau de configuration Lizmap

Le code CSS se trouve ici

../../_images/19_config_css.png