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