Lyndon,

> You're right, I did. It should have read that the polygons are not
> necessarily rectangular.

Gotcha.

This makes it a bit more difficult though... See the attached workbench 
(note: it uses a Creator, so you'll need a FME 2007 beta in order to 
view it).

I used the set of coordinates you mentioned, which brings up an 
interesting problem. If you define the "NE corner of a polygon" as the 
"point which is closest to the NE corner of the bounding box of said 
polygon", there's actually 2 points (3,0 and 2,1) with a distance of 1 
to the NE corner of the bounding box (3,1).

Anyway, I find the NE corner of the bounding box and bring the original 
polygon back to it's individual points (save the original geometry). 
Then a NeighborFinder to find the original polygon point which lies the 
closest to the NE corner of the bounding box. Restore the original 
geometry, clean up the attributes and we're done.

If there's more than one point with the same distance, FME picks one 
arbitrarily. In this case, it seems to prefer the easternmost point. 
You'll need to work with the Close Candidate List if you want to 
influence this decision. Check the max distance setting in the 
NeighborFinder and make sure it works for your dataset.

Hope this helps :)
-- 
Hans van der Maarel
Red Geographics

Zevenbergsepoort 44b            www.redgeographics.com
4791 AE  Klundert               [EMAIL PROTECTED]
The Netherlands                 phone: +31-168-401035




For insights into what's up at Safe Software and what's on the development 
horizon, visit Safe's blog at spatial-etl.blogspot.com.

Safe Software has also made slides available that outline enhancements planned 
for FME 2007. The slides are from the "Road Ahead" presentation given on Day 2 
of the FME Worldwide Users Conference. To view these slides, visit 
www.safe.com/2006uc.

 
Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/fme/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/fme/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:[EMAIL PROTECTED] 
    mailto:[EMAIL PROTECTED]

<*> To unsubscribe from this group, send an email to:
    [EMAIL PROTECTED]

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/
 
#! <?xml version="1.0" encoding="iso-8859-1" ?>
#! <WORKSPACE
#    
#    
#    Commandline to run this workspace:
#    
#    
#    fme.exe find_NE_point.fmw
#    
#    
#! MAX_LOG_FEATURES="200"
#! SOURCE="NONE"
#! END_TCL=""
#! DESTINATION="NONE"
#! SHOW_BOOKMARKS="true"
#! GRID_VISIBLE="false"
#! GRID_HEIGHT="50"
#! SHOW_INFO_NODES="true"
#! BEGIN_PYTHON=""
#! BEGIN_TCL=""
#! VIEW_POSITION="1659 0"
#! ZOOM_SCALE="100"
#! PASSWORD=""
#! VIEW_PAGE_BREAKS="false"
#! FME_CACHED_OBJECTS_HINT="250000"
#! SHOW_ANNOTATIONS="true"
#! LOG_MAX_RECORDED_FEATURES="200"
#! END_PYTHON=""
#! FME_REPROJECTION_ENGINE="FME"
#! FME_BUILD_NUM="4236"
#! GRID_SNAPTO="false"
#! GRID_WIDTH="50"
#! SOURCE_ROUTING_DIR=""
#! LOG_FILE=""
#! DESTINATION_ROUTING_DIR=""
#! WORKSPACE_VERSION="1"
#! TITLE=""
#! IGNORE_READER_FAILURE="No"
#! ATTR_TYPE_ENCODING="SDF"
#! >
#! <DATASETS>
#! </DATASETS>
#! <DATA_TYPES>
#! </DATA_TYPES>
#! <GEOM_TYPES>
#! </GEOM_TYPES>
#! <FEATURE_TYPES>
#! </FEATURE_TYPES>
#! <GLOBAL_PARAMETERS>
#! </GLOBAL_PARAMETERS>
#! <COMMENTS>
#! </COMMENTS>
#! <CONSTANTS>
#! </CONSTANTS>
#! <BOOKMARKS>
#! </BOOKMARKS>
#! <TRANSFORMERS>
#! <TRANSFORMER
#! IDENTIFIER="0"
#! TYPE="Creator"
#! VERSION="2"
#! POSITION="387 -631"
#! ORDER="10"
#! PARMS_EDITED="true"
#! ENABLED="true"
#! >
#! <OUTPUT_FEAT NAME="CREATED"/>
#! <FEAT_COLLAPSED COLLAPSED="0"/>
#! <XFORM_ATTR ATTR_NAME="_creation_instance" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_PARM PARM_NAME="GEOM" 
PARM_VALUE="&lt;lt&gt;?xml&lt;space&gt;version=&lt;quote&gt;1.0&lt;quote&gt;&lt;space&gt;encoding=&lt;quote&gt;US_ASCII&lt;quote&gt;&lt;space&gt;standalone=&lt;quote&gt;no&lt;quote&gt;&lt;space&gt;?&lt;gt&gt;&lt;lt&gt;geometry&lt;space&gt;dimension=&lt;quote&gt;2&lt;quote&gt;&lt;gt&gt;&lt;lt&gt;polygon&lt;gt&gt;&lt;lt&gt;line&lt;gt&gt;&lt;lt&gt;coord&lt;space&gt;x=&lt;quote&gt;0&lt;quote&gt;&lt;space&gt;y=&lt;quote&gt;0&lt;quote&gt;&lt;solidus&gt;&lt;gt&gt;&lt;lt&gt;coord&lt;space&gt;x=&lt;quote&gt;3&lt;quote&gt;&lt;space&gt;y=&lt;quote&gt;0&lt;quote&gt;&lt;solidus&gt;&lt;gt&gt;&lt;lt&gt;coord&lt;space&gt;x=&lt;quote&gt;2&lt;quote&gt;&lt;space&gt;y=&lt;quote&gt;1&lt;quote&gt;&lt;solidus&gt;&lt;gt&gt;&lt;lt&gt;coord&lt;space&gt;x=&lt;quote&gt;1&lt;quote&gt;&lt;space&gt;y=&lt;quote&gt;1&lt;quote&gt;&lt;solidus&gt;&lt;gt&gt;&lt;lt&gt;coord&lt;space&gt;x=&lt;quote&gt;0&lt;quote&gt;&lt;space&gt;y=&lt;quote&gt;0&lt;quote&gt;&lt;solidus&gt;&lt;gt&gt;&lt;lt&gt;&lt;solidus&gt;line&lt;gt&gt;&lt;lt&gt;&lt;solidus&gt;polygon&lt;gt&gt;&lt;lt&gt;&lt;solidus&gt;geometry&lt;gt&gt;"/>
#! <XFORM_PARM PARM_NAME="ATEND" PARM_VALUE="no"/>
#! <XFORM_PARM PARM_NAME="XFORMER_NAME" PARM_VALUE="CREATOR"/>
#! <XFORM_PARM PARM_NAME="NUM" PARM_VALUE="1"/>
#! <XFORM_PARM PARM_NAME="CRE_ATTR" PARM_VALUE="_creation_instance"/>
#! </TRANSFORMER>
#! <TRANSFORMER
#! IDENTIFIER="1"
#! TYPE="BoundsExtractor"
#! VERSION="1"
#! POSITION="1181 -624"
#! ORDER="11"
#! PARMS_EDITED="false"
#! ENABLED="true"
#! >
#! <OUTPUT_FEAT NAME="OUTPUT"/>
#! <FEAT_COLLAPSED COLLAPSED="0"/>
#! <XFORM_ATTR ATTR_NAME="_xmin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_xmax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ymin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ymax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_zmin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_zmax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_creation_instance" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_PARM PARM_NAME="XMIN" PARM_VALUE="_xmin"/>
#! <XFORM_PARM PARM_NAME="XMAX" PARM_VALUE="_xmax"/>
#! <XFORM_PARM PARM_NAME="YMIN" PARM_VALUE="_ymin"/>
#! <XFORM_PARM PARM_NAME="ZMIN" PARM_VALUE="_zmin"/>
#! <XFORM_PARM PARM_NAME="XFORMER_NAME" PARM_VALUE="BOUNDSEXTRACTOR"/>
#! <XFORM_PARM PARM_NAME="ZMAX" PARM_VALUE="_zmax"/>
#! <XFORM_PARM PARM_NAME="YMAX" PARM_VALUE="_ymax"/>
#! </TRANSFORMER>
#! <TRANSFORMER
#! IDENTIFIER="2"
#! TYPE="2DPointReplacer"
#! VERSION="1"
#! POSITION="1731 -336"
#! ORDER="12"
#! PARMS_EDITED="true"
#! ENABLED="true"
#! >
#! <OUTPUT_FEAT NAME="POINT"/>
#! <FEAT_COLLAPSED COLLAPSED="0"/>
#! <XFORM_ATTR ATTR_NAME="_xmin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_xmax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ymin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ymax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_zmin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_zmax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_creation_instance" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_PARM PARM_NAME="YVALATTR" PARM_VALUE="@Value(_ymax)"/>
#! <XFORM_PARM PARM_NAME="XVALATTR" PARM_VALUE="@Value(_xmax)"/>
#! <XFORM_PARM PARM_NAME="XFORMER_NAME" PARM_VALUE="2DPOINTREPLACER"/>
#! </TRANSFORMER>
#! <TRANSFORMER
#! IDENTIFIER="3"
#! TYPE="NeighborFinder"
#! VERSION="5"
#! POSITION="2941 -768"
#! ORDER="13"
#! PARMS_EDITED="true"
#! ENABLED="true"
#! >
#! <OUTPUT_FEAT NAME="MATCHED"/>
#! <FEAT_COLLAPSED COLLAPSED="0"/>
#! <XFORM_ATTR ATTR_NAME="_distance" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_angle" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_candidate_angle" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_candidate_label_angle" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_closest_candidate_x" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_closest_candidate_y" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_closest_base_x" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_closest_base_y" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_xmin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_xmax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ymin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ymax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_zmin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_zmax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_creation_instance" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ogcwkt" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <OUTPUT_FEAT NAME="UNMATCHED_BASE"/>
#! <FEAT_COLLAPSED COLLAPSED="1"/>
#! <XFORM_ATTR ATTR_NAME="_xmin" IS_USER_CREATED="false" FEAT_INDEX="1"/>
#! <XFORM_ATTR ATTR_NAME="_xmax" IS_USER_CREATED="false" FEAT_INDEX="1"/>
#! <XFORM_ATTR ATTR_NAME="_ymin" IS_USER_CREATED="false" FEAT_INDEX="1"/>
#! <XFORM_ATTR ATTR_NAME="_ymax" IS_USER_CREATED="false" FEAT_INDEX="1"/>
#! <XFORM_ATTR ATTR_NAME="_zmin" IS_USER_CREATED="false" FEAT_INDEX="1"/>
#! <XFORM_ATTR ATTR_NAME="_zmax" IS_USER_CREATED="false" FEAT_INDEX="1"/>
#! <XFORM_ATTR ATTR_NAME="_creation_instance" IS_USER_CREATED="false" 
FEAT_INDEX="1"/>
#! <OUTPUT_FEAT NAME="UNMATCHED_CANDIDATE"/>
#! <FEAT_COLLAPSED COLLAPSED="2"/>
#! <XFORM_ATTR ATTR_NAME="_xmin" IS_USER_CREATED="false" FEAT_INDEX="2"/>
#! <XFORM_ATTR ATTR_NAME="_xmax" IS_USER_CREATED="false" FEAT_INDEX="2"/>
#! <XFORM_ATTR ATTR_NAME="_ymin" IS_USER_CREATED="false" FEAT_INDEX="2"/>
#! <XFORM_ATTR ATTR_NAME="_ymax" IS_USER_CREATED="false" FEAT_INDEX="2"/>
#! <XFORM_ATTR ATTR_NAME="_zmin" IS_USER_CREATED="false" FEAT_INDEX="2"/>
#! <XFORM_ATTR ATTR_NAME="_zmax" IS_USER_CREATED="false" FEAT_INDEX="2"/>
#! <XFORM_ATTR ATTR_NAME="_creation_instance" IS_USER_CREATED="false" 
FEAT_INDEX="2"/>
#! <XFORM_ATTR ATTR_NAME="_ogcwkt" IS_USER_CREATED="false" FEAT_INDEX="2"/>
#! <XFORM_PARM PARM_NAME="TEST_LIST_NAME" PARM_VALUE=""/>
#! <XFORM_PARM PARM_NAME="CLOSE_LIST_NAME" PARM_VALUE=""/>
#! <XFORM_PARM PARM_NAME="GROUP_BY" PARM_VALUE="_creation_instance"/>
#! <XFORM_PARM PARM_NAME="MAX" PARM_VALUE="2"/>
#! <XFORM_PARM PARM_NAME="XFORMER_NAME" PARM_VALUE="NEIGHBORFINDER"/>
#! </TRANSFORMER>
#! <TRANSFORMER
#! IDENTIFIER="4"
#! TYPE="OGCGeometryExtractor"
#! VERSION="1"
#! POSITION="1834 -1033"
#! ORDER="14"
#! PARMS_EDITED="false"
#! ENABLED="true"
#! >
#! <OUTPUT_FEAT NAME="OUTPUT"/>
#! <FEAT_COLLAPSED COLLAPSED="0"/>
#! <XFORM_ATTR ATTR_NAME="_ogcwkt" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_xmin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_xmax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ymin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ymax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_zmin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_zmax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_creation_instance" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_PARM PARM_NAME="ATTR" PARM_VALUE="_ogcwkt"/>
#! <XFORM_PARM PARM_NAME="KIND_LONG" PARM_VALUE="Well Known Text"/>
#! <XFORM_PARM PARM_NAME="XFORMER_NAME" PARM_VALUE="OGCGEOMETRYEXTRACTOR"/>
#! </TRANSFORMER>
#! <TRANSFORMER
#! IDENTIFIER="5"
#! TYPE="Chopper"
#! VERSION="0"
#! POSITION="2429 -1092"
#! ORDER="15"
#! PARMS_EDITED="true"
#! ENABLED="true"
#! >
#! <OUTPUT_FEAT NAME="CHOPPED"/>
#! <FEAT_COLLAPSED COLLAPSED="0"/>
#! <XFORM_ATTR ATTR_NAME="_ogcwkt" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_xmin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_xmax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ymin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ymax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_zmin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_zmax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_creation_instance" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <OUTPUT_FEAT NAME="UNTOUCHED"/>
#! <FEAT_COLLAPSED COLLAPSED="1"/>
#! <XFORM_ATTR ATTR_NAME="_ogcwkt" IS_USER_CREATED="false" FEAT_INDEX="1"/>
#! <XFORM_ATTR ATTR_NAME="_xmin" IS_USER_CREATED="false" FEAT_INDEX="1"/>
#! <XFORM_ATTR ATTR_NAME="_xmax" IS_USER_CREATED="false" FEAT_INDEX="1"/>
#! <XFORM_ATTR ATTR_NAME="_ymin" IS_USER_CREATED="false" FEAT_INDEX="1"/>
#! <XFORM_ATTR ATTR_NAME="_ymax" IS_USER_CREATED="false" FEAT_INDEX="1"/>
#! <XFORM_ATTR ATTR_NAME="_zmin" IS_USER_CREATED="false" FEAT_INDEX="1"/>
#! <XFORM_ATTR ATTR_NAME="_zmax" IS_USER_CREATED="false" FEAT_INDEX="1"/>
#! <XFORM_ATTR ATTR_NAME="_creation_instance" IS_USER_CREATED="false" 
FEAT_INDEX="1"/>
#! <XFORM_PARM PARM_NAME="MAX" PARM_VALUE="1"/>
#! <XFORM_PARM PARM_NAME="XFORMER_NAME" PARM_VALUE="CHOPPER"/>
#! </TRANSFORMER>
#! <TRANSFORMER
#! IDENTIFIER="15"
#! TYPE="OGCGeometryReplacer"
#! VERSION="1"
#! POSITION="3519 -886"
#! ORDER="16"
#! PARMS_EDITED="true"
#! ENABLED="true"
#! >
#! <OUTPUT_FEAT NAME="OUTPUT"/>
#! <FEAT_COLLAPSED COLLAPSED="0"/>
#! <XFORM_ATTR ATTR_NAME="_distance" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_angle" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_candidate_angle" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_candidate_label_angle" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_closest_candidate_x" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_closest_candidate_y" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_closest_base_x" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_closest_base_y" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_xmin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_xmax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ymin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ymax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_zmin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_zmax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_creation_instance" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ogcwkt" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_PARM PARM_NAME="ATTR" PARM_VALUE="_ogcwkt"/>
#! <XFORM_PARM PARM_NAME="KIND_LONG" PARM_VALUE="Well Known Text"/>
#! <XFORM_PARM PARM_NAME="XFORMER_NAME" PARM_VALUE="OGCGEOMETRYREPLACER"/>
#! </TRANSFORMER>
#! <TRANSFORMER
#! IDENTIFIER="18"
#! TYPE="AttributeRenamer"
#! VERSION="0"
#! POSITION="4059 -946"
#! ORDER="17"
#! PARMS_EDITED="true"
#! ENABLED="true"
#! >
#! <OUTPUT_FEAT NAME="OUTPUT"/>
#! <FEAT_COLLAPSED COLLAPSED="0"/>
#! <XFORM_ATTR ATTR_NAME="_distance" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_angle" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_candidate_angle" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_candidate_label_angle" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_closest_base_x" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_closest_base_y" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_xmin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_xmax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ymin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ymax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_zmin" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_zmax" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_creation_instance" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="_ogcwkt" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="NE_x" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="NE_y" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_PARM PARM_NAME="ATTR_LIST" 
PARM_VALUE="NE_x,_closest_candidate_x,NE_y,_closest_candidate_y"/>
#! <XFORM_PARM PARM_NAME="XFORMER_NAME" PARM_VALUE="ATTRIBUTERENAMER"/>
#! </TRANSFORMER>
#! <TRANSFORMER
#! IDENTIFIER="17"
#! TYPE="AttributeKeeper"
#! VERSION="0"
#! POSITION="4581 -1005"
#! ORDER="18"
#! PARMS_EDITED="true"
#! ENABLED="true"
#! >
#! <OUTPUT_FEAT NAME="OUTPUT"/>
#! <FEAT_COLLAPSED COLLAPSED="0"/>
#! <XFORM_ATTR ATTR_NAME="_creation_instance" IS_USER_CREATED="false" 
FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="NE_x" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_ATTR ATTR_NAME="NE_y" IS_USER_CREATED="false" FEAT_INDEX="0"/>
#! <XFORM_PARM PARM_NAME="KEEP_ATTRS" 
PARM_VALUE="_creation_instance,NE_x,NE_y"/>
#! <XFORM_PARM PARM_NAME="XFORMER_NAME" PARM_VALUE="ATTRIBUTEKEEPER"/>
#! </TRANSFORMER>
#! <TRANSFORMER
#! IDENTIFIER="21"
#! TYPE="Visualizer"
#! VERSION="1"
#! POSITION="5124 -1045"
#! ORDER="19"
#! PARMS_EDITED="false"
#! ENABLED="true"
#! >
#! <XFORM_PARM PARM_NAME="TACKATTRS" PARM_VALUE=""/>
#! <XFORM_PARM PARM_NAME="AREA_COLOR" PARM_VALUE=""/>
#! <XFORM_PARM PARM_NAME="XFORMER_NAME" PARM_VALUE="ATTRIBUTEKEEPER_OUTPUT"/>
#! <XFORM_PARM PARM_NAME="PEN_COLOR" PARM_VALUE=""/>
#! </TRANSFORMER>
#! </TRANSFORMERS>
#! <FEAT_LINKS>
#! <FEAT_LINK
#! IDENTIFIER="9"
#! SOURCE_NODE="0"
#! TARGET_NODE="1"
#! SOURCE_PORT_DESC="fo 0"
#! TARGET_PORT_DESC="fi 0"
#! EXTRA_POINTS=""
#! />
#! <FEAT_LINK
#! IDENTIFIER="10"
#! SOURCE_NODE="1"
#! TARGET_NODE="2"
#! SOURCE_PORT_DESC="fo 0"
#! TARGET_PORT_DESC="fi 0"
#! EXTRA_POINTS=""
#! />
#! <FEAT_LINK
#! IDENTIFIER="11"
#! SOURCE_NODE="1"
#! TARGET_NODE="4"
#! SOURCE_PORT_DESC="fo 0"
#! TARGET_PORT_DESC="fi 0"
#! EXTRA_POINTS=""
#! />
#! <FEAT_LINK
#! IDENTIFIER="12"
#! SOURCE_NODE="4"
#! TARGET_NODE="5"
#! SOURCE_PORT_DESC="fo 0"
#! TARGET_PORT_DESC="fi 0"
#! EXTRA_POINTS=""
#! />
#! <FEAT_LINK
#! IDENTIFIER="13"
#! SOURCE_NODE="5"
#! TARGET_NODE="3"
#! SOURCE_PORT_DESC="fo 0"
#! TARGET_PORT_DESC="fi 1"
#! EXTRA_POINTS=""
#! />
#! <FEAT_LINK
#! IDENTIFIER="14"
#! SOURCE_NODE="2"
#! TARGET_NODE="3"
#! SOURCE_PORT_DESC="fo 0"
#! TARGET_PORT_DESC="fi 0"
#! EXTRA_POINTS=""
#! />
#! <FEAT_LINK
#! IDENTIFIER="16"
#! SOURCE_NODE="3"
#! TARGET_NODE="15"
#! SOURCE_PORT_DESC="fo 0"
#! TARGET_PORT_DESC="fi 0"
#! EXTRA_POINTS=""
#! />
#! <FEAT_LINK
#! IDENTIFIER="19"
#! SOURCE_NODE="15"
#! TARGET_NODE="18"
#! SOURCE_PORT_DESC="fo 0"
#! TARGET_PORT_DESC="fi 0"
#! EXTRA_POINTS=""
#! />
#! <FEAT_LINK
#! IDENTIFIER="20"
#! SOURCE_NODE="18"
#! TARGET_NODE="17"
#! SOURCE_PORT_DESC="fo 0"
#! TARGET_PORT_DESC="fi 0"
#! EXTRA_POINTS=""
#! />
#! <FEAT_LINK
#! IDENTIFIER="22"
#! SOURCE_NODE="17"
#! TARGET_NODE="21"
#! SOURCE_PORT_DESC="fo 0"
#! TARGET_PORT_DESC="fi 0"
#! EXTRA_POINTS=""
#! />
#! </FEAT_LINKS>
#! <ATTR_LINKS>
#! </ATTR_LINKS>
#! <SUBDOCUMENTS>
#! </SUBDOCUMENTS>
#! <LOOKUP_TABLES>
#! </LOOKUP_TABLES>
#! </WORKSPACE>
#! 
#! START_HEADER
#! START_WB_HEADER
READER_TYPE NULL
READER_KEYWORD NULL_SOURCE
NULL_SOURCE_DATASET null
WRITER_TYPE NULL
WRITER_KEYWORD NULL_DEST
NULL_DEST_DATASET null
#! END_WB_HEADER
#! END_HEADER

LOG_FILENAME "$(FME_MF_DIR)find_NE_point.log"
LOG_APPEND NO
LOG_MAX_FEATURES 200
LOG_MAX_RECORDED_FEATURES 200
FME_CACHED_OBJECTS_HINT 250000
FME_REPROJECTION_ENGINE FME
# -------------------------------------------------------------------------

MULTI_READER_CONTINUE_ON_READER_FAILURE No

# -------------------------------------------------------------------------

MACRO WORKSPACE_NAME find_NE_point
DEFAULT_MACRO WB_CURRENT_CONTEXT
# -------------------------------------------------------------------------

FACTORY_DEF * CreationFactory    FACTORY_NAME CREATOR    CREATE_AT_END no    
NUMBER_TO_CREATE 1    OUTPUT FEATURE_TYPE CREATOR_CREATED        
@SupplyAttributes(fme_type,fme_no_geom)        
@SupplyAttributes(?,creation_instance,0)        
@RenameAttributes(_creation_instance,creation_instance)        
@Geometry(FROM_ENCODED_STRING,<lt>?xml<space>version=<quote>1.0<quote><space>encoding=<quote>US_ASCII<quote><space>standalone=<quote>no<quote><space>?<gt><lt>geometry<space>dimension=<quote>2<quote><gt><lt>polygon<gt><lt>line<gt><lt>coord<space>x=<quote>0<quote><space>y=<quote>0<quote><solidus><gt><lt>coord<space>x=<quote>3<quote><space>y=<quote>0<quote><solidus><gt><lt>coord<space>x=<quote>2<quote><space>y=<quote>1<quote><solidus><gt><lt>coord<space>x=<quote>1<quote><space>y=<quote>1<quote><solidus><gt><lt>coord<space>x=<quote>0<quote><space>y=<quote>0<quote><solidus><gt><lt><solidus>line<gt><lt><solidus>polygon<gt><lt><solidus>geometry<gt>)

