2

在将一系列 Shapefile 引入 SQL Server 2008R2 之后,我们希望获取表格中一系列多边形的最小和最大点。

如果没有 SQL Server 2008R2 中的 STExtent 之类的聚合函数,如何确定最小值和最大值?

这篇博文指出了一系列选项:
http ://alastaira.wordpress.com/2011/07/26/determining-the-geographic-extent-of-spatial-features-in-a-sql-server-table/

  • 选项#1:使用光标
  • 选项 #2:CLR 函数
  • 选项#3:CTE
  • 选项#4:持久信封

一个例子:

BEGIN TRAN
  CREATE TABLE #Lines
  (
    ID INT IDENTITY(1,1)
    ,Poly GEOMETRY NULL
  );

  INSERT INTO #Lines
    (Poly)
  VALUES
    (geometry::STGeomFromText('LINESTRING(0 0, 2 3)', 0));

  INSERT INTO #Lines
    (Poly)
  VALUES
    (geometry::STGeomFromText('LINESTRING(1 1, 2 4)',0));

  --How can i get the min and max x and y points?
      --(e.g. for this example Xmin = 0, Xmax = 2, Ymin = 0, Ymax = 4)


  DROP TABLE #Lines 
COMMIT
4

2 回答 2

4

如果您使用 SQL Server 2008,请使用:

select MIN((<geom_col>).STEnvelope().STPointN(1).STX) as xmin,
MAX((<geom_col>).STEnvelope().STPointN(3).STX) as xmax,
MIN((<geom_col>).STEnvelope().STPointN(1).STY) as ymin,
MAX((<geom_col>).STEnvelope().STPointN(3).STY) as ymax from <your table>;

SQL Server 2012 有一个新函数 UnionAggregate。所以另一种选择是:

select  geometry::UnionAggregate (<geom_col>).STEnvelope().STPointN(1).STX as xmin,
geometry::UnionAggregate (<geom_col>).STEnvelope().STPointN(3).STX as xmax,
geometry::UnionAggregate (<geom_col>).STEnvelope().STPointN(1).STY as ymin,
geometry::UnionAggregate (<geom_col>).STEnvelope().STPointN(3).STY as ymax from <your table>
于 2013-10-28T07:15:55.993 回答
1

我同意上述(和链接的)博客文章的作者的观点,即持久性信封是一个很好的解决方案,因为数据没有变化。

下面我编辑了示例以回答该实现的问题。

BEGIN TRAN
  CREATE TABLE #Lines
  (
    ID INT IDENTITY(1,1)
    ,Poly GEOMETRY NULL
  );

 INSERT INTO #Lines
  (Poly)
 VALUES
  (geometry::STGeomFromText('LINESTRING(0 0, 2 3)', 0));

 INSERT INTO #Lines
  (Poly)
 VALUES
  (geometry::STGeomFromText('LINESTRING(1 1, 2 4)',0));


 --Using option 4 of persisted envelopes

 ALTER TABLE #Lines
   ADD
     MinX AS (CONVERT(int, Poly.STEnvelope().STPointN((1)).STX, 0)) PERSISTED,
     MinY AS (CONVERT(int, Poly.STEnvelope().STPointN((1)).STY, 0)) PERSISTED,
     MaxX AS (CONVERT(int, Poly.STEnvelope().STPointN((3)).STX, 0)) PERSISTED,
     MaxY AS (CONVERT(int, Poly.STEnvelope().STPointN((3)).STY, 0)) PERSISTED;

 SELECT
   MIN(MinX) AS [X Minimum]
   ,MIN(MinY) AS [Y Minimum]
   ,MAX(MaxX) AS [X Maximum]
   ,MAX(MaxY) AS [Y Maximum]    
 FROM #Lines

 DROP TABLE #Lines 
COMMIT
于 2012-11-27T16:42:06.250 回答