Добавление LineString в MultiLineString

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

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

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

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

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

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


person Tommy    schedule 24.02.2009    source источник
comment
Можете ли вы привести реальный пример, над которым вы работаете? Мне трудно понять, почему вы делаете что-то подобное в SQL   -  person roman m    schedule 27.02.2009
comment
Похоже, что парень на stackoverflow.com/questions/2533874/ сообщение, которое пытался сделать. (Смотрите ответ).   -  person Nordes    schedule 22.09.2010


Ответы (1)


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

Имея дело с 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();
person Community    schedule 16.03.2009