Reduce用の独自関数



SQL GeometryのReduceについて考える

上記の続き
とりあえずマルチカラムでジオメトリ持つにしても次元落ちは空にしたいので下記
WhereにSTDimension判定だけでも、まあ良い気がしてきたが。

Reduce1
Reduce2

関数は下記

使い方

SELECT TOP 1000
  スキーマ名.Reduce_And_RemoveOtherDimension(Shape, 1000.0, 2)
FROM
  JPN71WEB
GO

関数定義

/*
STDimension
http://technet.microsoft.com/ja-jp/library/bb933848.aspx
Point=0
LineString=1
Polygon=2

Reduce(geometry データ型)
http://technet.microsoft.com/ja-jp/library/bb933814.aspx
*/

USE MapGdb
GO
/*
面ないし線の座標を間引き、線/点など次元落ちしたものを空で返す
 引数1:入力ジオメトリ
 引数2:許容値 (単位 座標距離)
 引数3:次元 ( Inputが面なら2,線なら1)
 */
CREATE FUNCTION
 スキーマ名.Reduce_And_RemoveOtherDimension(@inputGeom GEOMETRY ,@tolerance float, @dimension int) RETURNS GEOMETRY 
AS BEGIN

  DECLARE @resultGeom GEOMETRY = GEOMETRY::STGeomFromText('POINT EMPTY', @inputGeom.STSrid);
  DECLARE @i int = 1;

  SET @inputGeom = @inputGeom.Reduce(@tolerance);

  IF @inputGeom.STIsEmpty() = 0 BEGIN
    WHILE @i <= @inputGeom.STNumGeometries() BEGIN
      IF(@inputGeom.STGeometryN(@i).STDimension() = @dimension) BEGIN
        SELECT @resultGeom = @resultGeom.STUnion(@inputGeom.STGeometryN(@i));
      END
      SET @i = @i + 1;
    END
  END
  RETURN @resultGeom;
END;
カテゴリー: 開発, 設計 タグ: パーマリンク