J'essaie de reproduire ce processus ArcGIS dans PostGIS: http://blogs.esri.com/esri/arcgis/2012/11/13/spaghetti_and_meatballs/ . Il décrit comment diviser les points tamponnés en polygones en fonction de leurs intersections, en comptant le nombre de couches et en l'attribuant aux polygones afin de les classer. Je l'utilise pour créer une carte de densité de points approximative avec des vecteurs, et les résultats étaient étonnamment bons pour mon ensemble de données dans ArcGIS. Cependant, j'ai du mal à trouver quelque chose de réalisable dans PostGIS où j'en ai besoin pour produire des couches de densité de points dynamiques pour une carte Web.
Dans ArcGIS, j'ai simplement exécuté l'outil Intersection sur ma couche de points tamponnés pour créer les formes dont j'avais besoin.
Dans PostGIS, j'ai exécuté cette requête:
CREATE TABLE buffer_table AS
SELECT a.gid AS gid, ST_Buffer(a.geo,.003) AS geo
FROM public.pointTable a;
CREATE TABLE intersections AS
SELECT a.gid AS gid_a, b.gid AS gid_b, ST_Intersection(a.geo,b.geo) AS geo
FROM public.pointTable a, public.pointTable b
WHERE ST_Intersects(a.geo, b.geo) AND a.gid < b.gid;
DELETE FROM intersections WHERE id_a = id_b;
La sortie semble à peu près identique à la sortie ArcGIS, sauf qu'elle ne décompose pas les polygones dans la même mesure que celle requise pour une carte de densité significative. Voici des captures d'écran de ce que je veux dire:
ArcGIS est à gauche et PostGIS à droite. C'est un peu difficile à dire, mais l'image ArcGIS montre le polygone «intérieur» créé à l'intersection des 3 tampons. En revanche, la sortie PostGIS ne crée pas ce polygone intérieur et conserve ses composants intacts. Il est donc impossible de fournir une classification uniquement pour cette zone intérieure avec 3 couches les unes sur les autres, contre 1 pour les parties extérieures.
Quelqu'un connaît-il une fonction PostGIS pour décomposer le polygone autant que je le souhaite? Sinon, quelqu'un connaît-il une meilleure façon de produire une carte de densité de points avec des vecteurs dans PostGIS?
la source
La méthode que j'ai finalement utilisée était de créer une grille en résille dans ma zone d'intérêt avec une "résolution" suffisamment élevée pour styliser et refléter les données à un degré raisonnable. Vous pouvez lire sur la fonction résille ici: Comment créer une grille polygonale régulière dans PostGIS?
Cela crée le résille avec 800 lignes, 850 colonnes, qui sont de 0,0005 radians en hauteur et en longueur (en utilisant la projection WGS84 en lat / long et sa suffisamment petite étendue géographique pour que la distorsion soit négligeable - c'est-à-dire qu'elles sont toutes déformées plus ou moins également ), puis les coordonnées en bas à gauche de la grille.
Parce que cela a créé une énorme quantité de polygones sur lesquels des requêtes seront exécutées, j'ai créé un index et mis à jour les statistiques. Cela a réduit mes requêtes typiques de 50+ secondes à 4-5 secondes.
La sous-requête compte ici le nombre d'incidents à moins de 0,002 radians (environ 220 mètres) de chaque polygone de la grille de résille, et les regroupe par la grille de résille. Cela compte effectivement le nombre de cercles qui se chevauchent jusqu'à la résolution de la grille.
La requête externe que j'ai utilisée pour réunir la valeur de comptage de chaque polygone et restreindre le nombre à 3 ou plus. Bien que l'union ne soit pas strictement nécessaire et constitue la partie la plus gourmande en ressources de la requête, elle est essentielle pour la cartographie Web car elle transforme efficacement des dizaines de milliers de polygones de grille, ce qui ne fonctionne pas trop bien en servant directement aux couches ouvertes, en multipolygones de toutes sortes de valeurs de comptage différentes (généralement quelques dizaines pour mes données).
La restriction de la valeur de comptage est une capacité importante pour les cartes de chaleur afin qu'elles ne représentent pas trop de données au point de ne pas pouvoir l'interpréter - elle a également l'utilité supplémentaire d'accélérer considérablement la requête.
Résultat final:
la source