# -------------------------------------------------------------------------

FACTORY_DEF * TeeFactory    FACTORY_NAME BOUNDSEXTRACTOR    INPUT  FEATURE_TYPE 
CREATOR_CREATED    OUTPUT FEATURE_TYPE BOUNDSEXTRACTOR_OUTPUT         
@Bounds(_xmin,_xmax,_ymin,_ymax,_zmin,_zmax,GEOMETRIC)

FACTORY_DEF * TeeFactory   FACTORY_NAME "BOUNDSEXTRACTOR OUTPUT Splitter"   
INPUT FEATURE_TYPE BOUNDSEXTRACTOR_OUTPUT   OUTPUT FEATURE_TYPE 
BOUNDSEXTRACTOR_OUTPUT_0   OUTPUT FEATURE_TYPE BOUNDSEXTRACTOR_OUTPUT_1
# -------------------------------------------------------------------------

FACTORY_DEF * TeeFactory    FACTORY_NAME OGCGEOMETRYEXTRACTOR    INPUT  
FEATURE_TYPE BOUNDSEXTRACTOR_OUTPUT_1    OUTPUT FEATURE_TYPE 
OGCGEOMETRYEXTRACTOR_OUTPUT         @OGCGeometry(to_attribute,wkt,_ogcwkt)

