#1 Thu 10 October 2013 13:57
Règle "ON INSERT DO INSTEAD"
Bonjour à tous,
J'ai dans ma base de données une table qui gère l'information relatives à des contrats.
Ces contrats concernent une ou plusieurs parcelles, dont les identifiants sont stockés dans un attribut de type int[]
Cette table n'est pas spatialisée. J'utilise pour la spatialiser et la renseigner depuis QGis une vue qui contient l’ensemble des colonnes de cette table et en plus l'union des géométries des parcelles concernées.
Le problème que je rencontre se situe au niveau de la règle appliquée lors de l'insertion d'un enregistrement à ma vue.
Mon objectif est de calculer la liste des parcelles concernée grâce à la géométrie de l'objet dessiné dans QGIS.
Ceci fonctionne :
Code:
CREATE OR REPLACE RULE insert_emprise_echeance_contrat AS ON INSERT TO administratif.emprise_et_echeance_contrat DO INSTEAD INSERT INTO administratif.contrat (signataires, date_debut, duree, tacite_reconduction, date_fin, notaire, lien_convention_pdf, type_contrat, parcelles_concernees, site_concerne, remarque) VALUES (new.signataires, new.date_debut, new.duree, new.tacite_reconduction, new.date_fin, new.notaire, new.lien_convention_pdf, new.type_contrat, (SELECT array_agg(distinct id_parcelle) FROM foncier.parcelle_cadastrale WHERE st_intersects(parcelle_cadastrale.geometrie, new.geometrie)), new.site_concerne, new.remarque);
Mais n'est pas tout à fait juste. Pour cela il faudrait que la liste des parcelles concernées soit calculée à partir de l'intersection entre l'objet que j'ai dessiné, et les centroïdes des parcelles sous-jacentes.
Cette règle ne fonctionne pas (champ vide à l'issue de l'insertion) :
Code:
CREATE OR REPLACE RULE insert_emprise_echeance_contrat AS ON INSERT TO administratif.emprise_et_echeance_contrat DO INSTEAD INSERT INTO administratif.contrat (signataires, date_debut, duree, tacite_reconduction, date_fin, notaire, lien_convention_pdf, type_contrat, parcelles_concernees, site_concerne, remarque) VALUES (new.signataires, new.date_debut, new.duree, new.tacite_reconduction, new.date_fin, new.notaire, new.lien_convention_pdf, new.type_contrat, (SELECT array_agg(distinct id_parcelle) FROM foncier.parcelle_cadastrale WHERE st_intersects(st_centroid(parcelle_cadastrale.geometrie), new.geometrie)), new.site_concerne, new.remarque);
J'ai l'impression de tourner autour d'une évidence mais je ne trouve pas.
Merci d'avance pour votre aide éventuelle!
Mathieu BOSSAERT
Association GeoRezo
Hors ligne
#2 Thu 10 October 2013 14:36
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Règle "ON INSERT DO INSTEAD"
Bonjour,
N'est-ce pas dû à la conformation des données ?
Des polygones peuvent se recouper sans que le centroid de l'un n'intersecte l'autre polygone.
D'autre part, dans le cas de polygones a trou ou de polygones en demie lune par exemple, le centroid de la surface ne sera pas contenu dans la surface.
Peut etre que st_pointOnSurface(geom) marcherait mieux: un point garantit d'etre contenu dans la geom.
Nicolas
Hors ligne
#3 Thu 10 October 2013 14:58
Re: Règle "ON INSERT DO INSTEAD"
Merci Nicolas,
j'avais écarté ce problème en affichant les centroïdes de mes polygones, qui ne sont en outre pas complexes, ou en dessinant par exemple un objet qui englobe les deux parcelles qui m'intéressent.
Par acquis de conscience je viens de tester avec st_point_on_surface(geometrie) et j'ai obtenu la même "absence de résultat".
Mathieu BOSSAERT
Association GeoRezo
Hors ligne
#4 Thu 10 October 2013 15:00
Re: Règle "ON INSERT DO INSTEAD"
En creusant un peu plus j'ai trouvé la source de mon problème!
Cela vient des options d'accrochage de QGis.
Une autre couche du projet interdisait les intersections ert donc modifiait la géométrie que je dessinais.
Merci encore.
Mathieu.
Mathieu BOSSAERT
Association GeoRezo
Hors ligne