#! #! postgis.train.safe.comfmedata" # # #! DESTINATION="NONE" #! END_PYTHON="" #! IGNORE_READER_FAILURE="No" #! LAST_SAVE_DATE="2015-06-10T16:38:13" #! ATTR_TYPE_ENCODING="SDF" #! USAGE="" #! MULTI_WRITER_DATASET_ORDER="BY_ID" #! SOURCE_ROUTING_FILE="" #! DESCRIPTION="" #! REDIRECT_TERMINATORS="NONE" #! BEGIN_TCL="" #! ZOOM_SCALE="100" #! FME_REPROJECTION_ENGINE="FME" #! LOG_MAX_PRECISION="Yes" #! WORKSPACE_VERSION="1" #! FME_DOCUMENT_GUID="f3a17592-4637-4d60-a63c-81717fb19f72" #! SOURCE="NONE" #! FME_STROKE_MAX_DEVIATION="00000001" #! LEGAL_TERMS_CONDITIONS="" #! SHOW_INFO_NODES="true" #! FME_DOCUMENT_PRIORGUID="975bb5eb-0d29-4797-a74e-b57d02065b1c,4a6b74ae-d725-4b18-bd4a-bc3ef40847b2,80661980-f1a5-48a0-a273-f7d499c5febf,dcdba274-a740-4411-a006-607ab29cd0be,df88268f-68ce-4aa1-bc03-8ac444021d33" #! REQUIREMENTS="" #! REQUIREMENTS_KEYWORD="" #! FME_GEOMETRY_HANDLING="Enhanced" #! LOG_FILE="" #! DOC_EXTENTS="1996.02 1681.52" #! CATEGORY="" #! DESTINATION_ROUTING_FILE="" #! TITLE="" #! END_TCL="" #! BEGIN_PYTHON="" #! MAX_LOG_FEATURES="200" #! LAST_SAVE_BUILD="FME(R) 2015.1.0.1 (20150507 - Build 15480 - WIN32)" #! SHOW_ANNOTATIONS="true" #! WARN_INVALID_XFORM_PARAM="Yes" #! FME_BUILD_NUM="15480" #! DOC_TOP_LEFT="-46.0005 -1647.02" #! HISTORY="" #! LOG_MAX_RECORDED_FEATURES="200" #! FME_SERVER_SERVICES="" #! FME_IMPLICIT_CSMAP_REPROJECTION_MODE="Auto" #! PASSWORD="" #! VIEW_POSITION="-78.0008 -645.006" #! > #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! GUI IGNORE COM.safe.fme.jdbc_IN_USER_NAME_COM.safe.fme.jdbc_1,COM.safe.fme.jdbc_IN_PASSWORD_COM.safe.fme.jdbc_1,COM.safe.fme.jdbc_IN_JAVA_DRIVER_CLASS_COM.safe.fme.jdbc_1,COM.safe.fme.jdbc_IN_QUERY_TIMEOUT_COM.safe.fme.jdbc_1,COM.safe.fme.jdbc_IN_EXPOSE_ATTRS_GROUP_COM.safe.fme.jdbc_1 DEFAULT_MACRO SourceDataset_COM.safe.fme.jdbc_1 jdbc:postgresql:postgis.train.safe.comfmedata GUI TEXT SourceDataset_COM.safe.fme.jdbc_1 JDBC Connection String: INCLUDE [ if {{$(SourceDataset_COM.safe.fme.jdbc_1)} == {}} { puts_real {Parameter 'SourceDataset_COM.safe.fme.jdbc_1' must be given a value.}; exit 1; }; ] #! START_HEADER #! START_WB_HEADER READER_TYPE COM.safe.fme.jdbc READER_KEYWORD COM.safe.fme.jdbc_1 WRITER_TYPE NULL WRITER_KEYWORD NULL_DEST NULL_DEST_DATASET null #! END_WB_HEADER #! START_WB_HEADER MACRO WB_KEYWORD "COM.safe.fme.jdbc_1" #! END_WB_HEADER #! START_SOURCE_HEADER COM.safe.fme.jdbc COM.safe.fme.jdbc_1 #! END_SOURCE_HEADER #! START_WB_HEADER DEFAULT_MACRO SourceDataset INCLUDE [ if {{$(SourceDataset)} != ""} { \ puts {DEFAULT_MACRO SourceDataset_COM.safe.fme.jdbc_1 $(SourceDataset)} \ } ] #! END_WB_HEADER #! START_SOURCE_HEADER COM.safe.fme.jdbc COM.safe.fme.jdbc_1 DEFAULT_MACRO SourceDataset_COM.safe.fme.jdbc_1 $(SourceDataset_COM.safe.fme.jdbc_1) COM.safe.fme.jdbc_1_DATASET "$(SourceDataset_COM.safe.fme.jdbc_1)" GUI TEXT_ENCODED SourceDataset_COM.safe.fme.jdbc_1 JDBC Connection String: DEFAULT_MACRO COM.safe.fme.jdbc_IN_USER_NAME_COM.safe.fme.jdbc_1 fmedata COM.safe.fme.jdbc_1_USER_NAME "$(COM.safe.fme.jdbc_IN_USER_NAME_COM.safe.fme.jdbc_1)" GUI OPTIONAL TEXT_ENCODED COM.safe.fme.jdbc_IN_USER_NAME_COM.safe.fme.jdbc_1 Username: DEFAULT_MACRO COM.safe.fme.jdbc_IN_PASSWORD_COM.safe.fme.jdbc_1 fme_decrypt(MDowfCN8I3xcG3GQ/TeRRUJUZ5LDPtdvpscbh7Nj9gG/INBkAGA+fkaDrNbhZtfa3rmkUUrCxKWaAFwiYsKgWJNl/0mRpxUuP+IT2c+Qhh26JEZtUWAmpuoaQCdQ3ykKWm2zaoAM5MBCGaGEuYe+6AS07/nLNRJwqp1jdwP1FgVCbXRvZtWfKjEZlNJYQ+EicVc6cv2DxCYJyTljvXwF8mKxenML6FKJiHARQCO8OMJidKKZQJP1SeYIhqB0YrtGw4cGV2ZquQKifvRjB2Tl6wBAWDmeCg+R1jvft1tR17SISyTDv77K+mV80w2aaUSgybbF7coM0BrQPcpehfjlW+YxV73+9mPMFXKQeznZ22T8MJor57O44p8U2NQCw35HiFBs0oVP9VkkY0D/WzGRevseyX1pIEWJSQSFwkJVhiyXavMDz5E5SEYgTZHfVeGBXCDuIEEbfRRkPU5yD2nw2ZAVimDRD7UQhEEY6PosGqU17He4y35WEfAggQ40+EKuupOQSZRsKotTTqlYGHJtX49ymuKqfyZzOAUSUzDMcj8gfDgzOCcuhw2sK3fJaMszUkcFQe2d/BThYyKYJybZXzhoy5i/Spbc3yn9zCuahPYLjj2raktLkXxpWxmheX/mzckL0YNwbKUGfQtI2Guf5yXhQSMe6+0VEf0GS30DBaL9iwZ6dIGdcDxlp58Ylr+KksVBYgg7EXbIjmMyYns+YMM8sBPWXymeTUfVnWLhys+AmetLqijVPahTE+/psWwIlZPuAg5MCpgl8rUTtX9eFO5w/4Q9xGhIaiaQRptF+IENZ86tMAIccXemn9E2y6f6ilu0BhSLxYM2PSkjCe96a0/1SUOnOY4jfEGEBxrbwtt6GsWUc+P193YsCdtuBWpoCr83+uIYu9y1x7OQ2giDoWk/WrFkyLRa) COM.safe.fme.jdbc_1_PASSWORD "$(COM.safe.fme.jdbc_IN_PASSWORD_COM.safe.fme.jdbc_1)" GUI OPTIONAL PASSWORD_ENCODED COM.safe.fme.jdbc_IN_PASSWORD_COM.safe.fme.jdbc_1 Password: DEFAULT_MACRO COM.safe.fme.jdbc_IN_JAVA_DRIVER_CLASS_COM.safe.fme.jdbc_1 COM.safe.fme.jdbc_1_JAVA_DRIVER_CLASS "$(COM.safe.fme.jdbc_IN_JAVA_DRIVER_CLASS_COM.safe.fme.jdbc_1)" GUI OPTIONAL TEXT_ENCODED COM.safe.fme.jdbc_IN_JAVA_DRIVER_CLASS_COM.safe.fme.jdbc_1 Java Driver Class: # The dataset this mapping file was generated from was: DEFAULT_MACRO COM.safe.fme.jdbc_IN_QUERY_TIMEOUT_COM.safe.fme.jdbc_1 30 COM.safe.fme.jdbc_1_QUERY_TIMEOUT "$(COM.safe.fme.jdbc_IN_QUERY_TIMEOUT_COM.safe.fme.jdbc_1)" GUI INT COM.safe.fme.jdbc_IN_QUERY_TIMEOUT_COM.safe.fme.jdbc_1 Query Timeout (Seconds): DEFAULT_MACRO COM.safe.fme.jdbc_IN_EXPOSE_ATTRS_GROUP_COM.safe.fme.jdbc_1 GUI DISCLOSUREGROUP COM.safe.fme.jdbc_IN_EXPOSE_ATTRS_GROUP_COM.safe.fme.jdbc_1 COM.safe.fme.jdbc_EXPOSE_FORMAT_ATTRS Schema Attributes #! END_SOURCE_HEADER #! END_HEADER LOG_FILENAME "$(FME_MF_DIR)ReadJDBC_2015.1.log" LOG_APPEND NO LOG_MAX_FEATURES 200 LOG_MAX_RECORDED_FEATURES 200 LOG_MAX_PRECISION Yes FME_REPROJECTION_ENGINE FME FME_IMPLICIT_CSMAP_REPROJECTION_MODE Auto FME_GEOMETRY_HANDLING Enhanced FME_STROKE_MAX_DEVIATION 00000001 LOG_FILTER_MASK -1 DEFAULT_MACRO DATASET_KEYWORD_COM.safe.fme.jdbc_1 COM.safe.fme.jdbc_1 # ------------------------------------------------------------------------- COM.safe.fme.jdbc_1_READER_META_ATTRIBUTES fme_feature_type # ------------------------------------------------------------------------- MULTI_READER_CONTINUE_ON_READER_FAILURE No # ------------------------------------------------------------------------- MACRO WORKSPACE_NAME ReadJDBC_2015.1 MACRO FME_VIEWER_APP fmedatainspector # ------------------------------------------------------------------------- INCLUDE [ if {[info exists env(FME_TEMP)] && [file isdirectory $env(FME_TEMP)]} {set gVisualizerTemp $env(FME_TEMP)} elseif {[info exists env(TEMP)] && [file isdirectory $env(TEMP)]} {set gVisualizerTemp $env(TEMP)} elseif { $tcl_platform(platform) == "unix" } {set gVisualizerTemp "/tmp"} else {set gVisualizerTemp c:}; regsub -all {[ ,&]} {$(WORKSPACE_NAME)} {_} wsname; set gVisualizerTemp $gVisualizerTemp/${wsname}_[clock format [clock seconds] -format %H%M%S]; puts "MACRO WORKSPACE_TEMP_DIR $gVisualizerTemp"; MACRO VISUALIZER_FEATURE_FILE $(WORKSPACE_TEMP_DIR)/inspector.ffs MACRO VISUALIZER_SCHEMA_FILE $(WORKSPACE_TEMP_DIR)/inspector.fsc MACRO VISUALIZER_CREATE_SPATIAL_INDEX YES # ------------------------------------------------------------------------- COM.safe.fme.jdbc_1_DEF public.Parks ParkId smallint RefParkId smallint ParkName char(40) NeighborhoodName char(40) EWStreet char(30) NSStreet char(30) DogPark char(1) Washrooms char(1) SpecialFeatures char(1) geom blob # ------------------------------------------------------------------------- FACTORY_DEF * RoutingFactory FACTORY_NAME "Router and Unexpected Input Remover" INPUT FEATURE_TYPE * @SupplyAttributes(multi_reader_keyword,COM.safe.fme.jdbc_1) ROUTE COM.safe.fme.jdbc COM.safe.fme.jdbc_1::public.Parks TO FME_GENERIC ::public.Parks ALIAS_GEOMETRY MERGE_INPUT Yes OUTPUT ROUTED FEATURE_TYPE * COM.safe.fme.jdbc_1_MERGE_DEF COM.safe.fme.jdbc_1::public.Parks EXACT public.Parks DEFAULT_MACRO WB_CURRENT_CONTEXT # ------------------------------------------------------------------------- MACRO SQLCreator_DIRECTIVES USER_NAME fmedata PASSWORD fme_decrypt(MDowfCN8I3xcG3GQ/TeRRUJUZ5LDPtdvpscbh7Nj9gG/INBkAGA+fkaDrNbhZtfa3rmkUUrCxKWaAFwiYsKgWJNl/0mRpxUuP+IT2c+Qhh26JEZtUWAmpuoaQCdQ3ykKWm2zaoAM5MBCGaGEuYe+6AS07/nLNRJwqp1jdwP1FgVCbXRvZtWfKjEZlNJYQ+EicVc6cv2DxCYJyTljvXwF8mKxenML6FKJiHARQCO8OMJidKKZQJP1SeYIhqB0YrtGw4cGV2ZquQKifvRjB2Tl6wBAWDmeCg+R1jvft1tR17SISyTDv77K+mV80w2aaUSgybbF7coM0BrQPcpehfjlW+YxV73+9mPMFXKQeznZ22T8MJor57O44p8U2NQCw35HiFBs0oVP9VkkY0D/WzGRevseyX1pIEWJSQSFwkJVhiyXavMDz5E5SEYgTZHfVeGBXCDuIEEbfRRkPU5yD2nw2ZAVimDRD7UQhEEY6PosGqU17He4y35WEfAggQ40+EKuupOQSZRsKotTTqlYGHJtX49ymuKqfyZzOAUSUzDMcj8gfDgzOCcuhw2sK3fJaMszahknXoIyFPiD3S9D5GnfeQtSIlEKqEZ7MScYppSqO5Iec9hJ1M4yc3etgBWMxU6tyFr1XfnUW0CIur+Q8wemNN6qwcPg/WEAvk7SZ/rhPNNd/4vvyEPUisubNAmOnr53rGSdgvlMh27EXwpTQcqUtEQdhpiUNTCl5zuWgmD2jFwiMPlcv0VG8/QpJOjGgJhhiduXRMauu6xVmO5Bm6jsIpIX7SNFiHwxXDzva8ODasELr+0cVdLip0XhtxGVk1WyYgrS/o1S7Tb8OJCDNfNg/S1PR2Qh+LI1L2vT4O6c/smreyxPZ1+clbrfJdDkblyOiYDWJuBea7j4C0LI07vjJ1xf8x6ZlSXl) QUERY_FEATURE_TYPES_FOR_MERGE_FILTERS Yes QUERY_TIMEOUT 30 FACTORY_DEF * CreationFactory FACTORY_NAME SQLCreator_Creator OUTPUT FEATURE_TYPE _____CREATED______ FACTORY_DEF * QueryFactory FACTORY_NAME SQLCreator INPUT FEATURE_TYPE _____CREATED______ QUERY_SQL SELECTParkIdParkNameST_AsTextgeomaswktfrompublic.Parks COMBINE_ATTRIBUTES RESULT_ONLY COMBINE_GEOMETRY RESULT_ONLY READER_TYPE COM.SAFE.FME.JDBC READER_DATASET "jdbc:postgresql:postgis.train.safe.comfmedata" READER_PARAMS $(SQLCreator_DIRECTIVES) OUTPUT RESULT FEATURE_TYPE SQLCreator_RESULT @SupplyAttributes(fme_feature_type,SQLCreator) # ------------------------------------------------------------------------- # First determine which function we are going to be using -- we can do # this statically at parse time for efficiency sake MACRO GeometryReplacer_SetTempAttr MACRO GeometryReplacer_Function MACRO GeometryReplacer_RemoveTempAttr MACRO GeometryReplacer_RemoveSourceAttr INCLUDE [ set sourceText {@EvaluateExpression(FDIV,STRING_ENCODED,Valuewkt,GeometryReplacer)}; set decodedText [FME_DecodeText "$sourceText"]; if ![regexp {@EvaluateExpression\([^)]*STRING_ENCODED,@Value\(([^()]*)\),[^()]*\)} "$decodedText" dummy geomSrcAttr] { puts "MACRO GeometryReplacer_SetTempAttr @SupplyAttributes(ENCODED,__GeometryReplacerTemp__,\"$sourceText\")"; puts "MACRO GeometryReplacer_RemoveTempAttr @RemoveAttributes(__GeometryReplacerTemp__)"; set geomSrcAttr __GeometryReplacerTemp__; } elseif {{Yes} == {Yes} } { puts "MACRO GeometryReplacer_RemoveSourceAttr @RemoveAttributes(\"$geomSrcAttr\")"; }; if {{wkt} == {fmebinary} } { puts "MACRO GeometryReplacer_Function @Geometry(FROM_ATTRIBUTE_BINARY,\"$geomSrcAttr\")"; } elseif {{wkt} == {fmehex} } { puts "MACRO GeometryReplacer_Function @Geometry(FROM_ATTRIBUTE_BINARY_HEX,\"$geomSrcAttr\")"; } elseif {{wkt} == {fmexml} } { puts "MACRO GeometryReplacer_Function @Geometry(FROM_ATTRIBUTE,\"$geomSrcAttr\")"; } elseif {{wkt} == {fmexmlencoded} } { puts "MACRO GeometryReplacer_Function @Geometry(FROM_ENCODED_STRING,&\"$geomSrcAttr\")"; } elseif {{wkt} == {polyline} } { puts "MACRO GeometryReplacer_Function @Geometry(FROM_ATTRIBUTE_POLYLINE,\"$geomSrcAttr\")"; } elseif {{wkt} == {wkt} || {wkt} == {wkb} || {wkt} == {wkbhex} } { puts "MACRO GeometryReplacer_Function @OGCGeometry(from_attribute,wkt,\"$geomSrcAttr\")"; } elseif {{wkt} == {GEOJSON} || {wkt} == {ESRIJSON} } { puts "MACRO GeometryReplacer_Function @JSONGeometry(FROM_ATTRIBUTE,wkt,\"$geomSrcAttr\")"; } elseif {{wkt} == {GEORSS} } { puts "MACRO GeometryReplacer_Function @GeoRSSGeometry(FROM_ATTRIBUTE,\"$geomSrcAttr\")"; } elseif {{wkt} == {KML} } { puts "MACRO GeometryReplacer_Function @KMLGeometry(FROM_ATTRIBUTE,\"$geomSrcAttr\")"; } elseif {{wkt} == {GML} } { puts "MACRO GeometryReplacer_Function @GMLGeometry(FROM_ATTRIBUTE,\"$geomSrcAttr\",)"; } elseif {{wkt} == {geohash} } { puts "MACRO GeometryReplacer_Function @GeoHash(FROM_ATTRIBUTE,\"$geomSrcAttr\",)"; } elseif {{wkt} == {ogeosms} || {wkt} == {geosms} || {wkt} == {geo} } { puts "MACRO GeometryReplacer_Function @OGCGeometry(from_attribute,wkt,\"$geomSrcAttr\")"; } elseif {{wkt} == {mgrs}} { puts "MACRO GeometryReplacer_Function @MGRS(FROM_MGRS, , ,\"@EvaluateExpression(FDIV,STRING_ENCODED,Valuewkt,GeometryReplacer)\")" }; ] FACTORY_DEF * TeeFactory FACTORY_NAME GeometryReplacer INPUT FEATURE_TYPE SQLCreator_RESULT OUTPUT FEATURE_TYPE GeometryReplacer_OUTPUT $(GeometryReplacer_SetTempAttr) $(GeometryReplacer_Function) $(GeometryReplacer_RemoveTempAttr) $(GeometryReplacer_RemoveSourceAttr) # ------------------------------------------------------------------------- # Set the directive to add all the meta-attributes to the features. # We do this so users see all possible information in the viewed # features. READER_META_ATTRIBUTES fme_feature_type fme_dataset fme_basename # Assumption is that the workspace temp dir has been already set and created. See controldefs.cpp - ControlDefs::writeVisualizerTempDir DEFAULT_MACRO WORKSPACE_TEMP_DIR INCLUDE [ set grpByAttrs {}; if { [string length $grpByAttrs] > 0 } { if { [string first "@EvaluateExpression" $grpByAttrs] == 0 } { puts "MACRO CATMAC _$grpByAttrs" ; } else { set catter "" ; set comma "" ; foreach attr $grpByAttrs { set catter "$catter$comma@Value(\"$attr\")" ; set comma ",_," ; } ; puts "MACRO CATMAC _@Concatenate($catter)" ; } } else { puts "MACRO CATMAC " ; }; set safeName "[regsub -all {[^a-zA-Z0-9]} {GeometryReplacer_Output} _]_[expr round(rand() * 1000000)]_[clock clicks -milliseconds]"; puts "MACRO SAFE_FFS_NAME $safeName"; ] # Make the temporary directory that the FFS files will live in. FACTORY_DEF * CreationFactory FACTORY_NAME GeometryReplacer_Output_DirCreator OUTPUT FEATURE_TYPE __nukeme__ @Tcl2("catch {file mkdir {$(WORKSPACE_TEMP_DIR)}}") FACTORY_DEF * TeeFactory FACTORY_NAME GeometryReplacer_Output_DirCreatorCleanerUpper INPUT FEATURE_TYPE __nukeme__ # Send raster, point cloud and vector features down different paths to prepare # them for viewing FACTORY_DEF * TestFactory FACTORY_NAME GeometryReplacer_Output_FeatureDirector INPUT FEATURE_TYPE GeometryReplacer_OUTPUT TEST &fme_type == "fme_raster" OUTPUT FAILED FEATURE_TYPE GeometryReplacer_Output___NotRasterFeatures___ OUTPUT PASSED FEATURE_TYPE GeometryReplacer_Output___RasterFeatures___ FACTORY_DEF * TestFactory FACTORY_NAME GeometryReplacer_Output___FeatureDirector1 INPUT FEATURE_TYPE GeometryReplacer_Output___NotRasterFeatures___ TEST &fme_type == "fme_point_cloud" OUTPUT FAILED FEATURE_TYPE GeometryReplacer_Output___VectorFeatures___ OUTPUT PASSED FEATURE_TYPE GeometryReplacer_Output___PointCloudFeatures___ # Vector features simply may get their colors overridden FACTORY_DEF * TeeFactory FACTORY_NAME GeometryReplacer_Output_VectorSetterUpper INPUT FEATURE_TYPE GeometryReplacer_Output___VectorFeatures___ OUTPUT FEATURE_TYPE __viewme__ # Point Cloud Features Might Need to be thinned # Note that we don't call the ThinPointCloud function directly, but rather # do it through TCL. This should allow this transformer to be used with a # Desktop license, even though ThinPointCloud requires Professional. Tcl2 proc GeometryReplacer_Output_bdeb7131_e0a3_4d4d_8a85_cc4efb2135d00_thinPointCloud {} { if {[string equal {NO_THINNING} {KEEPNPOINT}]} { FME_Execute ThinPointCloud NO_THINNING "\"\""; } elseif {[string equal {NO_THINNING} {MAXNUMPOINTS}]} { FME_Execute ThinPointCloud NO_THINNING "\"\""; } elseif {[string equal {NO_THINNING} {FIRSTNPOINTS}]} { FME_Execute ThinPointCloud NO_THINNING "\"\""; } elseif {[string equal {NO_THINNING} {LASTNPOINTS}]} { FME_Execute ThinPointCloud NO_THINNING "\"\""; }; } FACTORY_DEF * TeeFactory FACTORY_NAME GeometryReplacer_Output___PointCloudThinner INPUT FEATURE_TYPE GeometryReplacer_Output___PointCloudFeatures___ OUTPUT FEATURE_TYPE __viewme__ @Tcl2("GeometryReplacer_Output_bdeb7131_e0a3_4d4d_8a85_cc4efb2135d00_thinPointCloud") Tcl2 proc GeometryReplacer_Output_bdeb7131_e0a3_4d4d_8a85_cc4efb2135d00_prepareRaster {subsetStartRow subsetNumRows subsetStartCol subsetNumCols} { set useDI [string equal -nocase {$(FME_VIEWER_APP)} {fmedatainspector}]; if {!$useDI} { FME_Execute ApplyRasterRotation BILINEAR; }; set doResample [string equal {NoReduction} {Resample}]; set doSubset [string equal {NoReduction} {Subset}]; set doBounds [string equal {NoReduction} {BoundingBoxOnly}]; if {$doBounds} { FME_Execute GeometryType fme_polygon; } elseif {$doResample || $doSubset} { set comment { First, we need to prefix all the attributes. This is done because we are going to call @RasterProperties, and we want to make sure it doesn't overwrite any existing attributes. }; set kAttrPrefix "."; set allNames [FME_AttributeNames]; foreach oldName $allNames { set newName $kAttrPrefix; append newName $oldName; FME_RenameAttribute $newName $oldName; }; FME_Execute RasterProperties RASTER; if {$doResample} { set oldNumCols [FME_GetAttribute _num_columns]; set oldNumRows [FME_GetAttribute _num_rows]; set oldSpacingX [FME_GetAttribute _spacing_x]; set oldSpacingY [FME_GetAttribute _spacing_y]; set kMinNumCells 32; set kMaxNumCells 512; set comment { We will only resample if both dimensions are greater than the minimum num cells, and at least one is greater than the maximum. }; if {$oldNumRows > $kMinNumCells && $oldNumCols > $kMinNumCells && ($oldNumRows > $kMaxNumCells || $oldNumCols > $kMaxNumCells)} { set newSpacingX 1.0; set newSpacingY 1.0; if {$oldNumRows > $oldNumCols} { set comment { If we have more rows than columns, we need to choose a spacing that reduces the number of rows to the maximum we've chosen. }; set newSpacingY [expr 1.0 * $oldNumRows * $oldSpacingY / $kMaxNumCells]; set newSpacingX [expr 1.0 * $newSpacingY / $oldSpacingY * $oldSpacingX]; set comment { Now we need to check if doing this will result in the columns going below the minimum. If so, choose the spacing such that we only go down to the minimum (and not past). }; set newNumCols [expr $oldNumCols * $oldSpacingX / $newSpacingX]; if {$newNumCols < $kMinNumCells} { set newSpacingX [expr 1.0 * $oldNumCols * $oldSpacingX / $kMinNumCells]; set newSpacingY [expr 1.0 * $newSpacingX / $oldSpacingX * $oldSpacingY]; }; } else { set comment { This is identical to the above case, except the roles of rows and cols are reversed. }; set newSpacingX [expr 1.0 * $oldNumCols * $oldSpacingX / $kMaxNumCells]; set newSpacingY [expr 1.0 * $newSpacingX / $oldSpacingX * $oldSpacingY]; set newNumRows [expr $oldNumRows * $oldSpacingY / $newSpacingY]; if {$newNumRows < $kMinNumCells} { set newSpacingY [expr 1.0 * $oldNumRows * $oldSpacingY / $kMinNumCells]; set newSpacingX [expr 1.0 * $newSpacingY / $oldSpacingY * $oldSpacingX]; }; }; FME_Execute ResampleRaster CELL_SIZE $newSpacingX $newSpacingY NearestNeighbor; }; } elseif {$doSubset} { set comment { Get the value of some strings that may be attributes or constants. Note that we pass in the attribute prefix we're using, because if one does turn out to be an attribute, it won't actually be the exact name in the string (since we renamed all our attributes above). }; set rasterNumRows [FME_GetAttribute _num_rows]; set rasterNumCols [FME_GetAttribute _num_columns]; set comment { Only do subsetting if the specified start position is actually within the raster. }; if {$subsetStartRow < $rasterNumRows && $subsetStartCol < $rasterNumCols} { set comment { Now bound the subset to the size of the raster, so that we don't create padding. }; if {[expr $subsetStartRow + $subsetNumRows] > $rasterNumRows} { set subsetNumRows [expr $rasterNumRows - $subsetStartRow]; }; if {[expr $subsetStartCol + $subsetNumCols] > $rasterNumCols} { set subsetNumCols [expr $rasterNumCols - $subsetStartCol]; }; FME_Execute SubsetRaster $subsetStartRow $subsetNumRows $subsetStartCol $subsetNumCols; }; }; set comment { Remove all the attributes added by @RasterProperties and remove the prefix from the real attributes. We assume they all start with an underscore. }; FME_Execute RemoveAttributes fme_regexp_match {^_}; foreach oldName $allNames { set newName $kAttrPrefix; append newName $oldName; FME_RenameAttribute $oldName $newName; }; }; } FACTORY_DEF * TeeFactory FACTORY_NAME GeometryReplacer_Output_RasterSetterUpper INPUT FEATURE_TYPE GeometryReplacer_Output___RasterFeatures___ OUTPUT FEATURE_TYPE __viewme__ @Tcl2("GeometryReplacer_Output_bdeb7131_e0a3_4d4d_8a85_cc4efb2135d00_prepareRaster {} {} {} {}") # Now route all the features into the recorder, changing their # feature type to the transformer name so that they view nicely # GeometryReplacer_Output_bdeb7131_e0a3_4d4d_8a85_cc4efb2135d00_VIS_FEAT_TYPE changes the feature types # of the features being visualized. DEFAULT_MACRO GeometryReplacer_Output_bdeb7131_e0a3_4d4d_8a85_cc4efb2135d00_VIS_FEAT_TYPE GeometryReplacer_Output$(CATMAC) DEFAULT_MACRO VISUALIZER_FEATURE_FILE $(WORKSPACE_TEMP_DIR)/$(SAFE_FFS_NAME).ffs DEFAULT_MACRO VISUALIZER_CREATE_SPATIAL_INDEX NO # [PR#45549] The Data Inspector will limit the maximum number of features # it reads on WIN32, so we will correspondingly limit the number of # features we record here using the MAX_FEATURES_TO_RECORD directive. FACTORY_DEF * RecorderFactory FACTORY_NAME GeometryReplacer_Output_Recorder INPUT FEATURE_TYPE __viewme__ _wb_termination_feature Yes @FeatureType(TERMINATOR_@Value(_wb_termination_xformer)) INPUT FEATURE_TYPE __viewme__ @FeatureType($(GeometryReplacer_Output_bdeb7131_e0a3_4d4d_8a85_cc4efb2135d00_VIS_FEAT_TYPE)) FEATURE_FILE "$(VISUALIZER_FEATURE_FILE)" CREATE_SPATIAL_INDEX "$(VISUALIZER_CREATE_SPATIAL_INDEX)" INSPECTOR "$(VISUALIZER_CREATE_SPATIAL_INDEX)" FSC_SCHEMA ParkId,varchar255,ParkName,varchar255 MODE RECORD RECORD_DIRECTLY_TO_DISK YES MAX_FEATURES_TO_RECORD WIN32 2000000 # ------------------------------------------------------------------------- # Set the directive to add all the meta-attributes to the features. # We do this so users see all possible information in the viewed # features. READER_META_ATTRIBUTES fme_feature_type fme_dataset fme_basename # Assumption is that the workspace temp dir has been already set and created. See controldefs.cpp - ControlDefs::writeVisualizerTempDir DEFAULT_MACRO WORKSPACE_TEMP_DIR INCLUDE [ set grpByAttrs {}; if { [string length $grpByAttrs] > 0 } { if { [string first "@EvaluateExpression" $grpByAttrs] == 0 } { puts "MACRO CATMAC _$grpByAttrs" ; } else { set catter "" ; set comma "" ; foreach attr $grpByAttrs { set catter "$catter$comma@Value(\"$attr\")" ; set comma ",_," ; } ; puts "MACRO CATMAC _@Concatenate($catter)" ; } } else { puts "MACRO CATMAC " ; }; set safeName "[regsub -all {[^a-zA-Z0-9]} {public.Parks} _]_[expr round(rand() * 1000000)]_[clock clicks -milliseconds]"; puts "MACRO SAFE_FFS_NAME $safeName"; ] # Make the temporary directory that the FFS files will live in. FACTORY_DEF * CreationFactory FACTORY_NAME public.Parks_DirCreator OUTPUT FEATURE_TYPE __nukeme__ @Tcl2("catch {file mkdir {$(WORKSPACE_TEMP_DIR)}}") FACTORY_DEF * TeeFactory FACTORY_NAME public.Parks_DirCreatorCleanerUpper INPUT FEATURE_TYPE __nukeme__ # Send raster, point cloud and vector features down different paths to prepare # them for viewing FACTORY_DEF * TestFactory FACTORY_NAME public.Parks_FeatureDirector INPUT FEATURE_TYPE public.Parks TEST &fme_type == "fme_raster" OUTPUT FAILED FEATURE_TYPE public.Parks___NotRasterFeatures___ OUTPUT PASSED FEATURE_TYPE public.Parks___RasterFeatures___ FACTORY_DEF * TestFactory FACTORY_NAME public.Parks___FeatureDirector1 INPUT FEATURE_TYPE public.Parks___NotRasterFeatures___ TEST &fme_type == "fme_point_cloud" OUTPUT FAILED FEATURE_TYPE public.Parks___VectorFeatures___ OUTPUT PASSED FEATURE_TYPE public.Parks___PointCloudFeatures___ # Vector features simply may get their colors overridden FACTORY_DEF * TeeFactory FACTORY_NAME public.Parks_VectorSetterUpper INPUT FEATURE_TYPE public.Parks___VectorFeatures___ OUTPUT FEATURE_TYPE __viewme__ # Point Cloud Features Might Need to be thinned # Note that we don't call the ThinPointCloud function directly, but rather # do it through TCL. This should allow this transformer to be used with a # Desktop license, even though ThinPointCloud requires Professional. Tcl2 proc public.Parks_5df3e00d_1b77_423b_853b_90d231eab8d90_thinPointCloud {} { if {[string equal {NO_THINNING} {KEEPNPOINT}]} { FME_Execute ThinPointCloud NO_THINNING "\"\""; } elseif {[string equal {NO_THINNING} {MAXNUMPOINTS}]} { FME_Execute ThinPointCloud NO_THINNING "\"\""; } elseif {[string equal {NO_THINNING} {FIRSTNPOINTS}]} { FME_Execute ThinPointCloud NO_THINNING "\"\""; } elseif {[string equal {NO_THINNING} {LASTNPOINTS}]} { FME_Execute ThinPointCloud NO_THINNING "\"\""; }; } FACTORY_DEF * TeeFactory FACTORY_NAME public.Parks___PointCloudThinner INPUT FEATURE_TYPE public.Parks___PointCloudFeatures___ OUTPUT FEATURE_TYPE __viewme__ @Tcl2("public.Parks_5df3e00d_1b77_423b_853b_90d231eab8d90_thinPointCloud") Tcl2 proc public.Parks_5df3e00d_1b77_423b_853b_90d231eab8d90_prepareRaster {subsetStartRow subsetNumRows subsetStartCol subsetNumCols} { set useDI [string equal -nocase {$(FME_VIEWER_APP)} {fmedatainspector}]; if {!$useDI} { FME_Execute ApplyRasterRotation BILINEAR; }; set doResample [string equal {NoReduction} {Resample}]; set doSubset [string equal {NoReduction} {Subset}]; set doBounds [string equal {NoReduction} {BoundingBoxOnly}]; if {$doBounds} { FME_Execute GeometryType fme_polygon; } elseif {$doResample || $doSubset} { set comment { First, we need to prefix all the attributes. This is done because we are going to call @RasterProperties, and we want to make sure it doesn't overwrite any existing attributes. }; set kAttrPrefix "."; set allNames [FME_AttributeNames]; foreach oldName $allNames { set newName $kAttrPrefix; append newName $oldName; FME_RenameAttribute $newName $oldName; }; FME_Execute RasterProperties RASTER; if {$doResample} { set oldNumCols [FME_GetAttribute _num_columns]; set oldNumRows [FME_GetAttribute _num_rows]; set oldSpacingX [FME_GetAttribute _spacing_x]; set oldSpacingY [FME_GetAttribute _spacing_y]; set kMinNumCells 32; set kMaxNumCells 512; set comment { We will only resample if both dimensions are greater than the minimum num cells, and at least one is greater than the maximum. }; if {$oldNumRows > $kMinNumCells && $oldNumCols > $kMinNumCells && ($oldNumRows > $kMaxNumCells || $oldNumCols > $kMaxNumCells)} { set newSpacingX 1.0; set newSpacingY 1.0; if {$oldNumRows > $oldNumCols} { set comment { If we have more rows than columns, we need to choose a spacing that reduces the number of rows to the maximum we've chosen. }; set newSpacingY [expr 1.0 * $oldNumRows * $oldSpacingY / $kMaxNumCells]; set newSpacingX [expr 1.0 * $newSpacingY / $oldSpacingY * $oldSpacingX]; set comment { Now we need to check if doing this will result in the columns going below the minimum. If so, choose the spacing such that we only go down to the minimum (and not past). }; set newNumCols [expr $oldNumCols * $oldSpacingX / $newSpacingX]; if {$newNumCols < $kMinNumCells} { set newSpacingX [expr 1.0 * $oldNumCols * $oldSpacingX / $kMinNumCells]; set newSpacingY [expr 1.0 * $newSpacingX / $oldSpacingX * $oldSpacingY]; }; } else { set comment { This is identical to the above case, except the roles of rows and cols are reversed. }; set newSpacingX [expr 1.0 * $oldNumCols * $oldSpacingX / $kMaxNumCells]; set newSpacingY [expr 1.0 * $newSpacingX / $oldSpacingX * $oldSpacingY]; set newNumRows [expr $oldNumRows * $oldSpacingY / $newSpacingY]; if {$newNumRows < $kMinNumCells} { set newSpacingY [expr 1.0 * $oldNumRows * $oldSpacingY / $kMinNumCells]; set newSpacingX [expr 1.0 * $newSpacingY / $oldSpacingY * $oldSpacingX]; }; }; FME_Execute ResampleRaster CELL_SIZE $newSpacingX $newSpacingY NearestNeighbor; }; } elseif {$doSubset} { set comment { Get the value of some strings that may be attributes or constants. Note that we pass in the attribute prefix we're using, because if one does turn out to be an attribute, it won't actually be the exact name in the string (since we renamed all our attributes above). }; set rasterNumRows [FME_GetAttribute _num_rows]; set rasterNumCols [FME_GetAttribute _num_columns]; set comment { Only do subsetting if the specified start position is actually within the raster. }; if {$subsetStartRow < $rasterNumRows && $subsetStartCol < $rasterNumCols} { set comment { Now bound the subset to the size of the raster, so that we don't create padding. }; if {[expr $subsetStartRow + $subsetNumRows] > $rasterNumRows} { set subsetNumRows [expr $rasterNumRows - $subsetStartRow]; }; if {[expr $subsetStartCol + $subsetNumCols] > $rasterNumCols} { set subsetNumCols [expr $rasterNumCols - $subsetStartCol]; }; FME_Execute SubsetRaster $subsetStartRow $subsetNumRows $subsetStartCol $subsetNumCols; }; }; set comment { Remove all the attributes added by @RasterProperties and remove the prefix from the real attributes. We assume they all start with an underscore. }; FME_Execute RemoveAttributes fme_regexp_match {^_}; foreach oldName $allNames { set newName $kAttrPrefix; append newName $oldName; FME_RenameAttribute $oldName $newName; }; }; } FACTORY_DEF * TeeFactory FACTORY_NAME public.Parks_RasterSetterUpper INPUT FEATURE_TYPE public.Parks___RasterFeatures___ OUTPUT FEATURE_TYPE __viewme__ @Tcl2("public.Parks_5df3e00d_1b77_423b_853b_90d231eab8d90_prepareRaster {} {} {} {}") # Now route all the features into the recorder, changing their # feature type to the transformer name so that they view nicely # public.Parks_5df3e00d_1b77_423b_853b_90d231eab8d90_VIS_FEAT_TYPE changes the feature types # of the features being visualized. DEFAULT_MACRO public.Parks_5df3e00d_1b77_423b_853b_90d231eab8d90_VIS_FEAT_TYPE public.Parks$(CATMAC) DEFAULT_MACRO VISUALIZER_FEATURE_FILE $(WORKSPACE_TEMP_DIR)/$(SAFE_FFS_NAME).ffs DEFAULT_MACRO VISUALIZER_CREATE_SPATIAL_INDEX NO # [PR#45549] The Data Inspector will limit the maximum number of features # it reads on WIN32, so we will correspondingly limit the number of # features we record here using the MAX_FEATURES_TO_RECORD directive. FACTORY_DEF * RecorderFactory FACTORY_NAME public.Parks_Recorder INPUT FEATURE_TYPE __viewme__ _wb_termination_feature Yes @FeatureType(TERMINATOR_@Value(_wb_termination_xformer)) INPUT FEATURE_TYPE __viewme__ @FeatureType($(public.Parks_5df3e00d_1b77_423b_853b_90d231eab8d90_VIS_FEAT_TYPE)) FEATURE_FILE "$(VISUALIZER_FEATURE_FILE)" CREATE_SPATIAL_INDEX "$(VISUALIZER_CREATE_SPATIAL_INDEX)" INSPECTOR "$(VISUALIZER_CREATE_SPATIAL_INDEX)" FSC_SCHEMA ParkId,varchar255,RefParkId,varchar255,ParkName,varchar255,NeighborhoodName,varchar255,EWStreet,varchar255,NSStreet,varchar255,DogPark,varchar255,Washrooms,varchar255,SpecialFeatures,varchar255,geom,varchar255 MODE RECORD RECORD_DIRECTLY_TO_DISK YES MAX_FEATURES_TO_RECORD WIN32 2000000 # ------------------------------------------------------------------------- FACTORY_DEF * RoutingFactory FACTORY_NAME "Destination Feature Type Routing Correlator" INPUT FEATURE_TYPE * OUTPUT ROUTED FEATURE_TYPE * @FeatureType(ENCODED,@Value(__wb_out_feat_type__)) @RemoveAttributes(__wb_out_feat_type__) OUTPUT NOT_ROUTED FEATURE_TYPE __nuke_me__ @Tcl2("FME_StatMessage 818059 [FME_GetAttribute fme_template_feature_type] 818060 818061 fme_warn") # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME "Final Output Nuker" INPUT FEATURE_TYPE __nuke_me__ # ------------------------------------------------------------------------- FACTORY_DEF * CreationFactory CREATE_AT_END OUTPUT FEATURE_TYPE __NUKEME__ @TCL("if [file exists {$(WORKSPACE_TEMP_DIR)}] {set files [glob -nocomplain -directory {$(WORKSPACE_TEMP_DIR)} -tails *.ffs]; if {[llength $files] == 1} { set theFile {$(WORKSPACE_TEMP_DIR)/}; append theFile [lindex $files 0]; eval FME_Execute System \173\042$(FME_HOME_UNIX)/fmedatainspector\042 --visualizer --single-application --delete-on-close --no-source-prompt -f FFS $theFile & \175; } elseif { [llength $files] == 0 } { catch { file delete -force {$(WORKSPACE_TEMP_DIR)} }; } else { set filesNoExt {}; set lastfile {}; foreach {fileName} [lsort $files] { set fileNoExt [string trimright $fileName {.ffs}]; if [regexp {(.*)_[0-9]*$} $fileNoExt wholething fileNoExtBase] { if { $fileNoExtBase == $lastfile } { continue } }; set lastfile $fileNoExt; lappend filesNoExt $fileNoExt }; eval FME_Execute System \173\042$(FME_HOME_UNIX)/fmedatainspector\042 --visualizer --single-application --delete-on-close --no-source-prompt -d {$(WORKSPACE_TEMP_DIR)} -a ffs -f FFS $filesNoExt & \175; }; }; ") FACTORY_DEF * TeeFactory INPUT FEATURE_TYPE __NUKEME__