# ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! # ! FME_PYTHON_VERSION 27 GUI忽略SourceDataset_OGCKML_1,OGCKML_IN_KML21_LOG_VERBOSE_OGCKML_1,OGCKML_IN_KML21_RASTER_READ_MODE_OGCKML_1,OGCKML_IN_KML21_SCAN_SCHEMA_OGCKML_1,OGCKML_IN_KML21_FAIL_ON_NETWORK_ERROR_OGCKML_1,OGCKML_IN_KML21_DELETE_DOWNLOADED_FILES_OGCKML_1,OGCKML_IN_KML21_TRAVERSE_NETWORKLINKS_OGCKML_1,OGCKML_IN_KML21_MAX_NETWORKLINK_TRAVERSAL_DEPTH_OGCKML_1,OGCKML_IN_KML21_DATASET_ENCODING_OGCKML_1,OGCKML_IN_KML21_MOVE_TO_KML_WORLD_COORDSYS_OGCKML_1,OGCKML_IN_KML21_APPLY_MODEL_TRANSFORMS_OGCKML_1,OGCKML_IN_EXPOSE_ATTRS_GROUP_OGCKML_1,OGCKML_IN_SEARCH_ENVELOPE_MINX_OGCKML_1,OGCKML_IN_SEARCH_ENVELOPE_MINY_OGCKML_1,OGCKML_IN_SEARCH_ENVELOPE_MAXX_OGCKML_1,OGCKML_IN_SEARCH_ENVELOPE_MAXY_OGCKML_1,OGCKML_IN_SEARCH_ENVELOPE_COORDINATE_SYSTEM_OGCKML_1,OGCKML_IN_CLIP_TO_ENVELOPE_OGCKML_1,OGCKML_IN_NETWORK_AUTHENTICATION_OGCKML_1 DEFAULT_MACRO SourceDataset_OGCKML $(FME_MF_DIR)8684-sentinel-1b-mp-20170502t191500-20170505t191500.kml GUI FILE_OR_URL SourceDataset_OGCKML KML_Files(*.kml;*.kmz)|*.kml;*.kmz|All_Files(*)|* Source Google KML File or URL: INCLUDE [ if {{$(SourceDataset_OGCKML)} == {}} { puts_real {Parameter 'SourceDataset_OGCKML' must be given a value.};exit 1;};] #!START_HEADER #!START_WB_HEADER READER_TYPE OGCKML READER_KEYWORD OGCKML_1 READER_GEN_DIRECTIVES NETWORK_AUTHENTICATION,,KML21_MOVE_TO_KML_WORLD_COORDSYS,Yes,KML21_TRAVERSE_NETWORKLINKS,All,KML21_RASTER_READ_MODE,GroundOverlay,KML21_LOG_VERBOSE,No,EXPOSE_ATTRS_GROUP,FME_DISCLOSURE_OPEN,SEARCH_ENVELOPE_MAXX,0,KML21_APPLY_MODEL_TRANSFORMS,No,SEARCH_ENVELOPE_MAXY,0,SEARCH_ENVELOPE_COORDINATE_SYSTEM,,CLIP_TO_ENVELOPE,NO,KML21_SCAN_SCHEMA,Yes,KML21_MAX_NETWORKLINK_TRAVERSAL_DEPTH,5,_MERGE_SCHEMAS,YES,USE_SEARCH_ENVELOPE,NO,SEARCH_ENVELOPE_MINX,0,SEARCH_ENVELOPE_MINY,0,KML21_FAIL_ON_NETWORK_ERROR,No,KML21_DELETE_DOWNLOADED_FILES,Yes,OGCKML_EXPOSE_FORMAT_ATTRS,kml_data .display_name kml_buffer kml_data .display_name_raw_text kml_buffer kml_data .name kml_buffer kml_data .value kml_buffer kml_extended_data_xml kml_buffer,KML21_DATASET_ENCODING, WRITER_TYPE NULL WRITER_KEYWORD NULL_DEST NULL_DEST_DATASET null #!END_WB_HEADER #!START_WB_HEADER MACRO WB_KEYWORD "OGCKML_1" #!END_WB_HEADER #!START_SOURCE_HEADER OGCKML OGCKML_1 # The dataset this mapping file was generated from was: #!END_SOURCE_HEADER #!START_WB_HEADER DEFAULT_MACRO SourceDataset INCLUDE [ if {{$(SourceDataset)} != ""} { \ puts {DEFAULT_MACRO SourceDataset_OGCKML_1 $(SourceDataset)} \ } ] #!END_WB_HEADER #!START_SOURCE_HEADER OGCKML OGCKML_1 DEFAULT_MACRO SourceDataset_OGCKML_1 $(SourceDataset_OGCKML)GUI FILE_OR_URL SourceDataset_OGCKML_1 KML_Files(* KML; * KMZ。)| * .KML; * KMZ | All_Files(*)| *资料来源谷歌KML文件或URL:DEFAULT_MACRO OGCKML_IN_KML21_LOG_VERBOSE_OGCKML_1没有OGCKML_1_KML21_LOG_VERBOSE“$(OGCKML_IN_KML21_LOG_VERBOSE_OGCKML_1)" GUI CHOICE OGCKML_IN_KML21_LOG_VERBOSE_OGCKML_1 Yes%No Verbose Logging: DEFAULT_MACRO OGCKML_IN_KML21_RASTER_READ_MODE_OGCKML_1 GroundOverlay OGCKML_1_KML21_RASTER_READ_MODE "$(OGCKML_IN_KML21_RASTER_READ_MODE_OGCKML_1)" GUI OPTIONAL CHOICE OGCKML_IN_KML21_RASTER_READ_MODE_OGCKML_1 All%GroundOverlay%None Read Overlays as Rasters: DEFAULT_MACRO OGCKML_IN_KML21_SCAN_SCHEMA_OGCKML_1 Yes OGCKML_1_KML21_SCAN_SCHEMA "$(OGCKML_IN_KML21_SCAN_SCHEMA_OGCKML_1)" GUI CHOICE OGCKML_IN_KML21_SCAN_SCHEMA_OGCKML_1 Yes%No Scan Schema: DEFAULT_MACRO OGCKML_IN_KML21_FAIL_ON_NETWORK_ERROR_OGCKML_1 No OGCKML_1_KML21_FAIL_ON_NETWORK_ERROR "$(OGCKML_IN_KML21_FAIL_ON_NETWORK_ERROR_OGCKML_1)" GUI CHOICE OGCKML_IN_KML21_FAIL_ON_NETWORK_ERROR_OGCKML_1 Yes%No Fail on Network Errors: DEFAULT_MACRO OGCKML_IN_KML21_DELETE_DOWNLOADED_FILES_OGCKML_1 Yes OGCKML_1_KML21_DELETE_DOWNLOADED_FILES "$(OGCKML_IN_KML21_DELETE_DOWNLOADED_FILES_OGCKML_1)" GUI CHOICE OGCKML_IN_KML21_DELETE_DOWNLOADED_FILES_OGCKML_1 Yes%No Delete Downloaded Files: DEFAULT_MACRO OGCKML_IN_KML21_TRAVERSE_NETWORKLINKS_OGCKML_1 All OGCKML_1_KML21_TRAVERSE_NETWORKLINKS "$(OGCKML_IN_KML21_TRAVERSE_NETWORKLINKS_OGCKML_1)" GUI OPTIONAL CHOICE OGCKML_IN_KML21_TRAVERSE_NETWORKLINKS_OGCKML_1 No%Local%All Traverse NetworkLinks: DEFAULT_MACRO OGCKML_IN_KML21_MAX_NETWORKLINK_TRAVERSAL_DEPTH_OGCKML_1 5 OGCKML_1_KML21_MAX_NETWORKLINK_TRAVERSAL_DEPTH "$(OGCKML_IN_KML21_MAX_NETWORKLINK_TRAVERSAL_DEPTH_OGCKML_1)" GUI OPTIONAL INTEGER OGCKML_IN_KML21_MAX_NETWORKLINK_TRAVERSAL_DEPTH_OGCKML_1 Maximum NetworkLinks Traversal Depth: DEFAULT_MACRO OGCKML_IN_KML21_DATASET_ENCODING_OGCKML_1 OGCKML_1_KML21_DATASET_ENCODING "$(OGCKML_IN_KML21_DATASET_ENCODING_OGCKML_1)" GUI OPTIONAL ENCODING OGCKML_IN_KML21_DATASET_ENCODING_OGCKML_1 * Force Dataset Encoding: DEFAULT_MACRO OGCKML_IN_KML21_MOVE_TO_KML_WORLD_COORDSYS_OGCKML_1 Yes OGCKML_1_KML21_MOVE_TO_KML_WORLD_COORDSYS "$(OGCKML_IN_KML21_MOVE_TO_KML_WORLD_COORDSYS_OGCKML_1)" GUI CHOICE OGCKML_IN_KML21_MOVE_TO_KML_WORLD_COORDSYS_OGCKML_1 Yes%No Move To World Coordinate System: DEFAULT_MACRO OGCKML_IN_KML21_APPLY_MODEL_TRANSFORMS_OGCKML_1 No OGCKML_1_KML21_APPLY_MODEL_TRANSFORMS "$(OGCKML_IN_KML21_APPLY_MODEL_TRANSFORMS_OGCKML_1)" GUI CHOICE OGCKML_IN_KML21_APPLY_MODEL_TRANSFORMS_OGCKML_1 Yes%No Apply Transformations To Models: DEFAULT_MACRO OGCKML_IN_EXPOSE_ATTRS_GROUP_OGCKML_1 FME_DISCLOSURE_OPEN OGCKML_1_EXPOSE_ATTRS_GROUP "$(OGCKML_IN_EXPOSE_ATTRS_GROUP_OGCKML_1)" GUI DISCLOSUREGROUP OGCKML_IN_EXPOSE_ATTRS_GROUP_OGCKML_1 OGCKML_EXPOSE_FORMAT_ATTRS Schema Attributes # Include this file in source setting section to add external search envelope processing # Zero as a default means we don't do any search -- this makes workbench happier # =========================================================================== DEFAULT_MACRO OGCKML_IN_SEARCH_ENVELOPE_MINX_OGCKML_1 0 OGCKML_1_SEARCH_ENVELOPE "$(OGCKML_IN_SEARCH_ENVELOPE_MINX_OGCKML_1)" GUI OPTIONAL FLOAT OGCKML_IN_SEARCH_ENVELOPE_MINX_OGCKML_1 Minimum X: # =========================================================================== DEFAULT_MACRO OGCKML_IN_SEARCH_ENVELOPE_MINY_OGCKML_1 0 OGCKML_1_SEARCH_ENVELOPE "$(OGCKML_IN_SEARCH_ENVELOPE_MINY_OGCKML_1)" GUI OPTIONAL FLOAT OGCKML_IN_SEARCH_ENVELOPE_MINY_OGCKML_1 Minimum Y: # =========================================================================== DEFAULT_MACRO OGCKML_IN_SEARCH_ENVELOPE_MAXX_OGCKML_1 0 OGCKML_1_SEARCH_ENVELOPE "$(OGCKML_IN_SEARCH_ENVELOPE_MAXX_OGCKML_1)" GUI OPTIONAL FLOAT OGCKML_IN_SEARCH_ENVELOPE_MAXX_OGCKML_1 Maximum X: # =========================================================================== DEFAULT_MACRO OGCKML_IN_SEARCH_ENVELOPE_MAXY_OGCKML_1 0 OGCKML_1_SEARCH_ENVELOPE "$(OGCKML_IN_SEARCH_ENVELOPE_MAXY_OGCKML_1)" GUI OPTIONAL FLOAT OGCKML_IN_SEARCH_ENVELOPE_MAXY_OGCKML_1 Maximum Y: # =========================================================================== DEFAULT_MACRO OGCKML_IN_SEARCH_ENVELOPE_COORDINATE_SYSTEM_OGCKML_1 OGCKML_1_SEARCH_ENVELOPE "$(OGCKML_IN_SEARCH_ENVELOPE_COORDINATE_SYSTEM_OGCKML_1)" GUI OPTIONAL COORDSYS OGCKML_IN_SEARCH_ENVELOPE_COORDINATE_SYSTEM_OGCKML_1 Search Envelope Coordinate System: # =========================================================================== # BUG18999: We now have a soft clip to fall back on like native spatial index # thus we are reintroducing the clip to envelop as an option for users.#按现有databas Defualt软夹e readers we are emulating DEFAULT_MACRO OGCKML_IN_CLIP_TO_ENVELOPE_OGCKML_1 NO OGCKML_1_CLIP_TO_ENVELOPE "$(OGCKML_IN_CLIP_TO_ENVELOPE_OGCKML_1)" GUI OPTIONAL CHECKBOX OGCKML_IN_CLIP_TO_ENVELOPE_OGCKML_1 YES%NO Clip to Search Envelope # =========================================================================== DEFAULT_MACRO OGCKML_IN_NETWORK_AUTHENTICATION_OGCKML_1 OGCKML_1_NETWORK_AUTHENTICATION "$(OGCKML_IN_NETWORK_AUTHENTICATION_OGCKML_1)" GUI OPTIONAL AUTHENTICATOR OGCKML_IN_NETWORK_AUTHENTICATION_OGCKML_1 CONTAINER%GROUP%CONTAINER_TITLE%"Network Authentication"%PROMPT_TYPE%NETWORK Network Authentication # =========================================================================== DEFAULT_MACRO OGCKML_IN_ATTRIBUTE_READING_OGCKML_1 ALL OGCKML_1_ATTRIBUTE_READING "$(OGCKML_IN_ATTRIBUTE_READING_OGCKML_1)" OGCKML_1_DATASET "$(SourceDataset_OGCKML_1)" #!END_SOURCE_HEADER #!START_WB_HEADER #!END_WB_HEADER #!END_HEADER LOG_FILENAME "$(FME_MF_DIR)example.log" LOG_APPEND NO LOG_MAX_FEATURES 200 LOG_MAX_RECORDED_FEATURES 200 FME_REPROJECTION_ENGINE FME FME_IMPLICIT_CSMAP_REPROJECTION_MODE Auto FME_GEOMETRY_HANDLING Enhanced FME_STROKE_MAX_DEVIATION 0 LOG_FILTER_MASK -1 DEFAULT_MACRO DATASET_KEYWORD_OGCKML_1 OGCKML_1 # ------------------------------------------------------------------------- OGCKML_1_READER_META_ATTRIBUTES fme_feature_type # ------------------------------------------------------------------------- MULTI_READER_CONTINUE_ON_READER_FAILURE No # ------------------------------------------------------------------------- MACRO WORKSPACE_NAME example 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 # ------------------------------------------------------------------------- OGCKML_1_DEF Placemark # ------------------------------------------------------------------------- FACTORY_DEF * RoutingFactory FACTORY_NAME "Router and Unexpected Input Remover" COMMAND_PARM_EVALUATION SINGLE_PASS MULTI_READER_KEYWORD OGCKML_1 INPUT FEATURE_TYPE * ROUTE OGCKML OGCKML_1::Placemark TO FME_GENERIC ::Placemark ALIAS_GEOMETRY MERGE_INPUT Yes OUTPUT ROUTED FEATURE_TYPE * OGCKML_1_MERGE_DEF OGCKML_1::Placemark EXACT Placemark # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME "Placemark (OGCKML_1) Splitter" INPUT FEATURE_TYPE Placemark OUTPUT FEATURE_TYPE Placemark_OGCKML_1 DEFAULT_MACRO WB_CURRENT_CONTEXT # ------------------------------------------------------------------------- FME_PYTHON_PATH "$(FME_MF_DIR)" FACTORY_DEF * PythonFactory FACTORY_NAME PythonCaller INPUT FEATURE_TYPE Placemark_OGCKML_1 SYMBOL_NAME processKmlData PYTHON_NAMESPACE FMEOBJECTS SOURCE_CODE import fme import fmeobjects def processKmlData feature : names = feature.getAttribute kml_data .name values = feature.getAttribute kml_data .value if not isinstance names list and isinstance values list : return num_attributes = len names if num_attributes != len values : return for i in range num_attributes : feature.setAttribute names i values i OUTPUT PYOUTPUT FEATURE_TYPE PythonCaller_OUTPUT # ------------------------------------------------------------------------- # 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]} {PythonCaller_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 PythonCaller_Output_DirCreator输出FEATURE_TYPE __nukeme__ @ TCL2( “捉{文件的mkdir {$(WORKSPACE_TEMP_DIR)}}”)FACTORY_DEF * TeeFactory FACTORY_NAME PythonCaller_Output_DirCreatorCleanerUpper INPUT FEATURE_TYPE __nukeme__#发送光栅,点云和载体功能下降不同的路径,以备#他们 viewing FACTORY_DEF * TestFactory FACTORY_NAME PythonCaller_Output_FeatureDirector INPUT FEATURE_TYPE PythonCaller_OUTPUT TEST &fme_type == "fme_raster" OUTPUT FAILED FEATURE_TYPE PythonCaller_Output___NotRasterFeatures___ OUTPUT PASSED FEATURE_TYPE PythonCaller_Output___RasterFeatures___ FACTORY_DEF * TestFactory FACTORY_NAME PythonCaller_Output___FeatureDirector1 INPUT FEATURE_TYPE PythonCaller_Output___NotRasterFeatures___ TEST &fme_type == "fme_point_cloud" OUTPUT FAILED FEATURE_TYPE PythonCaller_Output___VectorFeatures___ OUTPUT PASSED FEATURE_TYPE PythonCaller_Output___PointCloudFeatures___ # Vector features simply may get their colors overridden FACTORY_DEF * TeeFactory FACTORY_NAME PythonCaller_Output_VectorSetterUpper INPUT FEATURE_TYPE PythonCaller_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.这应该允许这种变压器具有#桌面授权使用,即使ThinPointCloud需要专业。TCL2 PROC PythonCaller_Output_5ffdac0b_f0ca_44f9_877b_d1645853c2fc1_thinPointCloud {} {如果{[串等于{NO_THINNING} {KEEPNPOINT}]} {FME_Execute ThinPointCloud NO_THINNING “\” \ “”;} elseif的{[串等于{NO_THINNING} {MAXNUMPOINTS}]} {FME_Execute ThinPointCloud NO_THINNING “\” \ “”;} elseif的{[串等于{NO_THINNING} {FIRSTNPOINTS}]} {FME_Execute ThinPointCloud NO_THINNING “\” \ “”;} elseif的{[串等于{NO_THINNING} {LASTNPOINTS}]} {FME_Execute ThinPointCloud NO_THINNING “\” \ “”;};} FACTORY_DEF * TeeFactory FACTORY_NAME PythonCaller_Output___PointCloudThinner INPUT FEATURE_TYPE PythonCaller_Output___PointCloudFeatures___ OUTPUT FEATURE_TYPE __viewme__ @ TCL2( “PythonCaller_Output_5ffdac0b_f0ca_44f9_877b_d1645853c2fc1_thinPointCloud”)TCL2 PROC PythonCaller_Output_5ffdac0b_f0ca_44f9_877b_d1645853c2fc1_prepareRaster {subsetStartRow subsetNumRows subsetStartCol subsetNumCols} {集useDI [字符串等于-nocase {$(FME_VIEWER_APP)} {fmedatainspector}];如果{$ useDI!} {FME_Execute ApplyRasterRotation双线性;};集doResample [字符串等于{NoReduction} {重新取样}];集doSubset [字符串等于{NoReduction} {子集}];集doBounds [字符串等于{NoReduction} {BoundingBoxOnly}];如果{$ doBounds} {FME_Execute GeometryType fme_polygon;} {ELSEIF $ doResample || $doSubset} { set comment { First, we need to prefix all the attributes.这样做是因为我们要调用@RasterProperties,我们要确保它不会覆盖所有现有属性。};设置kAttrPrefix “”;集allNames [FME_AttributeNames];的foreach使用oldName $ {allNames设置了newName $ kAttrPrefix;追加了newName $使用oldName;FME_RenameAttribute $ $了newName使用oldName;};FME_Execute RasterProperties光栅;如果{$ doResample} {集oldNumCols [FME_GetAttribute _num_columns];集oldNumRows [FME_GetAttribute _num_rows];集oldSpacingX [FME_GetAttribute _spacing_x];集oldSpacingY [FME_GetAttribute _spacing_y];集kMinNumCells 32;集kMaxNumCells 512;集评论{我们只会重新取样若有两个尺寸比最低NUM细胞更大,并且至少有一个是大于最大值。};如果{$ oldNumRows> $ kMinNumCells && $ oldNumCols> $ kMinNumCells &&($ oldNumRows> $ kMaxNumCells || $ oldNumCols> $ kMaxNumCells)} {设定newSpacingX 1.0;集newSpacingY 1.0;如果{$ oldNumRows> $ oldNumCols} {集评论{如果我们有比列更多的行,我们需要选择减少的行数,以我们所选择的最大间距。};集newSpacingY [EXPR 1.0 * $ oldNumRows * $ oldSpacingY / $ kMaxNumCells];集newSpacingX [EXPR 1.0 * $ newSpacingY / $ oldSpacingY * $ oldSpacingX];集评论{现在,我们需要检查,如果这样做将导致持续低于最低列。如果是这样,选择的间隔,使得我们只深入到最低(而不是过去)。};集newNumCols [EXPR $ oldNumCols * $ oldSpacingX / $ newSpacingX];如果{$ newNumCols <$ kMinNumCells} {设定newSpacingX [EXPR 1.0 * $ oldNumCols * $ oldSpacingX / $ kMinNumCells];集newSpacingY [EXPR 1.0 * $ newSpacingX / $ oldSpacingX * $ oldSpacingY];};}否则{集评论{这是与上述相同的情况下,除了行列数的作用是相反的。};集newSpacingX [EXPR 1.0 * $ oldNumCols * $ oldSpacingX / $ kMaxNumCells];集newSpacingY [EXPR 1.0 * $ newSpacingX / $ oldSpacingX * $ oldSpacingY];集newNumRows [EXPR $ oldNumRows * $ oldSpacingY / $ newSpacingY];如果{newNumRows < kMinNumCells美元}{newSpacingY设置 [expr 1.0 * $oldNumRows * $oldSpacingY / $kMinNumCells];集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设置了newName $ kAttrPrefix;追加了newName $使用oldName;FME_RenameAttribute $oldName $newName;};};} FACTORY_DEF * TeeFactory FACTORY_NAME PythonCaller_Output_RasterSetterUpper INPUT FEATURE_TYPE PythonCaller_Output___RasterFeatures___ OUTPUT FEATURE_TYPE __viewme__ @Tcl2("PythonCaller_Output_5ffdac0b_f0ca_44f9_877b_d1645853c2fc1_prepareRaster { } { } { } { }") # Now route all the features into the recorder, changing their # feature type to the transformer name so that they view nicely # PythonCaller_Output_5ffdac0b_f0ca_44f9_877b_d1645853c2fc1_VIS_FEAT_TYPE changes the feature types # of the features being visualized. DEFAULT_MACRO PythonCaller_Output_5ffdac0b_f0ca_44f9_877b_d1645853c2fc1_VIS_FEAT_TYPE PythonCaller_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 PythonCaller_Output_Recorder INPUT FEATURE_TYPE __viewme__ _wb_termination_feature Yes @FeatureType(TERMINATOR_@Value(_wb_termination_xformer)) INPUT FEATURE_TYPE __viewme__ @FeatureType($(PythonCaller_Output_5ffdac0b_f0ca_44f9_877b_d1645853c2fc1_VIS_FEAT_TYPE)) FEATURE_FILE "$(VISUALIZER_FEATURE_FILE)" CREATE_SPATIAL_INDEX "$(VISUALIZER_CREATE_SPATIAL_INDEX)" INSPECTOR "$(VISUALIZER_CREATE_SPATIAL_INDEX)" FSC_SCHEMA SatelliteId,varchar 255 ,DatatakeId,varchar 255 ,Mode,varchar 255 ,Swath,varchar 255 ,Polarisation,varchar 255 ,ObservationTimeStart,varchar 255 ,ObservationTimeStop,varchar 255 ,ObservationDuration,varchar 255 ,OrbitAbsolute,varchar 255 ,OrbitRelative,varchar 255 模式录制STORE_SCANNED_METADATA RECORD_DIRECTLY_TO_DISK是MAX_FEATURES_TO_RECORD WIN32 2000000#------------------------------------------------------------------------- FACTORY_DEF * RoutingFactory FACTORY_NAME "Destination Feature Type Routing Correlator" COMMAND_PARM_EVALUATION SINGLE_PASS INPUT FEATURE_TYPE * FEATURE_TYPE_ATTRIBUTE __wb_out_feat_type__ OUTPUT ROUTED FEATURE_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__