To access spatial geometries using a custom transform, create a dataflow following the steps below. This process will read the geometries and save them as Well-Known Text files using Groovy scripts.
-
Create a job in Enterprise Designer and place a Read Spatial Data stage on it.
The stage is configured to read the heterogeneous geometry file and include only the Geometry field in the flow.
- Create a Transformer stage 'setGeomType' that uses a custom transform. This transform will use Groovy to get the type of IGeometry from the Geometry field and add a new field to the flow of type String that indicates the type of geometry.
def geometry = data['Geometry']
def geometryType = geometry.getType()
data['GeometryType'] = geometryType.toString()
-
Add a Conditional Router 'geomTypeRouter' to the flow. It routes fields to other parts of the flow based on the value of the GeometryType field.
-
Create custom transforms for each IGeometry you want to convert to WKT. Each port of the setGeomType router will go to a different transform.
For example, use this Groovy code to convert the IPointGeometry to a WKT POINT:
def point = data['Geometry']
data['WKT'] = 'POINT(' + point.getX() + ', ' + point.getY() + ')'
Use this Groovy code to convert the IMultiCurve into a 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()
- Connect each WKT transform stage to its own Write to File stage.
The final dataflow looks like this: