首页 > 解决方案 > 计算直线与直线相交的距离

问题描述

我希望我在这里有足够的细节来说明问题!

我在列中创建了一个包含 Geom Lines 的表。该表是使用这些输入填充的:

INSERT INTO tblLines ("geomLines") VALUES (geometry::STGeomFromText('LINESTRING (10 15, 100 100, 120 79, 90 40, 80 5)', 0));
INSERT INTO tblLines ("geomLines") VALUES (geometry::STGeomFromText('LINESTRING (75 25, 50 150, 120 120, 135 40)', 0));

导致表 tblLines 看起来像:

fidID     geomLines
1         wkt
2         wkt

然后我在飞线 AB 上创建了:

SET @AB = geometry::STGeomFromText('LINESTRING (60 40, 100 140)', 0);

所以总结一下我的所有数据如下所示:

在此处输入图像描述

我现在可以使用以下方式查询:

DECLARE @AB GEOMETRY = geometry::STGeomFromText('LINESTRING (60 40, 100 140)', 0);
DECLARE @A GEOMETRY = geometry::STGeomFromText('POINT (60 40)', 0);
-- Combined multipoint value
DECLARE @ABINT GEOMETRY = (SELECT  GEOMETRY::UnionAggregate(@AB.STIntersection(geomLines)) FROM tblLines WHERE @AB.STIntersects ( geomLines ) = 1);

SELECT * 
FROM tblLines
WHERE @ABINT.STDistance(geomLines) < 0.01
ORDER BY @A.STDistance(@ABINT) ASC;

这对 AB 交叉的线产生了相当不错的总结,但它确实在两件事上失败了:

1 - 它没有像“2”那样显示重复项

2 - @A.STDistance(@ABINT) 始终是从 A 到第一个多点的测量值,而不是我希望的每个多点。

我希望能做到这一点:

[Intersected Line] [Distance along AB]
2                  18
1                  25
2                  60

有没有人有任何提示?

标签: sqlsql-server

解决方案


测试数据

CREATE TABLE #tblLines( geomLines GEOMETRY )
INSERT INTO #tblLines (geomLines) VALUES (geometry::STGeomFromText('LINESTRING (10 15, 100 100, 120 79, 90 40, 80 5)', 0));
INSERT INTO #tblLines (geomLines) VALUES (geometry::STGeomFromText('LINESTRING (75 25, 50 150, 120 120, 135 40)', 0));

解决方案

DECLARE @AB GEOMETRY = geometry::STGeomFromText('LINESTRING (60 40, 100 140)', 0);
-- Combined multipoint value
SELECT  GEOMETRY::UnionAggregate(@AB.STIntersection(geomLines)) FROM #tblLines WHERE @AB.STIntersects ( geomLines ) = 1

归功于https://stackoverflow.com/a/8247981/6305294


推荐阅读