J'ai un ensemble de LineStrings qui sont croisées par d'autres LineStrings et je veux diviser LineString en segments séparés à ces points d'intersection. J'ai une solution mais je ne pense pas que ce soit la meilleure approche.Shapely Split LineStrings aux intersections avec d'autres LineStrings
Disons que nous avons affaire à un LineString:
>>> import shapely
>>> from shapely.geometry import *
>>> import geopandas as gpd
>>>
>>> MyLine=LineString([(0,0),(5,0),(10,3)])
>>> MyLine
<shapely.geometry.linestring.LineString object at 0x1277EEB0>
>>>
Et 2 lignes qui se croisent ce LineString:
>>> IntersectionLines=gpd.GeoSeries([LineString([(2,1.5),(3,-.5)]), LineString([(5,.5),(7,.5)])])
>>> IntersectionLines
0 LINESTRING (2 1.5, 3 -0.5)
1 LINESTRING (5 0.5, 7 0.5)
dtype: object
>>>
je peux obtenir le points d'intersection comme suit:
>>> IntPoints=MyLine.intersection(IntersectionLines.unary_union)
>>> IntPointCoords=[x.coords[:][0] for x in IntPoints]
>>> IntPointCoords
[(2.75, 0.0), (5.833333333333333, 0.5)]
>>>
Et puis-je obtenir en extraire les points de début et de fin et créer des paires avec ces et les points d'intersection qui seront utilisés pour former des segments de ligne:
>>> StartPoint=MyLine.coords[0]
>>> EndPoint=MyLine.coords[-1]
>>> SplitCoords=[StartPoint]+IntPointCoords+[EndPoint]
>>>
>>> def pair(list):
... for i in range(1, len(list)):
... yield list[i-1], list[i]
...
>>>
>>> SplitSegments=[LineString(p) for p in pair(SplitCoords)]
>>> SplitSegments
[<shapely.geometry.linestring.LineString object at 0x127F7A90>, <shapely.geometry.linestring.LineString object at 0x127F7570>, <shapely.geometry.linestring.LineString object at 0x127F7930>]
>>>
>>> gpd.GeoSeries(SplitSegments)
0 LINESTRING (0 0, 2.75 0)
1 LINESTRING (2.75 0, 5.833333333333333 0.5)
2 LINESTRING (5.833333333333333 0.5, 10 3)
dtype: object
>>>
Cependant, une question que j'ai avec mon approche est que Je sais quel point d'intersection doit être joint au point de départ LineString et quel point d'intersection doit être associé au point d'extrémité LineString. Ce programme fonctionne si les points d'intersection sont listés le long de la ligne dans le même ordre que le point de départ et le point final. J'imagine qu'il y aurait des situations où ce ne serait pas toujours le cas? Y a-t-il un moyen de généraliser cette approche ou y a-t-il une meilleure approche?
Merci, c'est génial. Vous soulevez un bon point au sujet de préserver le coin de la ligne originale - je n'avais pas pensé à cela, mais vous avez raison cela devrait être une condition. J'ai essayé d'adapter votre code pour que le coin soit inclus. Il est facile d'obtenir le coin inclus s'il est traité comme deux segments séparés (faites en sorte que la variable coords inclue toutes les coordonnées plutôt que seulement les points finaux), mais garder cela comme un seul segment semble plus compliqué. Mon approche me semble un peu compliquée - cela vous dérange-t-il de jeter un coup d'œil? – AJG519