我有一个积分表,每个积分都有一个名称,纬度,经度和区号。我想要做的是执行聚合(即“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 中查看结果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top