Добавление LineString в MultiLineString - PullRequest
1 голос
/ 24 февраля 2009

В SQLServer 2008 я пытаюсь преобразовать две строки LineString в несколько строк LineString (предпочтительно MultiLineString), разделив их частично на основе друг друга.

L1 |---------------|
L2      |----|

=  |----|----|-----|

Думая в общих чертах, я могу получить центральную часть, используя L1.STIntersection (L2). Две другие части я могу получить с помощью L1.STSymDifference (Пересечение). Две последние части возвращаются как MultiLineString.

Как я могу добавить первую центральную часть к этой MultiLineString?

Использование STUnion приведет к единой объединенной LineString, такой как L1. Возможно, это проблема, объединяемые строки MultiLineStrings всегда должны быть объединены?

1 Ответ

0 голосов
/ 16 марта 2009

Я не могу найти ничего, что могло бы выполнить это в SQL Server 2008, но я также относительно новичок в SQL Server 2008 sql-функциях.

При работе с SQL Server 2008 я обычно проверяю форумы PostGIS и списки адресов электронной почты и вижу, как это делается (PostgreSQL-PostGIS занимается этим гораздо дольше). У кого-то, кажется, есть противоположная проблема как эта, которая, кажется, является результатом, к которому вы стремитесь.

К сожалению, нет ST_LineMerge (или STLineMerge), поэтому вам, вероятно, придется свернуть свой собственный.

Я не уверен, что эти примеры будут работать во всех случаях (а сами строки не в последовательном порядке):

select geometry::STGeomFromText(Replace(@g2.STSymDifference(@g1).ToString(),'))','),' + Replace(@g1.STIntersection(@g2).ToString(),'LINESTRING','') + ')'), @g1.STSrid).STAsText()

Вот та же логика с фактическими данными строки:

DECLARE @g1 geometry;
DECLARE @g2 geometry;
DECLARE @g3 geometry;

SET @g1 = geometry::STGeomFromText('LINESTRING(0 0, 0 20)', 0);
SET @g2 = geometry::STGeomFromText('LINESTRING(0 5, 0 10)', 0);

SELECT @g1.STIntersection(@g2).ToString();

SELECT @g1.STIntersection(@g2).STAsText();

SELECT @g2.STSymDifference(@g1).ToString();

select @g1.STIntersection(@g2).ToString();


SET @g3 = geometry::STGeomFromText(Replace(@g2.STSymDifference(@g1).ToString(),'))','),' + Replace(@g1.STIntersection(@g2).ToString(),'LINESTRING','') + ')'), @g1.STSrid);

select @g3.STAsText();
...