#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!
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!
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