# -------------------------------------------------------------------------

FACTORY_DEF * TeeFactory    FACTORY_NAME CHOPPER_Splitter    INPUT  
FEATURE_TYPE OGCGEOMETRYEXTRACTOR_OUTPUT    OUTPUT FEATURE_TYPE ___TOCHOP___
FACTORY_DEF * ChoppingFactory    FACTORY_NAME CHOPPER_Areas    INPUT 
FEATURE_TYPE ___TOCHOP___ fme_type fme_area    MAX_VERTICES 1    CHOP_POLYGONS  
  OUTPUT CHOPPED FEATURE_TYPE CHOPPER_CHOPPED
FACTORY_DEF * ChoppingFactory    FACTORY_NAME CHOPPER_Lines    INPUT 
FEATURE_TYPE ___TOCHOP___ fme_type fme_line    MAX_VERTICES 1    OUTPUT CHOPPED 
FEATURE_TYPE CHOPPER_CHOPPED
FACTORY_DEF * TeeFactory    FACTORY_NAME CHOPPER_EverythingElse    INPUT 
FEATURE_TYPE ___TOCHOP___

# -------------------------------------------------------------------------

FACTORY_DEF * TestFactory    FACTORY_NAME 2DPOINTREPLACER    INPUT  
FEATURE_TYPE BOUNDSEXTRACTOR_OUTPUT_0    TEST &fme_type = fme_text    OUTPUT 
PASSED FEATURE_TYPE 2DPOINTREPLACER_POINT         
@XValue("@Value(_xmax)",RESET)         @YValue("@Value(_ymax)")         
@Dimension(2)    OUTPUT FAILED FEATURE_TYPE 2DPOINTREPLACER_POINT         
@XValue("@Value(_xmax)",RESET)         @YValue("@Value(_ymax)")         
@Dimension(2)         @GeometryType(fme_point)         
@SupplyAttributes(fme_type,fme_point)

