Problème d'utilisation de la fonction ST_Difference

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Problème d'utilisation de la fonction ST_Difference

Claire
Bonjour,

Dans le cadre d'un projet à l'Ecole Centrale de Nantes, notre groupe doit calculer des indicateurs géographiques à appliquer à une zone urbaine découpée en mailles. Pour l'un d'entre eux, j'ai besoin de la surface vide d'une maille (tout l'espace non bâti). J'ai voulu effectuer la différence entre la géométrie de la maille et celle du bâti avec la fonction ST_Difference mais j'ai un message d'erreur.

J'utilise les requêtes suivantes :

--Calcul de l'intersection entre chaque maille et le bati (la table maillage a été créée avec la fonction ST_CreateGrid)
CREATE TABLE grilleIntersectionBati AS SELECT ST_intersection(a.the_geom,b.the_geom) AS the_geom, a.id FROM maillage a, tout_le_bati b WHERE ST_isValid(b.the_geom) AND ST_intersects(a.the_geom,b.the_geom) ;

--On ne garde que les géométries de dimension 2 (surfaces)
CREATE TABLE filterPointsAndLines AS SELECT * FROM grilleIntersectionBati WHERE ST_Dimension(the_geom) = 2;

--On effectue l'union de tous les (morceaux de) bâtiments présents dans la même maille
CREATE TABLE batiGrille AS SELECT ST_Union(the_geom) AS the_geom, id FROM filterPointsAndLines WHERE ST_isValid(the_geom) GROUP BY id;

--On soustrait à chaque maille la géométrie des bâtiments qui y sont présents
CREATE TABLE surfaceVide AS SELECT ST_Difference(a.the_geom, b.the_geom), a.id FROM maillage a, batiGrille b WHERE a.id=b.id;

La dernière requête pose problème : avec la version 4 d'OrbisGis j'obtiens le message :
ERROR [Thread-10] (ExecuteScriptProcess.java:198) - Erreur d'accès à la donnée
org.gdms.driver.DriverException: java.lang.IllegalArgumentException: This method does not support GeometryCollection arguments
(avec la version 3 la requête s'exécutait mais certaines mailles n'étaient pas calculées, à peu près 5% du total)

Est-ce parce que certains des éléments de la table batiGrille sont des POLYGON et d'autres des MULTIPOLYGON? Et comment faire pour pouvoir calculer cette différence?

J'ai aussi essayé de ne pas faire l'intersection entre la grille et le bati, et de soustraire toute la table bâti à chacune des mailles, mais la requête doit être trop volumineuse parce qu'elle ne s'exécute pas (ça affiche "exécuter le script (0%)" en bas et ça ne bouge pas)
Reply | Threaded
Open this post in threaded view
|

Re: Problème d'utilisation de la fonction ST_Difference

ebocher
Administrator
Bonjour,

Une piste :
La surface vide est juste la différence entre  la surface de la maille et la surface occupée. Or vous avez déjà la surface occupée dans la maille en découpant les bâtiments par mailles ? Inutile donc de faire un st_difference ?

Erwan