【问题标题】:combine GEOGRAPHY Points to GEOGRAPHY LINESTRING将 GEOGRAPHY 点与 GEOGRAPHY LINESTRING 结合起来
【发布时间】:2015-11-20 17:38:25
【问题描述】:

有没有一种简单的方法可以像这样组合几个 GEOGRAPHY 点:

CREATE TABLE #Points
(
    Id INT IDENTITY(1,1),
    Point GEOGRAPHY
)

到 Sql Server 2014 中的 GEOGRAPHY LINESTRING?

【问题讨论】:

    标签: sql-server tsql geospatial sql-server-2014


    【解决方案1】:

    要结合两点,你可以这样做:

    @Point1.STUnion(@Point2).STConvexHull()
    

    要创建线,点必须按顺序排列,所以像 ConvexHullAggregate 这样的东西不起作用。您可以尝试编写一个循环来按顺序组合它们,然后存储组合。

    【讨论】:

    • 谢谢。是的,循环当然是可能的。但是,我更多的是要求一种基于集合的方法。
    • 基于集合或多或少是不可能的,因为相当直接的原因。想一组点,(0,0), (1,1) (2,0) (3,1),这些点不是在一条直线上,更像是一个之字形,但是你要画的线可能从 0,0 到 2,0,然后是 3,1,然后是 1,1,作为一种向后的“C”而不是之字形。点必须是为了画一条线,这就是我建议循环的原因。
    • 当然。 Id 将在我的场景中定义顺序。只是好奇,你为什么建议使用 STConvexHull。恕我直言,这只对多边形是必需的。
    • 我得到的只是,由于在集合操作中没有考虑排序,所以它实际上是不可能的。至于 STConvexHull(),它不在我所知道的文档中,但从数学上讲,要制作一个多边形,您必须有 3 个彼此不对齐的点,所以如果不满足该条件,STConvexHull将形成一个线串,即 2 个点将形成一条线,3 个内联点将形成一条线,例如0,1 0,2 0,3
    • @csetzkorn,嘿,我刚刚想出了如何在不使用循环的情况下做到这一点。您可以将其变成一系列短线,然后使用 UnionAggregate 将它们全部组合起来 - SELECT GEOGRAPHY::UnionAggregate(Line) FROM (SELECT Point.ShortestLineTo(LEAD(Point) OVER (ORDER BY ID)) AS 'Line '从点)A
    【解决方案2】:

    另一种方法是从点的 (xy) 坐标构造字符串(通过 point.StX() 和 point.StY()),连接它们并构建描述线串的 WKT 字符串,然后将其转换为地理类型。

    【讨论】:

      【解决方案3】:

      我有一个场景,我有一些观点:

      积分

      PathId Step PointGeo
      1 1 0xE61...
      1 2 0xE61...

      我想将它们作为线串放入父表(路径;一个路径有很多点)

      路径

      PathId PathAsLineStringGeo
      1 NULL

      我写了一个写SQL的SQL:

        select
          concat(
            'update Paths set PathAsLineStringGeo = geography::STGeomFromText(''LINESTRING(',
            string_agg(cast(concat(PointGeo.Long, ' ', PointGeo.Lat) as varchar(max)), ' ') within group(order by Step),
            ')'', 4326) where PathId = ',
            PathId
          ) 
      
        from points
        group by pathid
      

      您需要调整以使其与您的上下文相关的列在 PascalCase 中

      这生成了一堆我从结果窗口复制并运行的更新语句:

      UPDATE Paths SET PathAsLineStringGeo = geography::STGeomFromText('LINESTRING(-1.22 3.44, 5.66 7.88)', 4326) where PathId = 1
      UPDATE Paths SET PathAsLineStringGeo = geography::STGeomFromText('LINESTRING(-7.89 10.11 -12.13 14.15 -16.17 18.19)', 4326) where PathId = 2
      

      没有什么能阻止你把它变成一个典型的可更新连接。也许是这样的:

      update x
      set somelinestringgeocolumn = geography::STGeomFromText(y.calculatedlinestringWKT, 4326)
      from 
      
        parent_table x
        inner join 
        (
          select
            pathId,
            CONCAT(
              'LINESTRING(',
              string_agg(cast(concat(point.Long, ' ', point.Lat) as varchar(max)), ', ') within group(order by Step),
              ')'
            ) as calculatedlinestringWKT
          from child_table_with_points
        ) y
        ON x.pathid = y.pathid
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-09
        • 1970-01-01
        • 2021-08-07
        • 1970-01-01
        • 2011-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多