Syntax @Geometry(FROM_ENCODED_STRING, ) @Geometry(FROM_ATTRIBUTE, ) @Geometry(FROM_ATTRIBUTE_BINARY, ) @Geometry(FROM_ATTRIBUTE_BINARY_HEX, ) @Geometry(FROM_ATTRIBUTE_H3, ) @Geometry(FIND_SURFACE_FOOTPRINT, [, , , ][, ]) @Geometry(TO_ATTRIBUTE, ) @Geometry(TO_ATTRIBUTE_BINARY, ) @Geometry(TO_ATTRIBUTE_BINARY_HEX, ) @Geometry(SET_PROPERTIES, ELLIPSE, [], [], [], [], [], [], []) @Geometry(SET_PROPERTIES, ARC, [], [], [], [], [], [], [], [], [], [], [], [], [], []) @Geometry(SET_PROPERTIES, ARCCENTER, [], [], [], [], [], [], [], []) @Geometry(SET_PROPERTIES, ARC3POINTS, [], [], [], [], [], [], [], [], []) @Geometry(SET_PROPERTIES, ARCBULGE, [], [], [], [], [], [], []) @Geometry(SET_PROPERTIES, TEXT, [], [], []) @Geometry(SET_PROPERTIES, TEXT, [], [], [], [], [], []) @Geometry(SET_PROPERTIES, POINT, AXIS_ANGLE, , , , ) @Geometry(SET_PROPERTIES, POINT, AZIMUTH_ALTITUDE, [, ]) @Geometry(SET_PROPERTIES, POINT, MATRIX, , , , , , , , , ) @Geometry(SET_PROPERTIES, POINT, QUATERNION, , , , ) @Geometry(SET_PROPERTIES, POINT, EULER_ANGLES, , , ) @Geometry(SET_PROPERTIES, POINT, TAIT_BRYAN_ANGLES, , , ) @Geometry(SET_PROPERTIES, POINT, 2DROTATION, <2DRotation>) @Geometry(SET_PROPERTIES, POINT, NORMAL_SPIN, , , [, ]) @Geometry(SET_PROPERTIES, POINT, REMOVE_ORIENTATION) @Geometry(GET_PROPERTIES, ELLIPSE, [], [], [], [], [], [], []) @Geometry(GET_PROPERTIES, ARC, [], [], [], [], [], [], [], [], [], [], [], [], [], []) @Geometry(GET_PROPERTIES, ARCCENTER, [], [], [], [], [], [], [], []) @Geometry(GET_PROPERTIES, ARC3POINTS, [], [], [], [], [], [], [], [], []) @Geometry(GET_PROPERTIES, ARCBULGE, [], [], [], [], [], [], []) @Geometry(GET_PROPERTIES, TEXT, [], [], []) @Geometry(GET_PROPERTIES, POINT, AXIS_ANGLE, , , , ) @Geometry(GET_PROPERTIES, POINT, AZIMUTH_ALTITUDE, [, ]) @Geometry(GET_PROPERTIES, POINT, MATRIX, , , , , , , , , ) @Geometry(GET_PROPERTIES, POINT, QUATERNION, , , , ) @Geometry(GET_PROPERTIES, POINT, EULER_ANGLES, , , ) @Geometry(GET_PROPERTIES, POINT, TAIT_BRYAN_ANGLES, , , ) @Geometry(GET_PROPERTIES, POINT, 2DROTATION, <2DRotationAttr>) @Geometry(GET_PROPERTIES, POINT, NORMAL_SPIN, , , [, ]) @Geometry([REJECTABLE], SET_MEASURES, POINT, , []) @Geometry([REJECTABLE], SET_MEASURES, VERTEX, , , []) @Geometry([REJECTABLE], SET_MEASURES, LINE, {}, []) @Geometry([REJECTABLE], SET_MEASURES, AREA, {}, []) @Geometry([REJECTABLE], SET_MEASURES, ARC, , , []) @Geometry([REJECTABLE], SET_MEASURES, ARC3POINTS, , , , []) @Geometry([REJECTABLE], SET_MEASURES, ALL, value, [measureName]) @Geometry(GET_MEASURES, POINT, , []) @Geometry(GET_MEASURES, VERTEX, , , []) @Geometry(GET_MEASURES, LINE, {}, []) @Geometry(GET_MEASURES, AREA, {}, []) @Geometry(GET_MEASURES, ARC, , , []) @Geometry(GET_MEASURES, ARC3POINTS, , , , []) @Geometry(REMOVE_MEASURES, (|"")) @Geometry(REMOVE_ALL_MEASURES) @Geometry([REJECTABLE], ADD_TEXT, , [], []) @Geometry(REMOVE_TEXT) @Geometry(PART_COUNT, (NONRECURSIVE|RECURSIVE)) @Geometry(REMOVE_DUPLICATE_COORDS|REMOVE_DUPLICATE_COORDS_2D) @Geometry(CREATE_DONUT_BRIDGES) @Geometry(IS_CONVEX) @Geometry(IS_PLANAR, [, , , ] [, ]) @Geometry(SET_TO_CONTAIN_INDIVIDUAL_GEOMS, ) @Geometry([REJECTABLE], CONTAINS_INDIVIDUAL_GEOMS) @Geometry(GET_APPEARANCE_REF, [newFrontSideAttr], [newBackSideAttr]) @Geometry(SET_APPEARANCE_REF, [newFrontIntegerVal], [newBackIntegerVal]) @Geometry(REMOVE_APPEARANCE_REF, FRONT_SIDE|BACK_SIDE|DOUBLE_SIDE) @Geometry(GET_GEOMETRY_DEFINITION_REF, [currentGeomDefIntegerVal]) @Geometry(SET_GEOMETRY_DEFINITION_REF, [newGeomDefIntegerVal]) @Geometry(fme_simplify_tiler_geometry,geomName) @Geometry(fme_set_poly_border_name, geomName) @Geometry(ASSIGN_TEXTURE_COORDINATES, MODE [, widthScale, heightScale, widthOffset, heightOffset]) @Geometry(IS_GEOMETRY_INSTANCE) @Geometry(INSTANTIATE_GEOMETRY_INSTANCE, ) @Geometry(FIX_FMETYPE_FMEGEOMETRY) @Geometry(IS_COLLECTION) @Geometry(IS_CLOSED_LOOP, CHECK_NODE_ELEVATION) @Geometry(DELETE_SOURCE_DATASET) @Geometry(SET_FEATURE_TABLE_FLAG [, ?] , ) Arguments Described below. Description @Geometry provides a number of ways to retrieve properties of a feature's geometry, and to replace or modify the geometry. The FROM_ modes replace the feature's entire geometry with the one specified. FROM_ENCODED_STRING is used by the Creator transformer, which supplies in Parseable Encoded FME XML. FROM_ATTRIBUTE, FROM_ATTRIBUTE_BINARY, and FROM_ATTRIBUTE_BINARY_HEX expect to specify an attribute containing the result of a previous @Geometry call using TO_ATTRIBUTE, TO_ATTRIBUTE_BINARY, or TO_ATTRIBUTE_BINARY_HEX, respectively. The TO_ modes create an attribute named by , whose value will be a description of the feature's current geometry. TO_ATTRIBUTE creates the attribute in FME XML. TO_ATTRIBUTE_BINARY uses an internal binary representation of the geometry. This is generally the most efficient way to store and retrieve the geometry's description. The next most efficient storage method is to use TO_ATTRIBUTE_BINARY_HEX, which stores the internal binary representation, encoded as hexadecimal digits. This can be used if the resultant attribute value must be stored in a format which cannot handle binary data. The SET_PROPERTIES and GET_PROPERTIES modes will change (or retrieve) the properties of geometries matching the given type (POINT, ELLIPSE, ARC, or TEXT). If the geometry is of a different type (e.g. the function argument is ARC and the geometry is a polygon), the feature will be left unmodified. In the SET_ modes, each property value may be given as a constant, a value-of expression - &attribute, or an FME function call - @Value(attr). In the GET_ modes, each argument specifies the name of the attribute into which to store the respective value. The FIND_SURFACE_FOOTPRINT mode will replace a geometry with a polygon representing its shadow, which is generated in one of three ways (specified by shadow_type). If the specified shadow type is "overhead shadow", the shadow polygon will simply be the area that the geometry occupies when observed from an overhead view. The two other shadow types both use a light source vector that is specified by light_x, light_y, and light_z. "Drop shadow" results in the shadow that the geometry would cast on the ground, while "perpendicular shadow" results in a shadow for the area of the light that is blocked off by the geometry, perpendicular to the light source. The attribute "fme_rejection_code" is added to null geometries. The "offset" is the z value given to the Overhead and DropShadow modes. The SET_MEASURES and GET_MEASURES modes will supply (or retrieve) the measures (with the given name, or the default measures if no measure name is supplied) of geometries matching the given type. If the geometry is of a different type (e.g. the function argument is LINE and the geometry is a point), the feature will not be modified. The parameters are treated in a similar fashion as in the _PROPERTIES modes described above. If no is given, the default measure will be set/retrieved. Note: When setting line measures, the values to be used must exist on the feature as an attribute list. If the list has fewer elements than the line has points, the remaining values will be set to NaN and a warning will be logged. If an arc, or a path containing arcs, is found either by itself or as an area boundary, each arc will have measures set on its endpoints, and also on its midpoint if it currently returns FME_ARC_BY_3_POINTS from optimalArcTypeRetrieval(). REMOVE_MEASURES takes a single argument to specify the measures to remove; it can be blank to indicate the default measures. This mode will only have an effect if the feature's geometry is a point, line, arc, or path; i.e. if the geometry is an aggregate or multi its component geometries will not be affected. REMOVE_ALL_MEASURES, on the other hand, will delete all measures present at any level of the feature's geometry. The _PROPERTIES and _MEASURES modes all have optional parameters (indicated by square brackets). For any parameter omitted, the respective value will be unmodified (in a SET_ mode), or will not be retrieved into an attribute (in a GET_ mode). ADD_TEXT will result in a text geometry having the feature's previous geometry as its location. REMOVE_TEXT will extract the text's location and set it as the feature's geometry. (Nothing will result from a REMOVE_TEXT call on a non-text geometry.) The PART_COUNT option will cause @Geometry to return the number of parts in the geometry. For multis and aggregates, this is the number of parts, for paths, the number of segments, and for donuts, the number of shells (outer and inner); otherwise it is one. If RECURSIVE is given then aggregates' parts will also have their parts counted. Note: This recursion never causes the count to descend into area boundaries which are paths - that is, a polygon is always considered one part, a donut's number of parts is always the number of boundaries, even if some of the boundaries are paths. In a multiarea, RECURSIVE does cause member donuts' shells to be counted. In the REMOVE_DUPLICATE_COORDS and REMOVE_DUPLICATE_COORDS_2D modes, all elements of the geometry that are lines will be checked for duplicate coordinates. Any consecutive coordinates with the same location will be reduced to a single coordinate. Only X, Y, and possibly Z values are considered in comparing coordinates for equality-measures are ignored. (Z values are also ignored if the mode is REMOVE_DUPLICATE_COORDS_2D.) The CREATE_DONUT_BRIDGES option is used to build connections between holes with the outer boundary in donut polygons. The result is a polygon-equivalent representation of the input donut. A single, connected path visits the boundary and each donut hole exactly once. This action is performed on all donuts contained in an input feature. The generated polygon boundary is guaranteed to be non self-intersecting if the input feature is properly oriented. Input features that have faulty donut topology may be rejected, and these features are marked with the additional attribute _fme_donutbridge_failure_. In IS_CONVEX mode, if the feature's geometry is polygon-based then the composing polygons will be checked for convexity. If all of them are convex, the return value will be CONVEX; otherwise it will be CONCAVE. If the feature's geometry is not polygon-based, UNDEFINED will be returned. In IS_PLANAR mode, the feature's geometry will be checked for planarity within the given tolerance and optionally with respect to a given normal. For instance, with a normal of (0, 0, 1), the function will check whether all the geometry's coordinates lie in the same X/Y plane (i.e. have the same Z values). If no normal is given then the coordinates must lie in the same plane, but that may be any plane. If the geometry is an area, surface, multiarea, or multisurface, a PLANAR/NOT_PLANAR return value is given. For other geometries, UNDEFINED is returned. The modes SET_TO_CONTAIN_INDIVIDUAL_GEOMS and CONTAINS_INDIVIDUAL_GEOMS both relate to how aggregate geometries are interpreted. In FME, an aggregate can be used to store separate, independent geometries. This can be useful in scenarios where multiple separate geometries per feature are needed. For example, a database writer that supports this concept may then write out each individual geometry to its own geometry column. The SET_TO_CONTAIN_INDIVIDUAL_GEOMS mode provides the ability to set up an aggregate where each part is independent from the others. This is accomplished by setting the second argument to YES. When the second argument is NO, the aggregate will represent a single geometry comprising of multiple parts. This function returns SUCCESS when called on aggregate features, and INVALID for all other geometries. In the CONTAINS_INDIVIDUAL_GEOMS mode, CONTAINS is returned if the aggregate is set up such that each part is independent from the others, and NOT_CONTAINS is returned on all other aggregates. Non-aggregate features return INVALID. The GET_APPEARANCE_REF option is used to get the appearance reference(s) of a surface or multisurface as attributes specified in the newFrontSideAttr and newBackSideAttr.If the value of the attributes is -1, it means that the side of the surface or multisurface does not exist. The SET_APPEARANCE_REF option is used to set the appearance reference(s) of a surface or multisurface with the values specified in newFrontIntegerVal and newBackIntegerVal.These values must be greater than or equal to 0 and this mode does not check the existence of the appearances that these values refer to. It also does nothing if the side of the surface or multisurface does not exist. The REMOVE_APPEARANCE_REF option is used to remove the appearance reference(s) of a surface or multisurface.If FRONT_SIDED, BACK_SIDE or DOUBLE_SIDE is specified, then only the appearance reference of the front side, back side or both sides is removed. It has no effect if the side(s) specified does not exist. The IS_GEOMETRY_INSTANCE option tests whether the feature holds a geometry instance. The FIX_FMETYPE_FMEGEOMETRY mode updates the feature's fme_type and fme_geometry attributes to match the actual geometry of the feature. The INSTANTIATE_GEOMETRY_INSTANCE mode will instantiate a top-level geometry instance when set to NO, and recursively when set to YES. The IS_COLLECTION mode tests whether the feature is a collection. The IS_CLOSED_LOOP mode checks if the start and end points of lines are the same. The CHECK_NODE_ELEVATION parameter specifies whether the z values must also be the same. The DELETE_SOURCE_DATASET mode specifies that the source dataset of the geometry should be deleted when it is no longer needed. This mode only works on certain geometries (such as rasters and point clouds) that were read from readers that support this option. The REJECTABLE keyword specifies that the feature can be assigned fme_rejection_code attribute and get rejected instead of what it is used to do. In SET_FEATURE_TABLE_FLAG mode, the function sets to "Yes" if the feature is a feature table and to "No" otherwise. If a "?" is present as the function's second parameter, then the attribute will only be set if it does not already exist. TO BE RESOLVED The following were added to the syntax, but not documented: @Geometry(SET_MEASURES, ALL, value, [measureName]) @Geometry(GET_GEOMETRY_DEFINITION_REF, [currentGeomDefIntegerVal]) @Geometry(SET_GEOMETRY_DEFINITION_REF, [newGeomDefIntegerVal]) @Geometry(ASSIGN_TEXTURE_COORDINATES, MODE [, widthScale, heightScale, widthOffset, heightOffset])