Enregistrement de géométries à l'aide d'une transformation personnalisée

Pour accéder aux géométries spatiales à l'aide d'une transformation personnalisée, créez un flux de données en suivant les étapes ci-dessous. Ce processus lit les géométries et les enregistre sous forme de fichiers WKT (Well-Known Text) à l'aide de scripts Groovy.

  1. Créez un job dans Enterprise Designer et placez-y un stage Read Spatial Data.
    Le stage est configuré pour lire le fichier de géométries hétérogènes et inclut uniquement le champ Géométrie dans le flux.
  2. Créez un stage Transformer setGeomType utilisant une transformation personnalisée. Cette transformation utilise Groovy pour obtenir le type de IGeometry du champ Géométrie et ajoute un nouveau champ au flux de type Chaîne qui indique le type de géométrie.
    def geometry = data['Geometry']
    
    def geometryType = geometry.getType()
    
    data['GeometryType'] = geometryType.toString()
    
  3. Ajoutez un stage Conditional Router geomTypeRouter au flux. Il dirige les champs vers d'autres parties du flux en fonction de la valeur du champ GeometryType.
  4. Créez des transformations personnalisées pour chaque IGeometry que vous souhaitez convertir au format WKT. Chaque port du routeur setGeomType se dirige vers une transformation différente.

    Par exemple, utilisez le code Groovy suivant pour convertir IPointGeometry en POINT WKT :

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

    Utilisez le code Groovy suivant pour convertir IMultiCurve en MULTILINESTRING WKT :

    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. Connectez chaque stage Transformer WKT à son propre stage Write to File.
Le flux de données final se présente comme suit :