Pergunta

How can I explode linestring to line segments?

Line string like:

'LINESTRING(0 0, 2 2, 0 2, 0 5)'
Foi útil?

Solução

This is my solution!

DECLARE @g GEOMETRY
DECLARE @h GEOMETRY

SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 0 2, 0 5)', 0);
SET @h = geometry::STGeomFromText('LINESTRING(0 0, 3 3, 4 4, 0 4, 4 0, 2 1)', 0)

CREATE TABLE #Lines
(
   ID  int IDENTITY(1,1)PRIMARY KEY CLUSTERED,
   LINE GEOMETRY
)

CREATE TABLE #Segments
(
   ID  int IDENTITY(1,1)PRIMARY KEY CLUSTERED,
   LINE int,
   SEGMENT GEOMETRY
)

INSERT INTO #Lines (LINE)
SELECT @g

INSERT INTO #Lines (LINE)
SELECT @h

DECLARE @MaxNumOfPoints int 
SET @MaxNumOfPoints = (SELECT MAX(LINE.STNumPoints()) FROM #Lines)

SELECT TOP (SELECT @MaxNumOfPoints) IDENTITY(int,1,1) AS n
INTO #Numbers
FROM MASTER..spt_values a

INSERT INTO #Segments (LINE, SEGMENT)
SELECT ID, LINE.STPointN(#Numbers.n).STUnion(LINE.STPointN(#Numbers.n + 1)).STConvexHull()
FROM
 #Lines JOIN #Numbers
 ON #Numbers.n <= LINE.STNumPoints() - 1


SELECT ID, LINE, SEGMENT.ToString() FROM #Segments

DROP TABLE #Segments
DROP TABLE #Lines
DROP TABLE #Numbers
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top