代码之家  ›  专栏  ›  技术社区  ›  Rowland Shaw

使用sql2008空间函数,如何生成包含加积结果的多边形

  •  1
  • Rowland Shaw  · 技术社区  · 17 年前

    我有一个点表,每个点都有一个名称、纬度、经度和区号。我要做的是执行聚合(即“group by”子句),并返回包含特定区号的所有点的多边形。

    尽管如此,我还是在努力寻找是否有针对地理数据类型的内置聚合,更不用说给出边界多边形了。

    为了便于讨论,假设我有一张表,看起来有点像:

    +---------+------+---------+---------+
    | Name    | Area | Lat     | Long    |
    +---------+------+---------+---------+
    | Ipswich | A    | 52.053  |  1.156  |
    | Luton   | A    | 51.8717 | -0.4246 |
    | Melton  | A    | 52.1064 |  1.3322 |
    | Didcot  | B    | 51.6024 | -1.2321 |
    | Oxford  | B    | 51.7486 | -1.265  |
    +---------+------+---------+---------+
    

    (实际上,最小的区域有57个点,最大的626个点)

    2 回复  |  直到 11 年前
        1
  •  2
  •   stevehem    17 年前

    虽然没有内置的方法来实现这一点,但仍有可用的聚合作为 Sql Spatial Tools codeplex包。根据您的具体需要,您可能对使用边界框聚合或联合聚合感兴趣,然后调用converxhull以获取最小多边形而不是框。

        2
  •  2
  •   Undo ptrk    11 年前

    为了任何一个来到这里想要看到你得到的代码的人的利益(棒极了) Sql Spatial Tools :

    DECLARE @points TABLE
    (
     Name VARCHAR(50),
     Area CHAR(1),
     Point GEOGRAPHY
    )
    
    INSERT INTO @points VALUES ('Ipswich', 'A', geography::STGeomFromText('POINT( 1.156  52.053  )', 4326))
    INSERT INTO @points VALUES ('Luton', 'A', geography::STGeomFromText('POINT(  -0.4246 51.8717 )', 4326))
    INSERT INTO @points VALUES ('Melton', 'A', geography::STGeomFromText('POINT( 1.3322  52.1064 )', 4326))
    
    INSERT INTO @points VALUES ('Didcot', 'B', geography::STGeomFromText('POINT( -1.2321 51.6024 )', 4326))
    INSERT INTO @points VALUES ('Oxford', 'B', geography::STGeomFromText('POINT( -1.265  51.7486 )', 4326))
    
    SELECT  dbo.ConvexHullGeography(dbo.GeographyUnionAggregate(point)), 'red' as color, 1 as thickness
    FROM @points
    GROUP BY Area
    

    您可以在中查看结果 GeoQuery2008 .