#1 Thu 09 April 2020 22:21
- Theos2000
- Participant assidu
- Date d'inscription: 15 Jun 2015
- Messages: 221
diviser polygone par x polygones de surface égale
Bonsoir,
je cherche a diviser une surface qui fait x m² par un nombre de surface égale de ym&, est ce qu'il y a un outil qui existe sur postgis pour faire ce genre d'opération ? J'ai vu qu'il y avait une fonction st_subdivide, mais j'ai un peu de mal à la comprendre, et je ne crois pas qu'elle renvoi des polygones égaux. Merci à vous
Hors ligne
#2 Fri 10 April 2020 11:15
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: diviser polygone par x polygones de surface égale
Bonjour,
Non, st_subdivide ne renvoie pas des polygones égaux:
elle découpe des polygones pour faire en sorte que le nombre de sommets du pg soit inférieure à la valeur passée avec subdivide (256 points par défaut)
Il n'y a pas de fonctions toutes faites pour cela dans PostGIS. Peut etre avec l'extension raster en rasterizant le polygone avec pixel = surface voulue. ?
Nicolas
Hors ligne
#3 Fri 10 April 2020 11:52
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: diviser polygone par x polygones de surface égale
Qgis a un plugin polygon divider je vois sur google, a essayer.
Nico
Hors ligne
#4 Fri 10 April 2020 15:42
- Theos2000
- Participant assidu
- Date d'inscription: 15 Jun 2015
- Messages: 221
Re: diviser polygone par x polygones de surface égale
Bonjour, oui j'ai regardé et installer une version 2.16 pour installer le plugin mais il ne fonctionne pas. Je ne sais pas comment sont geres les anciennes bibliotheque sous Qgis...c'est dommage. Merci pour l'idée
Hors ligne
#5 Sat 11 April 2020 10:52
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: diviser polygone par x polygones de surface égale
La réponse des maitres
http://blog.cleverelephant.ca/2018/06/p … tting.html
Nico
Hors ligne
#6 Sat 11 April 2020 11:41
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: diviser polygone par x polygones de surface égale
Ca peut facilement se mettre dans une fonction:
Code:
create or replace function st_dividePolygon(pg geometry, num_parts int default 10, num_points int default 4000) returns geometry[] language sql as $$ with pg_pts as ( SELECT (ST_Dump(ST_GeneratePoints(pg, num_points))).geom AS geom ), pg_pts_clustered AS ( SELECT geom, ST_ClusterKMeans(geom, num_parts) over () AS cluster FROM pg_pts ), pg_centers AS ( SELECT cluster, ST_Centroid(ST_collect(geom)) AS geom FROM pg_pts_clustered GROUP BY cluster ), pg_voronoi AS ( SELECT (ST_Dump(ST_VoronoiPolygons(ST_collect(geom)))).geom AS geom FROM pg_centers ) SELECT array_agg(ST_Intersection(pg, b.geom)) FROM pg_voronoi b; $$;
Pour calculer le nombre de morceaux, st_area(geom)/max_area
La méthode ne fabrique pas des morceaux qui ont tous la meme surface, mais ont des surfaces approchantes (ca peut qd meme varier du simple au double sur des pg a la forme complexe, quand meme )
Il existe des méthodes exactes (cf lien dans le blog de Paul Ramsey).
En image: les dept de france découpés pour avoir, pour chacun, des morceaux de surface ~ 55 km2:
(seuls les dept qui seraient découpés sont calculés)
Code:
create table deptcut_ea as with tmp as ( select gid, round(st_area(geom) / 550000000)::int as num_parts, geom from dept2154 ) select gid, num_parts, unnest(st_dividePolygon(geom, num_parts)) as geom from tmp where num_parts > 1;
Nico
Hors ligne
#7 Mon 13 April 2020 23:14
- Theos2000
- Participant assidu
- Date d'inscription: 15 Jun 2015
- Messages: 221
Re: diviser polygone par x polygones de surface égale
Whaa c'est vraiment top, merci pour le coup de main. J'arrive a diviser mon polygone mais les surfaces ne sont pas exactement les mêmes et varien entre 400m² et 1100m². Je vais voir si je peux pas utiliser un autre système que voronoi, mais en tout cas c'est une sacré avancé ! Merci pour le coup de main Nicolas ;-)
Hors ligne