J'ai une table une table postgis d'isolignes qui est définie comme ceci:
CREATE TABLE myisolines
(
gid serial NOT NULL,
isotime timestamp without timezone,
val numeric(10,4),
geom geometry(LineString,4326)
);
Visuellement, ces objets linestring ressemblent à ceci:
Je connais l'étendue spatiale de mes données, donc je peux ajouter une Bbox, donc les LineStrings peuvent être en quelque sorte fermées.
Je veux créer une table d'isopolygones à myisopolygons
partir d'une myisolines
table, avec des polygones, qui ne se chevaucheront pas mais créeront une surface continue et auront une colonne val
avec le plus bas val
d'isolignes, à partir duquel le polygone a été formé. Je comprends qu'il peut être formé à partir d'isoline auto-fermée (îlot), ou d'isoline fermée avec bbox, dans ce cas, le val
doit être pris à partir de cette isoline particulière. Visuellement, cela devrait ressembler à ceci:
J'ai pensé que je pouvais créer la topologie d'une manière ou d'une autre, puis transformer des faces en polygones, mais je ne comprends pas comment le faire correctement. Comment cela peut-il être fait?
Une autre option serait d'utiliser récursivement une fonction de différence entre bbox et chaque polygone créé, mais je suppose que ce n'est pas la bonne façon de le faire, et certainement pas rapide du tout.
la source
Réponses:
Voici une solution utilisant
ST_Polygonize
. Il génère un polygone pour chaque frontière et fournit l'élévation min et max couverte par le polygone. L'algorithme ne peut pas distinguer entre un pic et une dépression et retournera la même élévation pour le min et le max dans ces cas.La
WITH
clause de la requête "ferme" tous les contours ouverts en les associant à l'étendue légèrement contractée des contours existants. (L'étendue est contractée pour éliminer les erreurs d'arrondi résultant de l'utilisation deST_Extent
, ce qui produit une boîte simple précision, avecST_Polygonize
, ce qui nécessite des entrées parfaitement fermées et inclinées en doulbe-précision). Si vos contours sont déjà fermés (c'est-à-dire que vous travaillez avec une île), cette étape peut être omise.la source
Je ne suis pas très expérimenté, mais j'essaierais la fonction géométrie ST_MakePolygon (géométrie ligne extérieure, ligne géométrie [] ligne intérieure);
la source
En utilisant votre bbox et en itérant sur chaque ligne de contour, vous pouvez utiliser
ST_ConcaveHull
pour convertir chaque région en polygone.la source