【问题标题】:SQL Spatial number of times a Linestring intersects other Linestrings线串与其他线串相交的 SQL 空间次数
【发布时间】:2015-05-28 16:19:27
【问题描述】:

所以,我有一个名为“lines”的表,其中有一个名为“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 行是“按同一路径返回”时。在这种情况下,我想知道相交的重复线的名称。

这可能吗?

【问题讨论】:

    标签: sql-server sqlgeography


    【解决方案1】:

    当然。假设你有一个计数表(即一个从 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 就逃脱,但那是我脑海中最有意义的。

    【讨论】:

    • 第一种方法我从没想过SQL版本可能是个问题,但是在调查了您的回复后,我发现STNumCurves() 仅适用于SQL Server 2012,我正在使用SQL Server 2008(无法升级)...你觉得这个可以通过其他方法获得吗?
    • 也许吧。查看 2008 年可用的方法列表 (msdn.microsoft.com/en-us/library/bb933917%28v=sql.105%29.aspx),我们最接近的是 STGeometryN()STNumGeometries()。如果您愿意将 @DF 定义为 MULTILINESTRING 而不是 LINESTRING,则可以使这些工作。将一个转换为另一个是一种痛苦。现在 linstring def 看起来像 a → b → c,而 multilinestring 是 a → b, b → c,但是这两个定义应该是等价的。
    • 长话短说:2012 年在空间方面有了显着改进。如果您可以选择使用它,那就去做吧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多