SQL 线串与其他线串相交的空间次数
SQL Spatial number of times a Linestring intersects other Linestrings
所以,我有一个名为 "lines" 的 table,它有一个名为 "WKT" 的字段和相应的地理位置。
我构建了一个查询,为我提供相交线的名称,如下所示:
DECLARE @DF GEOGRAPHY
Set @DF=GEOGRAPHY::STLineFromText('LINESTRING(-9.564498 52.237100,-9.564906 52.243924,-9.565699 52.245563,-9.568173 52.251014,-9.567142 52.257567,-9.564291 52.262366,-9.563453 52.262972,-9.563447 52.262980,-9.563447 52.262980,-9.563447 52.262980)', 4326)
select name, @DF.STIntersects(WKT) AS inters
from lines WHERE @DF.STIntersects(WKT)=1
而且效果很好。有问题的情况是当此 @DF 行是 "go and return by the same path" 时。在这种情况下,我想知道相交的重复线的名称。
这可以吗?
当然可以。假设您有一个计数 table(即一个 table,其中数字 1 到某个大数):
DECLARE @DF GEOGRAPHY
Set @DF=GEOGRAPHY::STLineFromText('LINESTRING(-9.564498 52.237100,-9.564906 52.243924,-9.565699 52.245563,-9.568173 52.251014,-9.567142 52.257567,-9.564291 52.262366,-9.563453 52.262972,-9.563447 52.262980,-9.563447 52.262980,-9.563447 52.262980)', 4326)
WITH cte AS (
SELECT n, @DF.STCurveN(n) AS curve
FROM dbo.Numbers
WHERE n <= @DF.STNumCurves()
)
select name, @DF.STIntersects(WKT) AS inters
from lines AS l
JOIN cte AS c
ON l.WKT.STIntersects(c.curve) = 1
我敢肯定,您可以在不使用 CTE 的情况下逃脱,但那是我脑海中最有意义的事情。
所以,我有一个名为 "lines" 的 table,它有一个名为 "WKT" 的字段和相应的地理位置。
我构建了一个查询,为我提供相交线的名称,如下所示:
DECLARE @DF GEOGRAPHY
Set @DF=GEOGRAPHY::STLineFromText('LINESTRING(-9.564498 52.237100,-9.564906 52.243924,-9.565699 52.245563,-9.568173 52.251014,-9.567142 52.257567,-9.564291 52.262366,-9.563453 52.262972,-9.563447 52.262980,-9.563447 52.262980,-9.563447 52.262980)', 4326)
select name, @DF.STIntersects(WKT) AS inters
from lines WHERE @DF.STIntersects(WKT)=1
而且效果很好。有问题的情况是当此 @DF 行是 "go and return by the same path" 时。在这种情况下,我想知道相交的重复线的名称。
这可以吗?
当然可以。假设您有一个计数 table(即一个 table,其中数字 1 到某个大数):
DECLARE @DF GEOGRAPHY
Set @DF=GEOGRAPHY::STLineFromText('LINESTRING(-9.564498 52.237100,-9.564906 52.243924,-9.565699 52.245563,-9.568173 52.251014,-9.567142 52.257567,-9.564291 52.262366,-9.563453 52.262972,-9.563447 52.262980,-9.563447 52.262980,-9.563447 52.262980)', 4326)
WITH cte AS (
SELECT n, @DF.STCurveN(n) AS curve
FROM dbo.Numbers
WHERE n <= @DF.STNumCurves()
)
select name, @DF.STIntersects(WKT) AS inters
from lines AS l
JOIN cte AS c
ON l.WKT.STIntersects(c.curve) = 1
我敢肯定,您可以在不使用 CTE 的情况下逃脱,但那是我脑海中最有意义的事情。