banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Mon 22 August 2022 16:54

Theos2000
Participant assidu
Date d'inscription: 15 Jun 2015
Messages: 221

recuperer parcelle via le cadastre

Bonjour,

Mon but est de trouver les parcelles les plus proches d'un fichier de point assez mal géolocalisé.

J'ai attribuer chaque point a un point adresse du cadastre en fonction de sa proximité...mais je galère a récupérer pour récupérer les parcelles

J'utilise pour cela la colonne geo_numvoie de la table ref_cadastre.geo_numvoie que je met en lien avec la table ref_cadastre.geo_numvoie_parcelle  mais j'ai pas mal d'éléments manquants sur la jointure  (moitié)

Le cadastre a été intégré via le plugin Qgis et je ne comprend pas pourquoi il y a autant de valeurs null sur la jointure entre la partie point adresse et la partie parcelle.

Est ce que vous connaissez une autre méthode pour récupérer les parcelles correspondant a l'adresse a partir d'un groupe de point ?

Je met la requête utilisé si ca peut aider pour une réponse.

Merci

Code:

with tmp as
(
SELECT
  a.geo_numvoie AS adrid,
  a.*,
  t.batid,
  t.dist
FROM ref_cadastre.geo_numvoie as a
  CROSS JOIN LATERAL
             (SELECT
                "numéro_d_immatriculation" as batid,
                st_distance(b.geom, a.geom) AS dist
              FROM pers_xxx.registre as b
              ORDER BY a.geom <-> b.geom
              LIMIT 1) AS t
ORDER BY adrid, t.dist
),
tmp1 as 
(
    SELECT
      t.*,
      row_number()
      OVER (
        PARTITION BY t.batid
        ORDER BY t.dist ) AS rn
    FROM tmp t
) 
select tmp1.*,parc.geo_parcelle
batid,parc.geo_numvoie_parcelle,tmp1.geo_numvoie
from tmp1

left join ref_cadastre.geo_numvoie_parcelle as parc on parc.geo_numvoie_parcelle = tmp1.geo_numvoie
where rn = 1 
--and geo_numvoie_parcelle is null
order by dist desc

Dernière modification par Theos2000 (Tue 23 August 2022 10:23)

Hors ligne

 

#2 Wed 31 August 2022 12:14

sylvainSIG
Participant assidu
Lieu: Moissac
Date d'inscription: 29 Nov 2018
Messages: 265

Re: recuperer parcelle via le cadastre

Salut,

Le mieux est encore de faire un buffer sur ce point en question.
L'adresse importe peu me semble-t-il.

Si tu souhaites remonter les 5 parcelles les plus proches de ce point :

Code:

WITH req as
(
SELECT
st_buffer(d.geom::geography,20) as geom //attention à la projection, caster en :geography te permet de travailler sur une projection et donc en mètres (pour rappel EPSG:4326 n'est pas une projection mais un système géodésique) 

FROM
schema.tacouchedepoint d
)
SELECT
id_parcelle, id_section etc.
FROM
schema.tatablecadastre f,
req
WHERE
st_intersects(req.geom, f.geom)
LIMIT 5

Voila, mais je ne suis pas sur d'avoir compris totalement ta question,

A+

Sylvain

Hors ligne

 

#3 Tue 06 September 2022 18:57

Mathieu Denat
Participant actif
Lieu: Montpellier
Date d'inscription: 5 May 2010
Messages: 110

Re: recuperer parcelle via le cadastre

Bonsoir,
J'ai compris comme Sylvain! smile
Juste un petit complément, il me semble me souvenir que lorsqu'on compare des tables entre-elles il vaut mieux utiliser JOIN et garder WHERE pour interroger une table.
Il me semble que c'est une histoire d'optimisation des ressources si ma mémoire est bonne (pour forcer l'utilisation des index geométrique?).
Bref, j'ai oublié pourquoi mais il est conseillé d'utiliser JOIN plutôt que WHERE.
Ce qui donnerait

Code:

WITH req as (
    SELECT
    st_buffer(d.geom::geography,20) as geom /* attention à la projection, caster en ::geography te permet de travailler sur une projection et donc en mètres (pour rappel EPSG:4326 n'est pas une projection mais un système géodésique) */
    FROM schema.tacouchedepoint d
    )

SELECT
    id_parcelle,
    id_section etc.
FROM schema.tatablecadastre f
JOIN req ON st_intersects(req.geom, f.geom) /* c'est ici qu'on contrôle que l'intersection entre les couches) */
LIMIT 5

Bonne continuation.

@Nicolas Ribot: si tu passes par là il me semble que c'est un souvenir d'une formation que tu as donnée! Un petit rappel ne me fera pas de mal! wink


Mathieu
C'est en forgeant qu'on devient forgeron

Hors ligne

 

#4 Wed 07 September 2022 09:41

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: recuperer parcelle via le cadastre

Bonjour,

En terme de performance ou d'utilisation d'index, c'est équivalent de faire "from table a join table b on st_intersects(....)" ou "from table a, b where st_intersects(....)

C'est surtout plus logique et plus clair (je trouve) de séparer les conditions de jointure entre tables (avec des JOIN) de condition de filtres sur des valeurs de colonnes (where colonne = val).

Dans votre exemple, il n'est pas nécessaire de créer un buffer autour des points si on veut juste tester la distance entre points et parcelles: c'est lourd de fabriquer des buffers, et surtout, le faisant dans une CTE, ces buffers ne sont pas indexés et seul l'index sur les parcelles peut etre utilisé par le planner.

Il faut mieux utiliser la fonction st_dwithin (distance within), qui permet de faire la requete directement et d'avoir des index disponibles pour la table point et la table parcelle:

Code:

select pt.id, parc.id 
from point pt join parcelle parc on st_dwithin(pt.geom, parc.geom, 20);

Attention, qd vous faites "limit 5", ca va limiter le résutat aux 5 premiers points traités, ca ne vas pas donner 5 parcelles par point.

Nicolas

Hors ligne

 

Pied de page des forums

Powered by FluxBB