カスタム トランスフォームでのジオメトリの保存
カスタム トランスフォームを使用して空間ジオメトリにアクセスするには、以下の手順に従ってデータフローを作成します。 このプロセスは、Groovy スクリプトを使用して、ジオメトリを読み取り、Well-Known Text (WKT) ファイルとして保存します。
-
Enterprise Designer でジョブを作成し、Read Spatial Data ステージをそれに配置します。
ステージは、異種ジオメトリ ファイルを読み込むように設定され、フローにはジオメトリ フィールドのみを含みます。
- カスタム トランスフォームを使用する Transformer ステージ 'setGeomType' を作成します。 このトランスフォームは、Groovy を使用して、ジオメトリ フィールドから IGeometry のタイプを取得し、ジオメトリのタイプを示す新しい文字列タイプのフィールドをフローに追加します。
def geometry = data['Geometry'] def geometryType = geometry.getType() data['GeometryType'] = geometryType.toString()
- Conditional Router 'geomTypeRouter' をフローに追加します。 このルータは、ジオメトリ タイプ フィールドの値に基づいて、フローの他の部分にフィールドを送ります。
-
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()
- 各 WKT トランスフォーム ステージを専用の Write to File ステージに接続します。
最終的なデータフローは次のようになります。