カスタム トランスフォームでのジオメトリの保存

カスタム トランスフォームを使用して空間ジオメトリにアクセスするには、以下の手順に従ってデータフローを作成します。このプロセスは、Groovy スクリプトを使用して、ジオメトリを読み取り、Well-Known Text (WKT) ファイルとして保存します。

  1. Enterprise Designer でジョブを作成し、Read Spatial Data ステージをそれに配置します。
    ステージは、異種ジオメトリ ファイルを読み込むように設定され、フローにはジオメトリ フィールドのみを含みます。
  2. カスタム トランスフォームを使用する Transformer ステージ 'setGeomType' を作成します。このトランスフォームは、Groovy を使用して、ジオメトリ フィールドから IGeometry のタイプを取得し、ジオメトリのタイプを示す新しい文字列タイプのフィールドをフローに追加します。
    def geometry = data['Geometry']
    
    def geometryType = geometry.getType()
    
    data['GeometryType'] = geometryType.toString()
    
  3. Conditional Router 'geomTypeRouter' をフローに追加します。このルータは、ジオメトリ タイプ フィールドの値に基づいて、フローの他の部分にフィールドを送ります。
  4. WKT に変換する各 IGeometry に対してカスタム トランスフォームを作成します。setGeomType ルータの各ポートは、異なるトランスフォームと結び付いています。

    例えば、次の Groovy コードを使用すると IPointGeometry が WKT POINT に変換されます。

    def point = data['Geometry']
    
    data['WKT'] = 'POINT(' + point.getX() + ', ' + point.getY() + ')'
    

    次の Groovy コードを使用すると、IMultiCurve が WKT MULTILINESTRING に変換されます。

    def multiCurve = data['Geometry']
    
    def wkt = new StringBuffer('MULTILINESTRING (')
    
    def dp = new com.mapinfo.midev.geometry.DirectPosition()
    
    multiCurve.each {com.mapinfo.midev.geometry.ICurve curve ->
      wkt << '('
    
      def lineString = curve.asLineString()
      
      lineString.each{curveSegment ->
        def controlPointIterator = curveSegment.getControlPointIterator()
        while (controlPointIterator.hasNext()) {
          controlPointIterator.nextDirectPosition(dp)
          wkt << dp.getX() << ', ' << dp.getY() << ','
        }
      }
      
      wkt.setCharAt(wkt.size() - 1, (char)')')
    }
    
    wkt << ')'
    
    data['WKT'] = wkt.toString()
    
  5. 各 WKT トランスフォーム ステージを専用の Write to File ステージに接続します。
最終的なデータフローは次のようになります。