Speichern von Geometrien mit einer benutzerdefinierten Transformation

Um mithilfe einer benutzerdefinierten Transformation auf Geodaten-Geometrien zuzugreifen, erstellen Sie einen Datenfluss gemäß den folgenden Schritten. Dieser Prozess liest die Geometrien und speichert sie mithilfe von Groovy-Skripten als Well-Known-Text-Dateien.

  1. Erstellen Sie einen Auftrag im Enterprise Designer, und positionieren Sie einen „Read Spatial Data“-Schritt darauf.
    Der Schritt ist so konfiguriert, dass er die heterogene Geometriedatei liest und nur das Geometriefeld in den Fluss aufnimmt.
  2. Erstellen Sie einen Transformer-Schritt „setGeomType“, der eine benutzerdefinierte Transformation verwendet. Diese Transformation wird anhand von Groovy den Typ der IGeometry aus dem Geometriefeld abrufen und dem Fluss ein neues Feld vom Typ Zeichenfolge hinzufügen, das den Geometrietyp angibt.
    def geometry = data['Geometry']
    
    def geometryType = geometry.getType()
    
    data['GeometryType'] = geometryType.toString()
    
  3. Fügen Sie dem Fluss einen Conditional Router „geomTypeRouter“ hinzu. Dieser leitet Felder basierend auf dem Wert des Feldes „GeometryType“ an andere Teile des Flusses weiter.
  4. Erstellen Sie benutzerdefinierte Transformationen für jede IGeometry, die Sie in eine WKT-Datei umwandeln möchten. Jeder Port des setGeomType-Routers wird an eine andere Transformation geleitet.

    Verwenden Sie beispielsweise diesen Groovy-Code, um die IPointGeometry in einen WKT Point umzuwandeln:

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

    Verwenden Sie diesen Groovy-Code, um die IMultiCurve in eine WKT MULTILINESTRING umzuwandeln:

    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. Verbinden Sie jeden WKT-Transformationsschritt mit seinem eigenen „Write to File“-Schritt.
Der endgültige Datenfluss sieht wie folgt aus: