#! #! #! #! #! #! #! #! #! #! #! #! #! #! #! 邻居,最近邻%双线性,双线性%双三次,双三次内插类型 “最近邻 ”GUI WHOLE_LINE CHOICE geotiff_pyramid_tile_size 64%128%256%512%1024%2048%4096行/每瓦列“ 128” #号!ATTR_INDEX_TYPES = “” #!ATTR_NAME_INVALID_CHARS =”% - #[] “!?()*'&+ \ /”!#SUPPORTS_FEATURE_TYPE_FANOUT = “真”!#启用= “真”!#DYNAMIC_FEATURE_TYPES_LIST_ON_MERGE = “真”!#DATASET_TYPE = “FILEDIR” #!GENERATE_FME_BUILD_NUM = “17255” #!FANOUT_GROUP = “NO” #!COORDSYS = “” #!FANOUT_EXPRESSION = “” #!>#! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #!

红色

“#!位置=” - 1673.27 656.387" #TOP_LEFT =! “ - 1673.27 656.387” #BOTTOM_RIGHT =! “ - 1674.27 657.387”!#BOUNDING_RECT = “ - 1673.27 656.387 -1 -1”!#ORDER = “5E + 14” #! FOLLOW_ANCHOR="true" #! INFO_NODE="false" #! COLOUR="1,1,0.784314,0.192157" #! SIZE_POLICY="8" #! COMMENT_TYPE="REGULAR" #! ANCHORED_NODE="4" #! /> #!

Nir

" # !POSITION="-1670.14 354.755" #! TOP_LEFT="-1670.14 354.755" #! BOTTOM_RIGHT="-1671.14 355.755" #! BOUNDING_RECT="-1670.14 354.755 -1 -1" #! ORDER="5e+14" #! FOLLOW_ANCHOR="true" #! INFO_NODE="false" #! COLOUR="1,1,0.784314,0.192157" #! SIZE_POLICY="8" #! COMMENT_TYPE="REGULAR" #! ANCHORED_NODE="5" #! /> #!

NDVI (normalized difference vegetation index) is based on the ability of the plants to consume visible light radiation for photosynthesis (mostly in blue and red parts of the spectrum, this is why we see our plants mostly green, this color is mostly reflected).Near-infrared light, on the other hand, cannot cause the proper reaction in cells, and hence, is being reflected (otherwise it will overheat the plants).The more infrared light is reflected and the more red light is consumed, the healthier the plant is.

" # !POSITION="-1688.04 1450.27" #! TOP_LEFT="-1688.04 1450.27" #! BOTTOM_RIGHT="193.752 820.262" #! BOUNDING_RECT="-1688.04 1450.27 1881.79 630.006" #! ORDER="5e+14" #! FOLLOW_ANCHOR="true" #! INFO_NODE="false" #! COLOUR="1,1,0.784314,0.196078" #! SIZE_POLICY="10" #! COMMENT_TYPE="REGULAR" #! ANCHORED_NODE="0" #! /> #!

Calculate NDVI


NDVI changes from -1 to 1, where the bigger the number the healthier vegetation

(negative numbers usually mean no vegetation at all)

" # !POSITION="-1553.14 -174.377" #! TOP_LEFT="-1553.14 -174.377" #! BOTTOM_RIGHT="-1554.14 -173.377" #! BOUNDING_RECT="-1553.14 -174.377 -1 -1" #! ORDER="5e+14" #! FOLLOW_ANCHOR="true" #! INFO_NODE="false" #! COLOUR="1,1,0.784314,0.196078" #! SIZE_POLICY="8" #! COMMENT_TYPE="REGULAR" #! ANCHORED_NODE="6" #! /> #!

Go from continuous range to 4 discrete values

" # !POSITION="-612.506 688.132" #! TOP_LEFT="-612.506 688.132" #! BOTTOM_RIGHT="-613.506 689.132" #! BOUNDING_RECT="-612.506 688.132 -1 -1" #! ORDER="5e+14" #! FOLLOW_ANCHOR="true" #! INFO_NODE="false" #! COLOUR="1,1,0.784314,0.196078" #! SIZE_POLICY="8" #! COMMENT_TYPE="REGULAR" #! ANCHORED_NODE="16" #! /> #!

Create a palette for four values made in previous transformer

