Suite

PostGIS : Comment dissoudre les données vectorielles

PostGIS : Comment dissoudre les données vectorielles


J'ai quelques scénarios dans lesquels je dois dissoudre des données vectorielles et je me demande comment le faire à l'aide de PostGIS. À quoi ressembleraient les requêtes pour effectuer ces opérations ?

Ci-dessous, je vais décrire les différents cas à travers quelques exemples simples.

Les données réelles avec lesquelles je travaille sont considérablement plus massives et complexes que ces exemples, en réalité je travaille avec des données d'OpenStreetMap (réseaux routiers, polygones d'occupation des sols, etc.). PostGIS semble être la principale alternative pour le traitement de données lourdes.

Lignes segmentées

Les lignes sont divisées en segments de la même manière que ce qui est montré dans les deux images. La première ligne ("A-D") se compose de trois segments et a été divisée en B et C. Je souhaite dissoudre ces trois lignes individuelles pour obtenir une ligne composée des sommets A,D. (les sommets B,C sont entièrement redondants)

La deuxième ligne n'est pas très différente. Il a été divisé en E et F en trois lignes plus petites.

Dissoudre des polygones

Le deuxième problème concerne la dissolution des données polygonales. Les géométries peuvent se chevaucher ou être l'une dans l'autre, se toucher (sommets partagés) ou presque toucher avec une petite distance séparant les polygones.

Pour tous ces cas, je souhaite dissoudre les polygones dans des géométries plus grandes. Je suppose que le dernier cas où les polygones se touchent presque est un peu spécial car le petit espace entre les deux doit être "rempli".

Remarque finale

Dans les cas ci-dessus, la dissolution est uniquement basée sur des relations spatiales. Les attributs non géométriques ne sont pas pertinents.

Comme indiqué précédemment, les données réelles avec lesquelles je travaille sont assez massives et les requêtes de base devront probablement être modifiées et optimisées pour gérer des géométries très complexes.

Si quelqu'un souhaite obtenir les données présentées dans les exemples, elles peuvent être téléchargées ici en tant que GeoJSON.


Si tous vos chevauchements/touches étaient par paires, ce serait une simple auto-jointure, ce qui serait idéal pour plus d'efficacité.

La réponse par force brute est quelque chose comme :

CREATE TABLE fusionné AS SELECT (ST_Dump(ST_Union(geom)).geom AS geom FROM mytable ;

Cela prendra toutes les géométries en mémoire, les jettera dans une topologie et extraira les plus grands objets fusionnés en une seule collection de géométries, puis videra chaque élément de la collection dans sa propre ligne.

Pour des entrées suffisamment importantes, cela pourrait être terriblement lent.

Le problème est que, pour effectuer une opération de fusion plus subtile, vous devez savoir a priori quels groupes d'objets fusionner. Il y a unST_ClusterIntersectingfonction dans PostGIS 2.2 ce qui vous permet d'y arriver, mais c'est toujours un algorithme en mémoire, donc ce n'est peut-être pas idéal.


Voir la vidéo: Postgresql Tutorial 42: Ajouter des lignes