# -------------------------------------------------------------------------

FACTORY_DEF * ProximityFactory    FACTORY_NAME NEIGHBORFINDER    INPUT BASE 
FEATURE_TYPE 2DPOINTREPLACER_POINT    INPUT CANDIDATE FEATURE_TYPE 
CHOPPER_CHOPPED    GROUP_BY _creation_instance    SPATIAL_MATCH CLOSEST 2    
DISTANCE_ATTR _distance    OUTPUT MATCHED FEATURE_TYPE NEIGHBORFINDER_MATCHED   
     
@RenameAttributes(_angle,angle,_candidate_angle,candidate_angle,_candidate_label_angle,candidate_label_angle,_closest_candidate_x,closest_candidate_x,_closest_candidate_y,closest_candidate_y,_closest_base_x,closest_base_x,_closest_base_y,closest_base_y)

# -------------------------------------------------------------------------

FACTORY_DEF * TeeFactory    FACTORY_NAME OGCGEOMETRYREPLACER    INPUT  
FEATURE_TYPE NEIGHBORFINDER_MATCHED    OUTPUT FEATURE_TYPE 
OGCGEOMETRYREPLACER_OUTPUT         @OGCGeometry(from_attribute,wkt,_ogcwkt)

# -------------------------------------------------------------------------

