使用SQL2008 Spatial函数,如何生成包含聚合结果的多边形
-
06-07-2019 - |
题
我有一个积分表,每个积分都有一个名称,纬度,经度和区号。我想要做的是执行聚合(即“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个)
解决方案
虽然没有内置方法可以执行此操作,但有一些聚合可用作 Sql Spatial Tools的一部分 CodePlex包。根据您的需要,您可能有兴趣使用Bounding Box Aggregate或Union Aggregate,然后调用ConvexHull来获取最小多边形而不是框。
其他提示
任何到过这里的人都希望看到你所获得的代码(非常棒)的好处 Sql空间工具:
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 中查看结果。
不隶属于 StackOverflow