Cómo guardar geometrías con una transformación personalizada

Para acceder a las geometrías espaciales con una transformación personalizada, cree un flujo de datos mediante los siguientes pasos. Este proceso leerá las geometrías y las guardará como archivos Well-Known Text mediante secuencias de comandos Groovy.

  1. Cree un trabajo en Enterprise Designer y coloque una etapa Read Spatial Data en este.
    La etapa se configura para que lea el archivo de geometría heterogénea e incluya solo el campo Geometría en el flujo.
  2. Cree una etapa Transformer 'setGeomType' que use una transformación personalizada. Esta transformación usará Groovy para obtener el tipo de IGeometry desde el campo Geometría y agregará un nuevo campo en el flujo de tipo Cadena de caracteres que indique el tipo de geometría.
    def geometry = data['Geometry']
    
    def geometryType = geometry.getType()
    
    data['GeometryType'] = geometryType.toString()
    
  3. Agregue Conditional Router 'geomTypeRouter' al flujo. Enruta los campos a otras partes del flujo según el valor del campo GeometryType.
  4. Cree transformaciones personalizadas para cada IGeometry que desee convertir a WKT. Cada puerto del enrutador setGeomType irá a una transformación distinta.

    Por ejemplo, use este código Groovy para convertir IPointGeometry a un WKT POINT:

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

    Use este código Groovy para convertir IMultiCurve en 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. Conecta cada etapa de transformación WKT a su propia etapa Write to File.
El flujo de datos final tiene la siguiente apariencia: