Wednesday, June 04, 2014

GTViewer Expression Syntax

The following reference is for the Expression Syntax used by various GTI products.   This post will provide an easy to find reference without having to remember which document it is in.  

The expression syntax is used by GTViewer's Dynamic Graphics, Feature Tooltips, Custom Attribute Info Tabs, Link Definitions, and Where Am I.    GTViewer and GTVx also provide set of methods to directly access the Expression Evaluator:  ExpStateReset, ExpStateAddValue, ExpStateGetValue, ExpStateGetValueType, ExpStateGetInfo, ExpStateLoadElementData, ExpStateLoadTabularData, ExpValidate, and ExpEvaluate. 

GTWeb also supports the Custom Attribute Tabs and Where Am I functionality.

*** NOTE: Some of the formatting of the Less Than and Greater Than signs didn't come through on this post.  I will work on getting that fixed.

GTViewer Expression Syntax

Literals. 3
  • Integer Literals
  • Double Literals
  • String Literals
Arithmetic Operators
  • Unary Operators:  + , -
  • Binary Operators:  /, *, +, -
Grouping Operators
  • Parentheses
Comparison Operators
  • Equality Operators:  =,  ==, <>, !=
  • Relational Operators:  <,  >,  <=,  >=
  • Special Comparison Operators: LIKE, IN
Logical Operators
  • Logical AND
  • Logical OR
  • Logical NOT and !
Type Cast Functions
  • Integer Cast Functions:  ToInt, CInt
  • Double Cast Functions: ToDouble, CDbl
  • String Cast Functions: ToString, CStr
String Functions
  • Trim Functions: LTrim, RTrim, Trim
  • Case Functions: Upper, Lower
  • String Length Function: Length
  • String Concatenation Function: Concat
  • String Extraction Function: Substr
  • String Replacement Function: Replace
  • String Padding Functions:  RPad, LPad
  • String Search Function: Instr
  • String From ASCII Code Function: CHR
  • Number Formatting Function: Format
  • String Formatting Function:  Pretty
Miscellaneous Functions
  • IF Function:  IFFUNCT
Constants
Variables

. 15
Special Variables. 17


Integer Literals
·         Integer Literals are 32 bit signed Integer values (-2,147,483,648 through 2,147,483,647).

Example
123
0
1024


Double Literals
·         Double Literals are 64 bit double values (4.94065645841246544E-324 through 1.79769313486231570E+308).

Example
0.0
123.456
3.14159


String Literals
·         A String Literal must be enclosed in single quotes (' ') or double quotes (" ").

Example
'a'
"a"
'abc'
"abc"




Arithmetic Operators

Unary Operators:  + , -
·         The unary + operator will make the operand positive.

Example
Evaluates To
+1 
1
+1 + 1 
2
+1++1 
2

·         The unary – operator will negate the operand.

Example
Evaluates To
-2
-2
1 + -2
-1
1 - -1
2


Binary Operators:  /, *, +, -

·         The / operator will divide the left operand by the right operand.

Example
Evaluates To
6 / 3
2.000000
3 / 2
1.500000
5 / 0 
**Error**

·         The * operator will multiply the left operand by the right operand.

Example
Evaluates To
6 * 3
18
3 * 0.5
1.500000
5 * 0 
0

·         The + operator will add the left and right operands.

Example
Evaluates To
6 + 3
9
3 + 0.5
3.500000
5 + 0 
5

·         The – operator will subtract the right operand from the left operand.

Example
Evaluates To
6 - 3
3
3 - 0.5
2.500000
5 - 0 
5



Grouping Operators 

Parentheses
·         The Parentheses operators can be used to group parts of an expression together so that their order of execution can be controlled.   Grouped parts of an expression are evaluated inside out.

Example
Evaluates To
(1)
1
(1 + 2) * (3 + 4)
21
(1 < 2) and (4 < 3 or 1>2 or 3>1)
1



Comparison Operators

Equality Operators:  =,  ==, <>, !=
·         Both the = and == operators can be used for equality comparisons.   They will return 1 (True) if the left and right operands are equal; otherwise, they will return 0 (False).
Example
Evaluates To
2 = 1+1
1
3 = 1 + 1
0
2 == 1 + 1
1
3 == 1 + 1
0
'abc' = 'def'
0

·         Both the <> and != operators can be used for inequality comparisons.  They will return 0 (False) if the left and right operands are equal; otherwise, they will return 1 (True).

Example
Evaluates To
2 <> 1+1
0
3 <> 1 + 1
1
2 != 1 + 1
0
3 != 1 + 1
1
'abc' <> 'def'
1


Relational Operators:  <, >,  <=,  >=
·         The < operator will return 1 (True) if the left operand is less than the right operand; otherwise, it will return 0 (False).

Example
Evaluates To
123 < 456
1
456 < 123
0
123 < 123
0
'abc' < 'def'
1


·         The <= operator will return 1 (True) if the left operand is less than or equal to the right operand; otherwise, it will return 0 (False).

Example
Evaluates To
123 <= 456
1
123 <= 123
1

·         The > operator will return 1 (True) if the left operand is greater than the right operand; otherwise, it will return 0 (False).

Example
Evaluates To
123 > 456
0
456 > 123
1
123 > 123
0
'abc' > 'def'
0

·         The >= operator will return 1 (True) if the left operand is greater than or equal to the right operand; otherwise, it will return 0 (False).

Example
Evaluates To
456 >= 123
1
123 >= 123
1

Special Comparison Operators: LIKE, IN
·         The LIKE operator will compare the left String operand to a pattern defined in the right String operand.   The following patterns are allowed where 'xxx' is a string and the % is the accepted wildcard character:  Begins With ('xxx%'), Ends With ('%xxx'), and Contains ('%xxx%).

Example
Evaluates To
'abc' like 'abc'
1
'abcdef' like 'abc%'
1
'abcdef' like '%def'
1
'abcdef' like '%cd%'
1
'abc' like '%'
1
'abc' like '%bcd'
0
'abcdef' like '%defg%'
0
'abcdef' like '%abc%'
1
'abcdef' like '%def%'
1

·         The IN operator will compare the left operand to the parenthesis enclosed list of expressions in the right operand.  If the left operand matches an item in the list, 1 (True) is returned; otherwise, 0 (False) is returned.   The list of expressions on the right must evaluate to a type compatible with the left operand’s type (Numbers to Numbers, Strings to String).

Example
Evaluates To
123 IN (100,110,120,130)
0
120 IN (100,120,130,140)
1
'D' IN ('A', 'B', 'C', 'D', 'E')
1




Logical Operators

Logical AND
·         The AND operator will return 1 (True) if the left and right operands are both True (evaluate to a non-zero value).  If one or both of the operands are False (evaluate to 0), then 0 (False) is returned.

Example
Evaluates To
1 and 1
1
1 and 0
0
0 and 1
0
0 and 0
0
True and True
1
True and False
0
False and True
0
False and False
0

Logical OR
·         The OR operator will return 1 (True) if either the left or the right operand is True (evaluates to non-zero value).   If both operands are False (evaluate to 0), then 0 (False) is returned.

Example
Evaluates To
1 or 0
1
0 or 1
1
1 or 1
1
0 or 0
0
True or False
1
False or True
1
True or True
1
False or False
0

Logical NOT and !
·         The NOT and ! operators will return 0 (False) if the following operand is True (evaluates to a non-zero value) and will return 1 (True) if the operand is False (evaluates to a 0).

Example
Evaluates To
Not 1
0
Not 0
1
!1
0
!0
1
Not True
0
Not False
1
!True
0
!False
1

Type Cast Functions

The Type Cast Functions are used to convert the type of an expression to another type.  For example, Integer and Double values can be converted to Strings, and Strings can be converted to Integer or Double values.
  • Type Cast Function syntax: 
    • ToInt( ) as Integer
    • CInt( ) as Integer
    • ToDouble( )  as Double
    • CDbl( ) as Double
    • ToString( ) as String
    • CStr( ) as String

Integer Cast Functions:  ToInt, CInt
  • The ToInt and CInt functions will cast a Double or String expression to an Integer Value.  If a String cannot be converted, it will return 0.   The Decimal value for Double values will be truncated.

Example
Evaluates To
ToInt( '123456')
123456
CInt( 1234.56 )
1234


Double Cast Functions: ToDouble, CDbl
  • ToDouble and CDbl will cast an Integer or String expression to a Double value.   If a String cannot be converted, it will return a 0.0.

Example
Evaluates To
ToDouble( '123.456' )
123.456000
CDbl( 123 )
123.000000


String Cast Functions: ToString, CStr
·         ToString and CStr will cast a Double or Integer expression to a String Value.

Example
Evaluates To
ToString( 1 + 2 + 3 )
'6'
CStr( 1 + 2 + 3 )
'6'




String Functions

Trim Functions: LTrim, RTrim, Trim
·         The LTrim function returns the String value specified in the first parameter with no leading spaces.

§   LTrim( str as String ) as String

Example
Evaluates To
LTrim('   abc   ')
'abc   '

·         The RTrim function returns the String value specified in the first parameter with no trailing spaces.

§   RTrim( str as String ) as String

Example
Evaluates To
RTrim('   abc   ')
'   abc'

·         The Trim function the String value specified in the first parameter with no leading or trailing spaces.

§   Trim( str as String ) as String

Example
Evaluates To
Trim('   abc   ')
'abc'

Case Functions: Upper, Lower

·         The Upper function returns the String value specified in the first parameter in all upper case.

§   Upper( str as String ) as String

Example
Evaluates To
Upper('abc')
'ABC'

·         The Lower function returns the String value specified in the first parameter in all lower case.

§   Lower( str as String ) as String

Example
Evaluates To
Lower('ABC')
'abc'



String Length Function: Length
·         The Length function returns an Integer value specifying the number of characters in the String value specified in the first parameter.

§   Length( str as String ) as Integer

Example
Evaluates To
Length('abc')
3
Length('')
0


String Concatenation Function: Concat
·         The Concat function returns a String value that is the concatenation all String values specified as parameters.   There must be from 2 to 10 String values provided as parameters.

§   Concat( str1 as String, str2 as String) as String
§   Concat( str1 as String, str2 as String, …, str_N as String ) as String

Example
Evaluates To
Concat('abc', 'def')
'abcdef'
Concat('abc', 'def', 'ghi')
'abcdefghi'
Concat('abc', 'def', 'ghi', 'jkl')
'abcdefghijkl'


String Extraction Function: Substr
·         The Substr function returns a String value containing a substring of the String value provided in the first parameter.  The second parameter is an Integer value specifying the zero based starting position of the substring.  A third, optional Integer parameter can be used to specify the length of the substring; if no length is specified, the substring will go from the starting position to the end of the string.

§   Substr( str as String, startPos as Integer ) as String
§   SubStr( str as String, startPos as Integer, length as Integer ) as String

Example
Evaluates To
Substr('abcdef',3)
'def'
Substr('abcdef',2,2)
'cd'


String Replacement Function: Replace
·         The Replace function returns a new String value created by taking the String value specified in the first parameter and replacing all of its occurrences of the String specified in the second parameter with the String value specified in the third parameter.  The third parameter is optional; omitting it will remove all occurrences of the second parameter from the first.

§   Replace( str as String, oldValue as String ) as String
§  Replace ( str as String, oldValue as String, newValue as String) as String


Example
Evaluates To
Replace('abcdef','bcde')
'af'
Replace('abcdef','bcde','*')
'a*f'


String Padding Functions:  RPad, LPad
·         The RPad function returns a String value where the first parameter String value is padded on the right side with the number of spaces needed to make the String contain the number of characters specified by the second parameter.  A third, optional parameter can specify the padding String value.

§   RPad( str as String, count as Integer ) as String
§   RPad( str as String, count as Integer, padStr as String ) as String


Example
Evaluates To
RPad('abc',6)
'abc   '
RPad('abc',6,'~')
'abc~~~'

·          The LPad function returns a String value where the first parameter String value is padded on the left side with the number of spaces need to make the String contain the number of character specified by the second parameter.  A third, optional parameter can specify the padding String value.

§   LPad( str as String, count as Integer) as String
§   LPad( str as String, count as Integer, padStr as String) as String

Example
Evaluates To
LPad('abc',5)
'  abc'
LPad('abc',5,'*')
'**abc'



String Search Function: Instr
·         The Instr function returns the zero-based index position in the first parameter String value of the second parameter String value.  A third, optional parameter can be used to specify a zero-based search starting position; 0 is used as the starting position if the third parameter is not specified.  If the second parameter String is not found in the first, the function will return -1.

§   Instr( str as String, searchStr as String ) as String
§   Instr( str as String, searchStr as String, startPos as Integer ) as String

Example
Evaluates To
Instr('abcdefghij','fgh')
5
Instr('abcdefghij','jkl')
-1
Instr('abcdabcdabcd','d',8)
11
Instr('abcdabcdabcd','a',9)
-1


String From ASCII Code Function: CHR

  • The CHR function returns a String value containing the ASCII character for the specified integer value.
§   CHR( val as INTEGER ) as String

Example
Evaluates To
CHR(65)
'A'
CHR(97)
'a'
CHR(48)
'0'


Number Formatting Function: Format
·         The Format function returns a String value of a Double value specified in the first parameter.  The second parameter is an Integer value specifying the width of the string that will be created.  The third, optional parameter can be used to specify the zero-based number of the digit that will be shown to the right of the decimal point.

§   Format( value as Double, width as Integer ) as String
§   Format( value as Double, width as Integer, prec as Integer ) as String

Example
Evaluates To
Format(12.452, 6,2)
' 12.45'
Format(12.456, 6,2)
' 12.46'
Format(12.456, 6,4)
'12.4560'
Format(12.456, 6)
'    12'




String Formatting Function:  Pretty
  • The Pretty function returns a String value that has been formatted according to a specify rule.  This first parameter specifies a string to format.  The second optional parameter is the mode and can be 0, 1, or 2.  If the mode is not set, it will default to 0.  The modes are listed below:
·         Mode 0 – Capitalize the first letter of each word in the string and make the rest of the characters lower case.
·         Mode 1 – Replace all Underscores (_) with spaces.
·         Mode 2 – Combination of modes 0 and 1.

§   Pretty( value as String ) as String
§   Pretty( value as String, mode as Integer ) as String

Example
Evaluates To
Format('THIS_IS_A_TEST')
'This_Is_A_Test'
Format('THIS_IS_A_TEST',0)
'This_Is_A_Test'
Format('THIS_IS_A_TEST',1)
'THIS IS A TEST'
Format('THIS_IS_A_TEST',2)
'This Is A Test'




Miscellaneous Functions

IF Function:  IFFUNCT
  • The IFFUNCT function will evaluate the expression specified in the first parameter.  If the expression is True (non-zero), the second parameter expression is evaluated and returned; otherwise, the third parameter expression is evaluated and returned.   The second parameter determines the return type.

§   IfFunct( , , ) as

Example
Evaluates To
IfFunct( 1, 'a','b')
'a'
IfFunct( 0, 'a','b')
'b'
IfFunct( 1, 2, 3)
2
IfFunct( 0, 2, 3)
3


Constants

           Constants:  TRUE, FALSE, CRLF

·         The TRUE constant is an Integer value that will always evaluate to 1.
·         The FALSE constant is an Integer value that will always evaluate to 0.
·         The CRLF constant is a String value that will always evaluate to a Carriage Return-Linefeed character (\n).

Example
Evaluates To
True
1
False
0
CRLF
'\n'


Variables

Variables:   , []

o   Variables can be of the INTEGER, DOUBLE, or STRING type.
o   Variable Name can be any Alphabetical character followed by zero or more Alphanumeric characters, or an Under Score (_).

Example
A
Var1
Var_1

o   For variable names that don’t meet the above criteria, Complex Name can be used.  They can contain any Letter, Number, or Symbol except square brackets ( [ , ] ), single quotes ( ' ), or double quotes ( " ).  The Complex Name must be enclosed in square brackets.

Example
[a]
[Pole.Material]
[Pole Material]




Special Variables

There are currently two special variables that can be used with the Dynamic Graphics’ Criteria Expression and Label Expression.  These values are driven by the feature’s geometry.

·         [GTI_GTI.Length] will be set to the linear length of Linear and Shape features.  Its value will be returned as a String type, so it must be cast as a Double (with ToDouble) to be used as a numeric value.   The units will always be master units. 

·         [GTI_DG.Area] will be set to a Shape features area.  Its value will be returned as a String type, so it must be cast as a Double (with ToDouble) to be used as a numeric value.  The units will always be square master units.



Tuesday, April 29, 2014

Sharing data with GTShare

GTShare is a new backend component we have started testing to facilitate the sharing of Session Graphics between GTViewer users.   In the near future, it will also support the sharing of redline/note data between GTWeb users and GTViewer for iOS/Android as well.

GTShare itself is an ASP.NET application that utilizes SQL Server (Oracle may be supported as well) to store and share GTViewer graphic data (which can also include embedded tabular data).   This platform was chosen for GTShare because it is cheap and easy to get hosted ASP.NET sites with SQL Server support that provide good performance and reliability with little maintenance.  This platform is the same type of hosted site we use with GTWeb if GTI host the customer's data.

GTShare provides a simple HTTP based API that allows a client to post redlines (graphic elements) or delete existing graphic elements.  It also provides the ability to update a client's session graphic data by downloading only what has changed since its last update or download the entire shared dataset.   GTShare will also support multiple Projects allowing a single GTShare server to support multiple, separate shared datasets.

An Add-On app for GTViewer called GTV_Share is currently available for GTViewer if anyone wants to try it out.   You will need to get GTViewer version 14019+ and the GTV_Share client app.   Once installed, the client app will show up as GTShare on GTViewer's Application menu and looks something like this:


To add to the Shared data, create some Session Graphics (draw, import, convert highlighted to session graphics, etc), then select the session graphics with the Draw/Select tool.   You can then press the Add Selected button and the selected graphics will be posted to the server.   If you have modified an existing GTShare graphic and are posting it, the previous version will be deleted and replaced with your version.   You can also select GTShare graphics with the Draw/Select tool and press the Delete Selected button and the selected graphics will be deleted from the server.

When the GTShare Client app is run, it will automatically download any new shared data (including adds, deletes, and changes).   This information is cached locally and GTViewer can use it to update any new session (even without a network connection).   The Get Updates button will download any changes from the GTShare Server, and the Refresh All button will clear all locally cached data and redownload all of the shared data.

The GTV_Share client app for GTViewer is just a beta application to show users what GTShare is about.   We would like users to try it and see what functionality they think GTShare will need and to see how we can make it more useful to your production environment.   If you are interested trying GTShare, please contact us (support@gti-us.com).

The next step for GTShare development is to get the GTWeb Clients supporting it as well as GTViewer for iOS and Android.  Hopefully, this will materialize in the next few weeks.

Monday, April 28, 2014

History of GTMetaExp, GTech Loader, and Oracle Spatial Loader

GTI has provided a product called GTMetaExp, short for GT/Metadata Explorer, since 2008 and it currently comes in two flavors:  Intergraph G/Technology and Bentley.  The G/Technology version is significantly more advanced and provides the most functionality, but the Bentley version as well as the Oracle Spatial Loader are related products that are also available that also deserve mention.  I wanted to provide a post that covered the history of the these products and how they  may be useful to you.

G/Tech Loader

Before I can talk about GTMetaExp, the history of the G/Tech Loader for GTViewer must be discussed since it is the origin of most of the technology we use to deal with G/Tech data.  GTI has been exporting Intergraph’s G/Technology data for viewing in GTViewer since 2002, and we have had 4 generations of G/Tech Data Loaders.  Utilizing only the Oracle data, the GTech Loader will query the relevant data to create all of the GTViewer data files (.gtg, .gtn, data.txt, data.idx, etc.).  

The First Generation loader was fairly simple and was essentially a custom VB6 app that we created for each separate dataset we exported.  We did use the G/Tech metadata to style the geometry, but it was a semi-manual task and the style rules were basically converted to VB6 syntax and processed by the application.   As primitive as this application was, we only recently upgraded an early G/Tech user to the current version of the Loader, so it turned out to be very capable at what it did. 


In 2004, we introduced a new version of the G/Tech Loader.  This version is more correctly classified as a CASE (Computer Aided Software Engineering) tool because instead of loading the G/Tech data, it used the G/Tech metadata to generate the code needed to build the original VB6 custom G/Tech Loader application.   The end result was essentially the same as the First Generation G/Tech Loader, but the effort required to implement it for a new dataset was radically reduced.


In 2007, we introduced the Third Generation G/Tech Loader.  It was completely rewritten from scratch and utilized .NET instead of VB6.   This iteration of the loader ditched the CASE tool approach and dynamically integrated the use of the G/Tech Metadata to produce a higher quality exports for GTViewer.  There were many design changes in this generation of the loader, primarily the G/Tech Style Rules were evaluated internally by the loader as it exported the data using the G/Tech Style Rule name for each feature as a GTViewer Style Rule.  This change allowed a much easier way to tweak the styles used in GTViewer without having to reload the data.   Somewhere in this time frame, the G/Tech Styles switched from blobs in the database to relational definitions, and the loader adapted to this change as well.   Tools were also provided to generate GTViewer Style Definition files form the G/Tech Style entries.



In 2011, we introduced the Forth (and current) Generation G/Tech Loader.   While several new features were added, the main changes were centered on switching from the G/Tech 9 Relational Geometries to G/Tech 10 Object Geometries.

Pre-GTMetaExp

So what does the GTech Loader have to do with GTMetaExp?  Well, all of our work that went into building the G/Tech Loader produced a set of tools that did many different things with G/Tech data:  dealing with Metadata, reading geometries (relational and object), computing styles for features, and composing and decomposing features.

Over the many year span of GTech Loader development, several tools were created to help us internally validate converted data or sift through the mounds of metadata to see what needed to be loaded.
The first tool created was the Legend to Style Tool.  It basically provided a GUI to let you point and click navigate from a Legend all the way to a Style.

Another tool was the Feature/Component Tool.  It let you point-and-click browse G/Tech Features and Components along with Database attributes for the tabular records.



Another tool was the Style Definition Tool which allows you to browse GTech styles and convert them to GTViewer style definitions.



Introducing GTMetaExp

All of these tools described above were very useful for their specific purpose.   In 2008, these tools along with some additional functionality were bundled together to create the GTMetaExp Version 1.   This tool was primarily for internal use, but interest from our users prompted us to productize it and make it available to others.  In 2011, GTMetaExp Version 2 was made available to support both G/Tech 9’s relational geometry and G/Tech 10’s object geometries as well as other differences between the two.

The individual tools we had created to support the development and operation of the G/Tech Loader became tabs in the GTMetaExp application:  Feature to Style, Feature and Components, and Styles.   We added new tabs for Picklists which let you browse and modify picklist values in the metadata; Validation which lets you perform various validation routines against the metadata and data, and Export which will export various parts of the metadata to a .MDB or .CSV file (so it can be used in other applications).  



Find Feature

The most powerful feature we have added to GTMetaExp is the Find Feature tab which is technically dealing with the Feature Data instead of the Metadata.   Find Feature allows the user to query for a feature by its attributes or its G3E_FID value.   Once a feature is found, you can perform a variety of tasks with it:   Attribute Info, Style Rule Info, Geometry Info, Connectivity Search, Trace Info, and Ownership Info.



Attribute Info – This tool will show an Attribute Info Dialog for the selected feature much like the one in GTViewer.  One nice feature of this tool is that it can show you the User Name for the Table and Attributes, and it can show you the actual database names as well.



Style Rule Info – Understanding why a style rule is firing for a particular feature can be a particularly useful piece of information.  This tool shows all of the style rules used for a specific feature’s components and highlights the rules that were used.   If you believe that one of the previous rules should have been used, you can select it and press Explain and it will give a detailed analysis of why that rule was or was not selected.




Geometry Info – This tool will show you all of the Geometry information for a specific feature including the elements in a geometry, oriented points for labels and symbols, and can provide the SDO_GEOMETRY as ASCII for a given feature (if you wish to manually make modification in Oracle).   This tool is extremely useful for isolating problems with geometries and also provides a graphical preview of the element.  While the screenshot below shows an Object Geometry used with G/Tech 10, the relational Geometry is also supported:


Connectivity Search and Trace Info– In FRAMME and G/Technology, connectivity is maintained in a separate connectivity table and really has no relationship to the actual graphics other than the nodes associated with the graphics and connectivity info.  Therefore, a variety of connectivity problems can arise where the data looks graphically correct, but the connectivity is not and tracing will not operate correctly.   Two tools are provided to assist.   Originally the Connectivity Search was provided to allow you to graphically illustrate all features connected to the selected feature and then allows you to step out one feature in all directions as many times as you want.   This tool can show a node view and a feature view to easily determine how the features are actually connected in the connectivity table. 

·        
Recently, a new feature called Trace Info has been added that will let you Trace from the selected feature step by step in a particular direction.  If there is a decision in the trace direction, you can choose the path to take.   This tool shows both a tabular view of the connectivity information (with color coded nodes) and a corresponding geometry view (showing the geometry of the actual feature) which makes identifying problems much easier.   You also have the choice of a Feature View and a Node View.




Ownership Search – Like the Connectivity Search, the Ownership Search starts at the connected feature and traces the ownership of the related features as far as they will go and draws a diagram of the relationships. 



Additional GTMetaExp Features

GTMetaExp provides such a large array of features it is sometime hard to categorize them.  Here are a couple of useful features that are also available:  Style Usage Reporting and GTViewer Query Builder.

Style Usage Reporting – Select a Legend, and Feature (or even a specific component), then get a summary of all styles used.   Each feature in the dataset will be evaluated against the Style and Label Rules while statistics are kept and then used to produce a summary report.  These reports can identify anomalies that are hard to find otherwise.



GTViewer Query Builder – prior to the Query Builder add-on app for GTViewer, a query builder was added to GTMetaExp to build GTViewer queries with the G/Tech metadata.   While not as sophisticated as the Add-On app, this feature may still be useful.


  
GTMetaExp for Bentley Data

There is also a GTMetaExp for Bentley data that will read the metadata .XML files and Oracle Spatial.   While this application is significantly less feature-filled than the G/Tech version, it does provide a great deal of information for Features, Criteria, and Domains.   Also, the Find Feature functionality is available and includes Geometry Info and Symbology Info (which are very similar to those in the G/Tech version).


Oracle Spatial Loader

After the addition of Object Geometry support to the GTech Loader and GTMetaExp, a new Loader for Oracle Spatial data was created from some of the already developed components.    The Oracle Spatial loader is a scaled down version of the GTech Loader (no metadata), but it has the ability to define styles based on expressions of feature attributes, and it also provides a Query feature that is similar to the Find Feature in GTMetaExp.   If you have Oracle Spatial data that you need to use with GTViewer, this application is an alternative to FME.



Summary

The product timeline for GTMetaExp, GTech Loader, and the Oracle Spatial Loader and the related projects are shown below:

       2000 - GTViewer
       2002 – G/Tech Loader - Gen 1
       2004 – G/Tech Loader - Gen 2
       2007 – G/Tech Loader - Gen 3
       2008 – GTMetaExp ver 1 (Relational Geo)
       2010 – Oracle Spatial Loader
       2011 – G/Tech Loader - Gen 4
       2011 – GTMetaExp ver 2 (Object Geo)
       2012 – GTBentleyMeta Explorer