Étant donné une table avec une géométrie de ligne et un ou plusieurs points qui sont alignés sur cette ligne dans une table distincte, je voudrais diviser chaque ligne avec un ou plusieurs points d'intersection à chacun des emplacements où la ligne coupe un point.
Par exemple, il existe une ligne, L, avec trois points d'intersection, A, B et C dans l'ordre le long de la géométrie de la ligne. Je voudrais renvoyer L comme quatre géométries distinctes: du début de L à A, de A à B le long de L, de B à C le long de L et de C à la fin de L.
Dans le passé, j'ai utilisé galbée pour cette tâche, qui est un problème de référencement linéaire ( http://sgillies.net/blog/1040/shapely-recipes/ ). Cependant, cela ne serait pas réalisable dans ce cas, qui a plusieurs millions de lignes et de points. Au lieu de cela, je recherche une solution utilisant PostgreSQL / PostGIS.
Notez que les points sont contraints d'être sur une ligne. De plus, un point peut être valablement au début ou à la fin d'une ligne, auquel cas la ligne n'a pas besoin d'être divisée (sauf s'il y a d'autres points qui ne coïncident pas avec les points de début ou de fin de la même ligne). Les lignes de sous-ensemble doivent conserver leur direction et leurs attributs, mais les attributs des entités ponctuelles n'ont pas d'importance.
la source
IF geom_geometry_type NOT ILIKE '%LINESTRING' THEN
- je l'ai édité.ST_Split
prend en charge les lames multi * danspostgis 2.2
et au-dessus de postgis.net/docs/ST_Split.htmlMise à niveau vers PostGIS 2.2 , où ST_Split a été développé pour prendre en charge la division par une frontière multiligne, multipoint ou (multi) polygone.
la source
Je n'ai pas toute la réponse pour vous, mais ST_Line_Locate_Point prend une ligne et un point comme arguments, et renvoie un nombre compris entre 0 et 1 représentant la distance le long de la ligne jusqu'à la position la plus proche du point.
ST_Line_Substring prend une ligne et deux nombres, chacun entre 0 et 1, comme arguments. Les nombres représentent les positions sur la ligne sous forme de distances fractionnaires. La fonction renvoie le segment de ligne qui s'étend entre ces deux positions.
En travaillant avec ces deux fonctions, vous devriez pouvoir réaliser ce que vous voulez faire.
la source
On me l'a demandé deux fois maintenant, donc désolé pour le retard. Il est peu probable que cela soit considéré comme une solution laconique; Je l'ai écrit un peu plus loin dans la courbe d'apprentissage que je ne le suis actuellement. Tous les conseils sont les bienvenus, même ceux stylistiques.
la source
Je veux développer les réponses ci-dessus du point de vue d'un débutant. Dans ce scénario, vous avez une série de points et vous regardez pour les utiliser comme une "lame" pour couper des lignes en segments. Cet exemple suppose que vous avez d'abord accroché vos points à la ligne et que les points ont l'attribut ID unique de leur ligne accrochée. J'utilise 'column_id "pour représenter l'ID unique de la ligne.
Tout d'abord , vous souhaitez regrouper vos points en multipoints lorsque plus d'une lame tombe sur une ligne. Sinon, la fonction split_line_multipoint agit comme la fonction ST_Split, qui n'est pas le résultat souhaité.
Ensuite , vous souhaitez diviser votre réseau en fonction de ces multipoints.
Répétez les étapes 1 et 2 avec vos lignes qui n'ont qu'un seul point d'intersection. Pour ce faire, vous devez mettre à jour le code de l'étape 1 en 'HAVING COUNT (*) = 1'. Renommez les tables en conséquence.
Ensuite , créez un tableau de lignes en double et supprimez les entrées avec des points dessus.
Enfin , réunissez vos trois tables en utilisant
UNION ALL
:BAM!
la source