" # !POSITION="-340.629 41.2495" #! TOP_LEFT="-340.629 41.2495" #! BOTTOM_RIGHT="-341.629 42.2495" #! BOUNDING_RECT="-340.629 41.2495 -1 -1" #! ORDER="5e+14" #! FOLLOW_ANCHOR="true" #! INFO_NODE="false" #! COLOUR="1,1,0.784314,0.196078" #! SIZE_POLICY="8" #! COMMENT_TYPE="REGULAR" #! ANCHORED_NODE="15" #! /> #!

Add palette

" # !POSITION="821.883 675.631" #! TOP_LEFT="821.883 675.631" #! BOTTOM_RIGHT="820.883 676.631" #! BOUNDING_RECT="821.883 675.631 -1 -1" #! ORDER="5e+14" #! FOLLOW_ANCHOR="true" #! INFO_NODE="false" #! COLOUR="1,1,0.784314,0.196078" #! SIZE_POLICY="8" #! COMMENT_TYPE="REGULAR" #! ANCHORED_NODE="11" #! /> #!

Save as NDVI Geotiff file

" # !POSITION="1351.86 823.51" #! TOP_LEFT="1351.86 823.51" #! BOTTOM_RIGHT="1350.86 824.51" #! BOUNDING_RECT="1351.86 823.51 -1 -1" #! ORDER="5e+14" #! FOLLOW_ANCHOR="true" #! INFO_NODE="false" #! COLOUR="1,1,0.784314,0.196078" #! SIZE_POLICY="8" #! COMMENT_TYPE="REGULAR" #! ANCHORED_NODE="17" #! /> #!
#! #! #! #! #! #! #! #! #! #! #! B 0 -A 0 B 0 +A 0 ""/> #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! 0 0 0 64 1 255 255 0 2 0 255 0 3 0 127 0"/> #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! A 0 =0 0 if A 0 =0.3 1 if A 0 =0.6 2 3 ""/> #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #! #!
FME_PYTHON_VERSION 27 GUI IGNORE SourceDataset_JPEG2000_1,JPEG2000_IN_EXPOSE_ATTRS_GROUP_JPEG2000_1,JPEG2000_IN_SEARCH_ENVELOPE_MINX_JPEG2000_1,JPEG2000_IN_SEARCH_ENVELOPE_MINY_JPEG2000_1,JPEG2000_IN_SEARCH_ENVELOPE_MAXX_JPEG2000_1,JPEG2000_IN_SEARCH_ENVELOPE_MAXY_JPEG2000_1,JPEG2000_IN_SEARCH_ENVELOPE_COORDINATE_SYSTEM_JPEG2000_1,JPEG2000_IN_CLIP_TO_ENVELOPE_JPEG2000_1,JPEG2000_IN_JPEG2000_RDR_ADV_PARM_GROUP_JPEG2000_1,JPEG2000_IN_PREFER_FILE_CS_UNITS_JPEG2000_1,JPEG2000_IN_READ_OFFSETS_IN_CS_UNITS_JPEG2000_1,JPEG2000_IN_NETWORK_AUTHENTICATION_JPEG2000_1,DestDataset_GEOTIFF_1,GEOTIFF_OUT_GEOTIFF_WRT_ADV_PARM_GROUP_GEOTIFF_1,GEOTIFF_OUT_WRITE_OFFSETS_IN_CS_UNITS_GEOTIFF_1,GEOTIFF_OUT_WRITE_PROJECTED_COORDSYS_AS_EPSG_CODE_GEOTIFF_1,GEOTIFF_OUT_WRITE_GEOGRAPHIC_COORDSYS_AS_EPSG_CODE_GEOTIFF_1,GEOTIFF_OUT_WRITE_GEOGRAPHIC_KEYS_FOR_PROJECTED_COORDSYS_GEOTIFF_1,GEOTIFF_OUT_WRITE_ESRI_COMPATIBLE_COORDSYS_GEOTIFF_1,GEOTIFF_OUT_IGNORE_RASTER_TYPE_KEY_GEOTIFF_1 DEFAULT_MACRO SourceDataset_JPEG2。000 “” C:\ TEMP \ 27WVM20166220 \ B04.jp2" “C:\ TEMP \ 27WVM20166220 \ B08.jp2”” GUI多文件SourceDataset_JPEG2000 JPEG2000_Files(* JP2; * J2K; * JPF; * JPX; *。。JPM; * JP2000; * jp2k; * JPP)|是* .jp2;。。。。。。* J2K; * JPF; * JPX; * JPM; * JP2000; * jp2k; * JPP | All_Files(*)|* Source JPEG 2000 File(s): DEFAULT_MACRO DestDataset_GEOTIFF C:\TEMP\27WVM20166220 GUI DIRNAME DestDataset_GEOTIFF Destination GeoTIFF Folder: INCLUDE [ if {{$(SourceDataset_JPEG2000)} == {}} { puts_real {Parameter 'SourceDataset_JPEG2000' must be given a value.};出口1;};] INCLUDE [如果{{$(DestDataset_GEOTIFF)} {==}} {puts_real {参数 'DestDataset_GEOTIFF' 必须被给出的值}。出口1;};]#!START_HEADER#!START_WB_HEADER READER_TYPE JPEG2000 READER_KEYWORD JPEG2000_1 READER_GEN_DIRECTIVES SEARCH_ENVELOPE_MAXX,0,READER_META_ATTRIBUTES,fme_dataset fme_basename,CLIP_TO_ENVELOPE,NO,READ_OFFSETS_IN_CS_UNITS,不,JPEG2000_EXPOSE_FORMAT_ATTRS ,, JPEG2000_RDR_ADV_PARM_GROUP ,, SEARCH_ENVELOPE_MINX,0,SEARCH_ENVELOPE_COORDINATE_SYSTEM ,, EXPOSE_ATTRS_GROUP ,, SEARCH_ENVELOPE_MAXY,0,PREFER_FILE_CS_UNITS,是的,USE_SEARCH_ENVELOPE,NO,SEARCH_ENVELOPE_MINY,0,GROUP_BY_DATASET,是的,_MERGE_SCHEMAS,YES,_EXTRA_DATASETS,C: TEMP 27WVM20166220 B03.jp2 C: TEMP 27WVM20166220 B04.jp2 C: TEMP 27WVM20166220 B08.jp2 WRITER_TYPE MULTI_WRITER MULTI_WRITER_DATASET_ORDER BY_ID MULTI_WRITER_FIRST_WRITER_ID 0 MULTI_WRITER_TYPE{0} GEOTIFF MULTI_WRITER_KEYWORD{0} GEOTIFF_1 #!END_WB_HEADER#!START_WB_HEADER MACRO WB_KEYWORD "JPEG2000_1" #!END_WB_HEADER#!START_SOURCE_HEADER JPEG2000 JPEG2000_1 # ======================================================================= # The following GUI line prompts for a file to be used as the source JPEG2000 file.# The user input is stored in a macro, which is then used to define # the dataset to be read.# 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_JPEG2000_1 $(SourceDataset)} \ } ] #!END_WB_HEADER#!START_SOURCE_HEADER如JPEG2000 JPEG2000_1 DEFAULT_MACRO SourceDataset_JPEG2000_1 $(SourceDataset_JPEG2000) GUI MULTIFILE SourceDataset_JPEG2000_1 JPEG2000_Files(*.jp2;*.j2k;*.jpf;*.jpx;*.jpm;*.jp2000;*.jp2k;*.jpp)|*.jp2;*.j2k;*.jpf;*.jpx;*.jpm;*.jp2000;*.jp2k;*.jpp|All_Files(*)|* Source JPEG 2000 File(s): DEFAULT_MACRO JPEG2000_IN_READER_META_ATTRIBUTES_JPEG2000_1 fme_dataset fme_basename JPEG2000_1_READER_META_ATTRIBUTES "$(JPEG2000_IN_READER_META_ATTRIBUTES_JPEG2000_1)" DEFAULT_MACRO JPEG2000_IN_GROUP_BY_DATASET_JPEG2000_1 Yes JPEG2000_1_GROUP_BY_DATASET "$(JPEG2000_IN_GROUP_BY_DATASET_JPEG2000_1)" DEFAULT_MACRO JPEG2000_IN_EXPOSE_ATTRS_GROUP_JPEG2000_1 JPEG2000_1_EXPOSE_ATTRS_GROUP "$(JPEG2000_IN_EXPOSE_ATTRS_GROUP_JPEG2000_1)" GUI DISCLOSUREGROUP JPEG2000_IN_EXPOSE_ATTRS_GROUP_JPEG2000_1 JPEG2000_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 JPEG2000_IN_SEARCH_ENVELOPE_MINX_JPEG2000_1 0 JPEG2000_1_SEARCH_ENVELOPE "$(JPEG2000_IN_SEARCH_ENVELOPE_MINX_JPEG2000_1)" GUI OPTIONAL FLOAT JPEG2000_IN_SEARCH_ENVELOPE_MINX_JPEG2000_1 Minimum X: # =========================================================================== DEFAULT_MACRO JPEG2000_IN_SEARCH_ENVELOPE_MINY_JPEG2000_1 0 JPEG2000_1_SEARCH_ENVELOPE "$(JPEG2000_IN_SEARCH_ENVELOPE_MINY_JPEG2000_1)" GUI OPTIONAL FLOAT JPEG2000_IN_SEARCH_ENVELOPE_MINY_JPEG2000_1 Minimum Y: # =========================================================================== DEFAULT_MACRO JPEG2000_IN_SEARCH_ENVELOPE_MAXX_JPEG2000_1 0 JPEG2000_1_SEARCH_ENVELOPE "$(JPEG2000_IN_SEARCH_ENVELOPE_MAXX_JPEG2000_1)" GUI OPTIONAL FLOAT JPEG2000_IN_SEARCH_ENVELOPE_MAXX_JPEG2000_1 Maximum X: # =========================================================================== DEFAULT_MACRO JPEG2000_IN_SEARCH_ENVELOPE_MAXY_JPEG2000_1 0 JPEG2000_1_SEARCH_ENVELOPE "$(JPEG2000_IN_SEARCH_ENVELOPE_MAXY_JPEG2000_1)" GUI OPTIONAL FLOAT JPEG2000_IN_SEARCH_ENVELOPE_MAXY_JPEG2000_1 Maximum Y: # =========================================================================== DEFAULT_MACRO JPEG2000_IN_SEARCH_ENVELOPE_COORDINATE_SYSTEM_JPEG2000_1 JPEG2000_1_SEARCH_ENVELOPE "$(JPEG2000_IN_SEARCH_ENVELOPE_COORDINATE_SYSTEM_JPEG2000_1)" GUI OPTIONAL COORDSYS JPEG2000_IN_SEARCH_ENVELOPE_COORDINATE_SYSTEM_JPEG2000_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.# Defualt to soft clip as per the existing database readers we are emulating DEFAULT_MACRO JPEG2000_IN_CLIP_TO_ENVELOPE_JPEG2000_1 NO JPEG2000_1_CLIP_TO_ENVELOPE "$(JPEG2000_IN_CLIP_TO_ENVELOPE_JPEG2000_1)" GUI OPTIONAL CHECKBOX JPEG2000_IN_CLIP_TO_ENVELOPE_JPEG2000_1 YES%NO Clip to Search Envelope GUI DISCLOSUREGROUP JPEG2000_IN_JPEG2000_RDR_ADV_PARM_GROUP_JPEG2000_1 PREFER_FILE_CS_UNITS%READ_OFFSETS_IN_CS_UNITS Advanced DEFAULT_MACRO JPEG2000_IN_PREFER_FILE_CS_UNITS_JPEG2000_1 Yes JPEG2000_1_PREFER_FILE_CS_UNITS "$(JPEG2000_IN_PREFER_FILE_CS_UNITS_JPEG2000_1)" GUI CHOICE JPEG2000_IN_PREFER_FILE_CS_UNITS_JPEG2000_1 Yes%No Prefer File Coordinate System Units: DEFAULT_MACRO JPEG2000_IN_READ_OFFSETS_IN_CS_UNITS_JPEG2000_1 No JPEG2000_1_READ_OFFSETS_IN_CS_UNITS "$(JPEG2000_IN_READ_OFFSETS_IN_CS_UNITS_JPEG2000_1)" GUI CHOICE JPEG2000_IN_READ_OFFSETS_IN_CS_UNITS_JPEG2000_1 Yes%No Offsets in Coordinate System Units: # =========================================================================== DEFAULT_MACRO JPEG2000_IN_NETWORK_AUTHENTICATION_JPEG2000_1 JPEG2000_1_NETWORK_AUTHENTICATION "$(JPEG2000_IN_NETWORK_AUTHENTICATION_JPEG2000_1)" GUI OPTIONAL AUTHENTICATOR JPEG2000_IN_NETWORK_AUTHENTICATION_JPEG2000_1 CONTAINER%GROUP%CONTAINER_TITLE%"Network Authentication"%PROMPT_TYPE%NETWORK Network Authentication # =========================================================================== DEFAULT_MACRO JPEG2000_IN_ATTRIBUTE_READING_JPEG2000_1 ALL JPEG2000_1_ATTRIBUTE_READING "$(JPEG2000_IN_ATTRIBUTE_READING_JPEG2000_1)" JPEG2000_1_DATASET "$(SourceDataset_JPEG2000_1)" #!END_SOURCE_HEADER #!START_WB_HEADER MACRO WB_KEYWORD "GEOTIFF_1" #!END_WB_HEADER#!START_DEST_HEADER GEOTIFF GEOTIFF_1 # The following GUI lines prompt for a GEOTIFF file to be used as the # the destination of the data.# The user input is stored in a macro, which is then used to define # the dataset to be written.#!END_DEST_HEADER#!START_WB_HEADER DEFAULT_MACRO DestDataset INCLUDE [ if {"$(DestDataset)" != ""} { \ puts {DEFAULT_MACRO DestDataset_GEOTIFF_1 $(DestDataset)} \ } ] #!END_WB_HEADER#!START_DEST_HEADER的GeoTIFF GEOTIFF_1 DEFAULT_MACRO DestDataset_GEOTIFF_1 $(DestDataset_GEOTIFF)GUI DIRNAME DestDataset_GEOTIFF_1目标的GeoTIFF文件夹:DEFAULT_MACRO _GEOTIFF_WRITER_WORLD_FILE_GENERATION_GEOTIFF_1没有DEFAULT_MACRO _GEOTIFF_WRITER_CREATE_TILED_FILES_GEOTIFF_1没有DEFAULT_MACRO _GEOTIFF_WRITER_TILE_SIZE_X_GEOTIFF_1 DEFAULT_MACRO _GEOTIFF_WRITER_TILE_SIZE_Y_GEOTIFF_1 DEFAULT_MACRO _GEOTIFF_WRITER_COMPRESSION_METHOD_GEOTIFF_1没有DEFAULT_MACRO _GEOTIFF_WRITER_JPEG_COMPRESSION_LEVEL_GEOTIFF_1 25 DEFAULT_MACRO _GEOTIFF_WRITER_TAB_FILE_GENERATION_GEOTIFF_1没有DEFAULT_MACRO _GEOTIFF_WRITER_NUMBER_OF_BITS_PER_CELL_GEOTIFF_1 DEFAULT_MACRO _GEOTIFF_WRITER_ENABLE_BIGTIFF_GEOTIFF_1没有DEFAULT_MACRO _GEOTIFF_WRITER_INTERLEAVING_TYPE_GEOTIFF_1 BSQ DEFAULT_MACRO _GEOTIFF_WRITER_PHOTOMETRIC_INTERPRETATION_GEOTIFF_1自动DEFAULT_MACRO _GEOTIFF_WRITER_BYTE_ORDER_GEOTIFF_1机DEFAULT_MACRO _GEOTIFF_WRITER_CALCULATE_MINMAX_TIFFTAGS_GEOTIFF_1 no DEFAULT_MACRO _GEOTIFF_WRITER_PYRAMID_NUM_LEVELS_GEOTIFF_1 DEFAULT_MACRO _GEOTIFF_WRITER_PYRAMID_INTERPOLATION_TYPE_GEOTIFF_1 NearestNeighbor DEFAULT_MACRO _GEOTIFF_WRITER_PYRAMID_TILE_SIZE_GEOTIFF_1 128 GUI DISCLOSUREGROUP GEOTIFF_OUT_GEOTIFF_WRT_ADV_PARM_GROUP_GEOTIFF_1 FME_DISCLOSURE_OPEN%WRITE_OFFSETS_IN_CS_UNITS%WRITE_PROJECTED_COORDSYS_AS_EPSG_CODE%WRITE_GEOGRAPHIC_COORDSYS_AS_EPSG_CODE%WRITE_GEOGRAPHIC_KEYS_FOR_PROJECTED_COORDSYS%WRITE_ESRI_COMPATIBLE_COORDSYS%IGNORE_RASTER_TYPE_KEY Advanced DEFAULT_MACRO GEOTIFF_OUT_WRITE_OFFSETS_IN_CS_UNITS_GEOTIFF_1 Yes GEOTIFF_1_WRITE_OFFSETS_IN_CS_UNITS "$(GEOTIFF_OUT_WRITE_OFFSETS_IN_CS_UNITS_GEOTIFF_1)" GUI CHOICE GEOTIFF_OUT_WRITE_OFFSETS_IN_CS_UNITS_GEOTIFF_1 Yes%No Offsets in Coordinate System Units: DEFAULT_MACRO GEOTIFF_OUT_WRITE_PROJECTED_COORDSYS_AS_EPSG_CODE_GEOTIFF_1 Yes GEOTIFF_1_WRITE_PROJECTED_COORDSYS_AS_EPSG_CODE "$(GEOTIFF_OUT_WRITE_PROJECTED_COORDSYS_AS_EPSG_CODE_GEOTIFF_1)" GUI CHOICE GEOTIFF_OUT_WRITE_PROJECTED_COORDSYS_AS_EPSG_CODE_GEOTIFF_1 Yes%No Write Projected Coordinate System as EPSG Code: DEFAULT_MACRO GEOTIFF_OUT_WRITE_GEOGRAPHIC_COORDSYS_AS_EPSG_CODE_GEOTIFF_1 Yes GEOTIFF_1_WRITE_GEOGRAPHIC_COORDSYS_AS_EPSG_CODE "$(GEOTIFF_OUT_WRITE_GEOGRAPHIC_COORDSYS_AS_EPSG_CODE_GEOTIFF_1)" GUI CHOICE GEOTIFF_OUT_WRITE_GEOGRAPHIC_COORDSYS_AS_EPSG_CODE_GEOTIFF_1 Yes%No Write Geographic Coordinate System as EPSG Code: DEFAULT_MACRO GEOTIFF_OUT_WRITE_GEOGRAPHIC_KEYS_FOR_PROJECTED_COORDSYS_GEOTIFF_1 Yes GEOTIFF_1_WRITE_GEOGRAPHIC_KEYS_FOR_PROJECTED_COORDSYS "$(GEOTIFF_OUT_WRITE_GEOGRAPHIC_KEYS_FOR_PROJECTED_COORDSYS_GEOTIFF_1)" GUI CHOICE GEOTIFF_OUT_WRITE_GEOGRAPHIC_KEYS_FOR_PROJECTED_COORDSYS_GEOTIFF_1 Yes%No Write Geographic Keys for Projected Coordinate Systems: DEFAULT_MACRO GEOTIFF_OUT_WRITE_ESRI_COMPATIBLE_COORDSYS_GEOTIFF_1 No GEOTIFF_1_WRITE_ESRI_COMPATIBLE_COORDSYS "$(GEOTIFF_OUT_WRITE_ESRI_COMPATIBLE_COORDSYS_GEOTIFF_1)" GUI CHOICE GEOTIFF_OUT_WRITE_ESRI_COMPATIBLE_COORDSYS_GEOTIFF_1 Yes%No Write Esri-Compatible Coordinate System: DEFAULT_MACRO GEOTIFF_OUT_IGNORE_RASTER_TYPE_KEY_GEOTIFF_1 No GEOTIFF_1_IGNORE_RASTER_TYPE_KEY "$(GEOTIFF_OUT_IGNORE_RASTER_TYPE_KEY_GEOTIFF_1)" GUI CHOICE GEOTIFF_OUT_IGNORE_RASTER_TYPE_KEY_GEOTIFF_1 Yes%No Ignore Raster Type Key: # ============================================================================ # Opt in for destination dataset type vs format type validation DEFAULT_MACRO GEOTIFF_OUT_DESTINATION_DATASETTYPE_VALIDATION_GEOTIFF_1 Yes GEOTIFF_1_DESTINATION_DATASETTYPE_VALIDATION "$(GEOTIFF_OUT_DESTINATION_DATASETTYPE_VALIDATION_GEOTIFF_1)" DEFAULT_MACRO GEOTIFF_OUT_COORDINATE_SYSTEM_GRANULARITY_GEOTIFF_1 FEATURE GEOTIFF_1_COORDINATE_SYSTEM_GRANULARITY "$(GEOTIFF_OUT_COORDINATE_SYSTEM_GRANULARITY_GEOTIFF_1)" GEOTIFF_1_DATASET "$(DestDataset_GEOTIFF_1)" #!END_DEST_HEADER#!START_WB_HEADER#!END_WB_HEADER#!END_HEADER WRITER_TYPE零WRITER_KEYWORD WBROUTER_OUT WBROUTER_OUT_DATASET null LOG_END_BANNER LOG_END_BANNER *** All writer output has been redirected to the Data Inspector *** LOG_END_BANNER LOG_FILENAME "$(FME_MF_DIR)PalettesExercise.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_TIMINGS YES LOG_FILTER_MASK -1 DEFAULT_MACRO DATASET_KEYWORD_JPEG2000_1 JPEG2000_1 DEFAULT_MACRO DATASET_KEYWORD_GEOTIFF_1 GEOTIFF_1 # ------------------------------------------------------------------------- JPEG2000_1_READER_META_ATTRIBUTES fme_basename fme_feature_type # ------------------------------------------------------------------------- MULTI_READER_CONTINUE_ON_READER_FAILURE No # ------------------------------------------------------------------------- MACRO WORKSPACE_NAME PalettesExercise 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 # ------------------------------------------------------------------------- JPEG2000_1_DEF B08 # ------------------------------------------------------------------------- JPEG2000_1_DEF B04 # ------------------------------------------------------------------------- FACTORY_DEF * RoutingFactory FACTORY_NAME "Router and Unexpected Input Remover" COMMAND_PARM_EVALUATION SINGLE_PASS MULTI_READER_KEYWORD JPEG2000_1 INPUT FEATURE_TYPE * ROUTE JPEG2000 JPEG2000_1::B08 TO FME_GENERIC ::B08 ALIAS_GEOMETRY ROUTE JPEG2000 JPEG2000_1::B04 TO FME_GENERIC ::B04 ALIAS_GEOMETRY MERGE_INPUT Yes OUTPUT ROUTED FEATURE_TYPE * JPEG2000_1_MERGE_DEF JPEG2000_1::B08 EXACT B08 JPEG2000_1_MERGE_DEF JPEG2000_1::B04 EXACT B04 # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME "B08 (JPEG2000_1) Splitter" INPUT FEATURE_TYPE B08 OUTPUT FEATURE_TYPE B08_JPEG2000_1 # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME "B04 (JPEG2000_1) Splitter" INPUT FEATURE_TYPE B04 OUTPUT FEATURE_TYPE B04_JPEG2000_1 DEFAULT_MACRO WB_CURRENT_CONTEXT # ------------------------------------------------------------------------- FACTORY_DEF * RasterEvaluationFactory FACTORY_NAME RasterExpressionEvaluator INPUT A FEATURE_TYPE B04_JPEG2000_1 INPUT B FEATURE_TYPE B08_JPEG2000_1 INTERPRETATION_LIST "AUTO" EXPRESSION_LIST " B 0 -A 0 B 0 +A 0 " FORCE_FLOAT_DIVISION yes OUTPUT RESULT FEATURE_TYPE RasterExpressionEvaluator_RESULT # ------------------------------------------------------------------------- FACTORY_DEF * RasterEvaluationFactory FACTORY_NAME RasterExpressionEvaluator_2 INPUT A FEATURE_TYPE RasterExpressionEvaluator_RESULT INTERPRETATION_LIST "UINT8" EXPRESSION_LIST "if A 0 =0 0 if A 0 =0.3 1 if A 0 =0.6 2 3 " FORCE_FLOAT_DIVISION yes OUTPUT RESULT FEATURE_TYPE RasterExpressionEvaluator_2_RESULT # ------------------------------------------------------------------------- FACTORY_DEF * AttrSetFactory FACTORY_NAME AttributeCreator INPUT FEATURE_TYPE RasterExpressionEvaluator_2_RESULT MULTI_FEATURE_MODE NO NULL_ATTR_MODE NO_OP ATTRSET_CREATE_DIRECTIVES _PROPAGATE_MISSING_FDIV ATTR_ACTION "" "_palette" "SET_TO" "RGB24 0 0 0 64 1 255 255 0 2 0 255 0 3 0 127 0" OUTPUT OUTPUT FEATURE_TYPE AttributeCreator_OUTPUT # ------------------------------------------------------------------------- FACTORY_DEF * TeeFactory FACTORY_NAME RasterPaletteAdder INPUT FEATURE_TYPE AttributeCreator_OUTPUT OUTPUT FEATURE_TYPE RasterPaletteAdder_OUTPUT @RasterPaletteAttributes(ADD, _palette) # ------------------------------------------------------------------------- FACTORY_DEF * RoutingFactory FACTORY_NAME "Destination Feature Type Routing Correlator" COMMAND_PARM_EVALUATION SINGLE_PASS INPUT FEATURE_TYPE * ROUTE FME_GENERIC RasterPaletteAdder_OUTPUT TO GEOTIFF __GO_TO_FINAL_OUTPUT_ROUTER__ multi_writer_id,0, SupplyAttributes ENCODED __wb_out_feat_type__ NDVI 几何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__ # 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]} {NDVI} _]_[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 NDVI_DirCreator OUTPUT FEATURE_TYPE __nukeme__ @Tcl2("catch {file mkdir {$(WORKSPACE_TEMP_DIR)}}") FACTORY_DEF * TeeFactory FACTORY_NAME NDVI_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 NDVI_FeatureDirector INPUT FEATURE_TYPE NDVI TEST &fme_type == "fme_raster" OUTPUT FAILED FEATURE_TYPE NDVI___NotRasterFeatures___ OUTPUT PASSED FEATURE_TYPE NDVI___RasterFeatures___ FACTORY_DEF * TestFactory FACTORY_NAME NDVI___FeatureDirector1 INPUT FEATURE_TYPE NDVI___NotRasterFeatures___ TEST &fme_type == "fme_point_cloud" OUTPUT FAILED FEATURE_TYPE NDVI___VectorFeatures___ OUTPUT PASSED FEATURE_TYPE NDVI___PointCloudFeatures___ # Vector features simply may get their colors overridden FACTORY_DEF * TeeFactory FACTORY_NAME NDVI_VectorSetterUpper INPUT FEATURE_TYPE NDVI___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 NDVI_cc8eaaf1_2371_4c0d_97b1_7d6b13e680ad0_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 NDVI___PointCloudThinner INPUT FEATURE_TYPE NDVI___PointCloudFeatures___ OUTPUT FEATURE_TYPE __viewme__ @Tcl2("NDVI_cc8eaaf1_2371_4c0d_97b1_7d6b13e680ad0_thinPointCloud") Tcl2 proc NDVI_cc8eaaf1_2371_4c0d_97b1_7d6b13e680ad0_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];设置newSpacingX [expr 1.0 * newSpacingY / oldSpa美元cingY * $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];设置newSpacingX [expr 1.0 * newSpacingY / oldSpa美元cingY * $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 NDVI_RasterSetterUpper INPUT FEATURE_TYPE NDVI___RasterFeatures___ OUTPUT FEATURE_TYPE __viewme__ @Tcl2("NDVI_cc8eaaf1_2371_4c0d_97b1_7d6b13e680ad0_prepareRaster { } { } { } { }") # Now route all the features into the recorder, changing their # feature type to the transformer name so that they view nicely # NDVI_cc8eaaf1_2371_4c0d_97b1_7d6b13e680ad0_VIS_FEAT_TYPE changes the feature types # of the features being visualized. DEFAULT_MACRO NDVI_cc8eaaf1_2371_4c0d_97b1_7d6b13e680ad0_VIS_FEAT_TYPE NDVI$(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 NDVI_Recorder INPUT FEATURE_TYPE __viewme__ _wb_termination_feature Yes @FeatureType(TERMINATOR_@Value(_wb_termination_xformer)) INPUT FEATURE_TYPE __viewme__ @FeatureType($(NDVI_cc8eaaf1_2371_4c0d_97b1_7d6b13e680ad0_VIS_FEAT_TYPE)) FEATURE_FILE "$(VISUALIZER_FEATURE_FILE)" CREATE_SPATIAL_INDEX "$(VISUALIZER_CREATE_SPATIAL_INDEX)" INSPECTOR "$(VISUALIZER_CREATE_SPATIAL_INDEX)" FSC_SCHEMA fme_basename,varchar 255 模式记录STORE_SCANNED_METADATA RECORD_DIRECTLY_TO_DISK YES MAX_FEATURES_TO_RECORD WIN32 2000000 FACTORY_DEF * TeeFactory FACTORY_NAME "NDVI Output Nuker" INPUT FEATURE_TYPE NDVI # ------------------------------------------------------------------------- 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__ # ------------------------------------------------------------------------- GEOTIFF_1_DEF NDVI geotiff_world_file_generation no geotiff_create_tiled_files no geotiff_tile_size_x "" geotiff_tile_size_y "" geotiff_compression_method none geotiff_jpeg_compression_level 25 geotiff_tab_file_generation no geotiff_number_of_bits_per_cell "" geotiff_enable_bigtiff no geotiff_interleaving_type BSQ geotiff_photometric_interpretation Auto geotiff_byte_order machine geotiff_calculate_minmax_tifftags no geotiff_generate_pyramids NO WBROUTER_OUT_DEF NDVI