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 19 August 2013 14:51

Samy-DT
Participant assidu
Date d'inscription: 5 Apr 2011
Messages: 211

Optimisation de requête sous QSpatialite

Bonjour,

Je souhaite faire une requête qui calcul le pourcentage d'espaces protégés sur une zone d'étude.

Pour l'instant j'ai écrit quelque chose comme ça :

Code:

SELECT  intersects( "couche1".'Geometry',   "zonedetude".'Geometry' ) As int, SUM(AREA( "couche1".'Geometry')/10000) As Surface_ha 
FROM "couche1" , "zonedetude" 
WHERE int= 1
UNION
SELECT intersects( "couche2".'Geometry',  "zonedetude".'Geometry') As int2, SUM(AREA("couche2".'Geometry' )/10000) FROM  "couche2", "zonedetude"  where  "couche2".'type' ='toto' AND int2=1

Ce qui me donne les surfaces pour chaque couche de protection environnementale. J'en créé une vue, puis je calcul ensuite la somme des surfaces que je divise par la surface de la zone d'étude et que je multiplie par 100.

Mes questions sont les suivantes :

1. N'est-il pas possible de dire que le test d'intersection de la "couche1" avec la "zonedetude" est valable pour tout le reste de la requête ? (genre with ?)

2. N'est-il pas possible de faire la somme des surfaces et le calcul de % au sein de la première requête ?

Merci pour votre aide !

A+

Hors ligne

 

#2 Mon 19 August 2013 16:02

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3941

Re: Optimisation de requête sous QSpatialite

Bonjour,
Je ne connais pas du tout Spatialite (notamment pour ce qui est de l'usage des guillemets et nom de fonction) mais bon ... Si j'ai bien compris, tu fais un premier test de vérification de l'intersection et récupère la surface de l'objet qui serait sur ta zone d'étude. Mais il me semble que tu récupères la surface de tout l'objet, pas juste la partie commune entre lui et ta zone; ce qui serait possible avec la fonction intersection (Intersects vérifie si oui ou non les objets se chevauchent alors que Intersection récupère la géométrie des recouvrements donc ne prend en compte que les objets qui se chevauchent)

Code:

select intersection ("couche1".'Geometry', "zonedetude".'Geometry') as geometry, area(intersection ("couche1".'Geometry', "zonedetude".'Geometry'))/10000 as surface_ha
from "couche1" , "zonedetude"

on récupère ainsi au sein de la zone d'étude, pour chaque périmètre en chevauchement la géométrie et la surface de l'espace protégé.
je pense qu'on pourrait même faire

Code:

select Gunion(intersection ("couche1".'Geometry', "zonedetude".'Geometry')) as geometry, sum(area(intersection ("couche1".'Geometry', "zonedetude".'Geometry'))/10000 ) as surface_ha, sum(area(intersection ("couche1".'Geometry', "zonedetude".'Geometry')))*100/area("zonedetude".'Geometry') as proportion
from "couche1" , "zonedetude"
group by type

(type étant ici considéré comme le champ discriminant dans tes traitements, on agrège par type d'espaces, la géométrie en commun avec la zone d'étude, la surface correspondante et le pourcentage que l'ensemble représente sur cette zone d'étude).

Pour ce qui est de la question

Samy-DT a écrit:

1. N'est-il pas possible de dire que le test d'intersection de la "couche1" avec la "zonedetude" est valable pour tout le reste de la requête ? (genre with ?)


Difficile à dire si on ne connait pas le lien entre "couche1" et "couche2". Mais peut-être effectivement qu'un

Code:

with couches as 
select id, type, geometry from "couche 1"
union 
select id, type, geometry from "couche 2" where type='toto'
...

ferait l'affaire (pour autant que tu trouves les champs compatibles dans les couches que tu associes)? Et alors, utiliser cette nouvelle table "couches" dans la requête plus haut.

PS: J'ai cherché mais je n'ai pas vraiment compris si oui ou non les fonctions GUnion (st_union?) et Intersection (st_intersection?) étaient opérationnels ou non dans Spatialite. Mais quoiqu'il en soit, j'espère que tu trouveras un début de piste dans mon message.

Dernière modification par SANTANNA (Mon 19 August 2013 16:06)

Hors ligne

 

Pied de page des forums

Powered by FluxBB