FACTORY_DEF * TeeFactory    FACTORY_NAME ATTRIBUTERENAMER    INPUT  
FEATURE_TYPE OGCGEOMETRYREPLACER_OUTPUT    OUTPUT FEATURE_TYPE 
ATTRIBUTERENAMER_OUTPUT         
@RenameAttributes(NE_x,_closest_candidate_x,NE_y,_closest_candidate_y)

# -------------------------------------------------------------------------

FACTORY_DEF * TeeFactory    FACTORY_NAME ATTRIBUTEKEEPER    INPUT  FEATURE_TYPE 
ATTRIBUTERENAMER_OUTPUT    OUTPUT FEATURE_TYPE ATTRIBUTEKEEPER_OUTPUT        
@KeepAttributes(_creation_instance,NE_x,NE_y,fme_regexp_match,^fme_)

# -------------------------------------------------------------------------

# 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
# First, set up the temporary directory that will be used for
# the recordings we will be viewing (these three lines do this)
# They assume that the WORKSPACE_NAME macro has already been set

DEFAULT_MACRO WORKSPACE_TEMP_DIR
INCLUDE [ if {[string length {$(WORKSPACE_TEMP_DIR)}] < 2} {               if 
{[info exists env(TEMP)]}                  {set gVisualizerTemp $env(TEMP)}     
          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";         } ;         
if { [string length {}] > 0 } {             set catter "" ;             set 
comma "" ;             foreach attr "" {                 set catter 
"$catter$comma&$attr" ;                 set comma ",_," ;             } ;       
      puts "MACRO CATMAC [EMAIL PROTECTED]($catter)" ;         }         else { 
            puts "MACRO CATMAC " ;         };         set safeName "[regsub 
-all {[^a-zA-Z0-9]} {ATTRIBUTEKEEPER_OUTPUT} _]_[expr round(rand() * 
1000000)]_[clock clicks]";         puts "MACRO SAFE_FFS_NAME $safeName";        
 ]
