2

一連のシェープファイルを SQL Server 2008R2 に取り込んだ後、テーブル内の一連のポリゴンの最小ポイントと最大ポイントを取得しようとしています。

SQL Server 2008R2 の STExtent のような集計関数がなければ、最小ポイントと最大ポイントをどのように決定できますか?

このブログ投稿では、一連のオプションを示しています。

  • オプション #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 に答える