Compter des élements dans un buffer

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

Compter des élements dans un buffer

quentindarakdjian
Bonjour,

Je souhaite étudier les effets de masques des batiments sur chaque batiments d'un quartier.

Pour cela une des pistes étudiée est de créer un buffer autour de chaque batiment (pas de problème) puis ensuite de compter le nombre de batiments qui se trouvent dans cette zone. C'est la que ca se complique, j'ai bien penser à la fonction 'count' mais je ne suis pas sur qu'il faille passer par la.

Pouvez vous me donner un petit coup de pouce?

Cordialement

Quentin
Reply | Threaded
Open this post in threaded view
|

Re: Compter des élements dans un buffer

Gwendall Petit
Administrator
Bonjour Quentin,

Si ta question est de compter le nombre de bâtiment qui sont dans un certain rayon autour de chaque bâtiment,  alors tu peux tenter l'approche suivante :
-- Tu génères un buffer (ici de 50 mètres) autour de chaque bâtiment et en plus tu récupères l'identifiant du bâtiment
CREATE TABLE buffer AS SELECT ST_BUFFER(the_geom, 50) AS the_geom, ID FROM BATI;

-- Tu fais une jointure entre les deux tables en ne gardant que les couples qui s'intersectent
CREATE TABLE join_intersect AS SELECT a.the_geom, a.ID, b.ID as ID_buff FROM BATI a, buffer b WHERE ST_INTERSECTS(b.the_geom, a.the_geom);

-- Tu regroupes les précédents éléments via le numéro du bâtiment.
-- Pour cela, on fait :
-- * une union des géométries identiques (à ne faire que si tu souhaites conserver la géométrie de ton bâtiment dans cette table)
-- * le compte des bâtiments compris dans la zone autour du bâtiment, en prenant soins d'enlever le dit bâtiment ( moins 1)
CREATE TABLE final AS SELECT ST_UNION(the_geom) as the_geom, ID, (count(ID_buff)-1) as nb_bat FROM join_intersect GROUP BY ID;
J'ai fait un test et cela semble bien fonctionner.

Cordialement,

Gwendall
Reply | Threaded
Open this post in threaded view
|

Re: Compter des élements dans un buffer

quentindarakdjian
Ca marche parfaitement! Merci Gwendall
Reply | Threaded
Open this post in threaded view
|

Re: Compter des élements dans un buffer

quentindarakdjian
Bonjour, finalement je reviens sur cette partie!

Dans ce travail les buffers générés correspondent aux ombres des bâtiments. Du coup, il est intéressant de les différentier par leur positions respective. Un bâtiment A qui se trouve au nord d'un bâtiment B ne lui fera à priori pas d'ombre alors que B peut ombrager A.

En reprenant le cœur de requête de Gwendall voici les étapes que j'imagine:

-- Création d'un table avec les buffers de chaque bâtiment (la taille du buffer est égale à la hauteur du bâtiment)
CREATE TABLE bufferbati AS SELECT ST_Buffer(the_geom, 3*3*etages) as the_geom, ID FROM attributs;

-- Détermination du centre de gravité de chaque bâtiment
CREATE TABLE centerbuilding as select ST_Centroid(the_geom) as the_geom from attributs;

-- jointure entre les deux tables en ne gardant que les couples qui s'intersectent
CREATE TABLE join_intersect AS SELECT a.the_geom, a.ID, b.ID as ID_buff FROM attributs a, bufferbati b WHERE ST_INTERSECTS(b.the_geom, a.the_geom);

-- Ajout de la condition qui supprime les buffers dont le centre de gravité de leur batiment se trouve au nord du centre de gravité du bâtiment étudié.
Q1: C'est ici que je coince, je ne trouve pas la fonction SQL adaptée!

-- Compte des bâtiments compris dans la zone autour du bâtiment, en prenant soins d'enlever le dit bâtiment (moins 1), les bâtiments au nord ne sont plus compter
CREATE TABLE final AS SELECT ST_UNION(the_geom) as the_geom, ID, (count(ID_buff)-1) as nb_bat FROM join_intersect GROUP BY ID;

-- Suppression des bâtiments mitoyen dans le compte.
CREATE TABLE buildingobstruction AS SELECT final.*, attributs.NB_MITOYEN FROM final, attributs WHERE final.ID=attributs.ID;
ALTER TABLE buildingobstruction ADD COLUMN nb_obstruction DOUBLE;
UPDATE buildingobstruction SET nb_obstruction=nb_bat-NB_MITOYEN;

Q2: Je dois en fait supprimer que le bâtiment mitoyen qui se trouve au sud. J'imagine que la fonction SQL est la même qu'à Q1

Désolé pour la longeur du message, mais j'espère avoir été clair sur mon problème

Cordialement
Reply | Threaded
Open this post in threaded view
|

Re: Compter des élements dans un buffer

Gwendall Petit
Administrator
Ton problème n'est vraiment pas simple.

Selon moi il y a déjà un soucis au niveau de la définition des contraintes qui vont te servir ensuite à construire la méthode. Dans ta question 1/, tu parles de "supprimer les buffers dont le centre de gravité de leur batiment se trouve au nord du centre de gravité du bâtiment étudié"
Qu'est-ce que le nord ? Est-ce une direction fixe ou bien une plage d'angle (entre -45° et 45°) ? cf illustration



Si je trouve une idée, je te relancerai. Mais pour l'instant je sèche.

Cordialement,

Gwendall
Reply | Threaded
Open this post in threaded view
|

Re: Compter des élements dans un buffer

quentindarakdjian
Bonjour,

Quand je dis "supprimer les buffers" je pense plutôt à "ne pas les compter".

Il est vrai que je n'ai pas défini le nord. J'ai initialement pensé à créer une ligne virtuelle Est-Ouest (-90° à 90°) car j'imaginais que ca serai le plus facile à modéliser. En revanche, à la vue de ta deuxième figure, je réalise que la plage d'angle (-45° à 45°) est surement plus réaliste à ma situation. En effet, le quartier étudié est à Nantes c'est à dire à une latitude de 47° Nord et la modélisation a lieu d'octobre à mai, (en hiver le soleil se lève à l'Est/Sud pour se coucher à l'Ouest/Sud). Donc à voir ce qui est possible, mais la plage -90/90° me conviendrai également dans le cas où la comparaison entre 2 position serai possible.

En tout cas merci de réfléchir avec moi à ce problème.

Quentin