# Make the temporary directory that the FFS files will live in.
FACTORY_DEF * CreationFactory      FACTORY_NAME 
ATTRIBUTEKEEPER_OUTPUT_DirCreator      OUTPUT FEATURE_TYPE __nukeme__          
@Tcl2("catch {file mkdir {$(WORKSPACE_TEMP_DIR)}}")
FACTORY_DEF * TeeFactory    FACTORY_NAME 
ATTRIBUTEKEEPER_OUTPUT_DirCreatorCleanerUpper    INPUT FEATURE_TYPE __nukeme__
# Now route all the features into the recorder, changing their
# feature type to the transformer name so that they view nicely

FACTORY_DEF * TeeFactory    FACTORY_NAME ATTRIBUTEKEEPER_OUTPUT_SetterUpper    
INPUT  FEATURE_TYPE ATTRIBUTEKEEPER_OUTPUT    OUTPUT FEATURE_TYPE __viewme__
FACTORY_DEF * RecorderFactory    FACTORY_NAME ATTRIBUTEKEEPER_OUTPUT_Recorder   
 INPUT FEATURE_TYPE __viewme__ @FeatureType(ATTRIBUTEKEEPER_OUTPUT$(CATMAC))    
FEATURE_FILE "$(WORKSPACE_TEMP_DIR)/$(SAFE_FFS_NAME).ffs"    MODE 
RECORD_PASS_THROUGH
FACTORY_DEF * CreationFactory      FACTORY_NAME ATTRIBUTEKEEPER_OUTPUT_Trigger  
    CREATE_AT_END      OUTPUT FEATURE_TYPE __nukeme__          @TCL("lappend 
gVisualizerFilesToView $(SAFE_FFS_NAME)")
FACTORY_DEF * TeeFactory    FACTORY_NAME ATTRIBUTEKEEPER_OUTPUT_CleanerUpper    
INPUT FEATURE_TYPE __nukeme__

# -------------------------------------------------------------------------

FACTORY_DEF * TestFactory   FACTORY_NAME "Final Output Feature Type Router"   
INPUT FEATURE_TYPE *   TEST @Value(__wb_out_feat_type__) != ""   OUTPUT PASSED 
FEATURE_TYPE *     @FeatureType(@Value(__wb_out_feat_type__))
# -------------------------------------------------------------------------

DEFAULT_MACRO WORKSPACE_TEMP_DIR
INCLUDE [ if {{$(WORKSPACE_TEMP_DIR)} == {}} { puts {MACRO 
__WB_ENABLE_VISUALIZER__ no} } else { puts {MACRO __WB_ENABLE_VISUALIZER__ *} } 
]
FACTORY_DEF $(__WB_ENABLE_VISUALIZER__) CreationFactory   CREATE_AT_END   
OUTPUT FEATURE_TYPE __NUKEME__   @TCL("eval FME_Execute System \173fmeview 
/ownffs {$(WORKSPACE_TEMP_DIR)} $gVisualizerFilesToView & }")
FACTORY_DEF * TeeFactory   INPUT FEATURE_TYPE __NUKEME__

Reply via email to