Tuesday, January 18, 2011

An Implementation of the Graham Scan in VB.NET (2008) within a GTVx Application that Lists the Streets Near a Circuit

By Charlie Marlin, Systems Analyst, Huntsville Utilities, Huntsville, Alabama

Introduction

This article has two audiences:

  1. The VB.NET programmer who wants to see the Graham Scan implemented in VB.NET with comments in English. (The only example I’ve found on the internet has German comments.)
  2. GTVx application developers who want to see an implementation of the Graham Scan applied to a geospatial task that may be widely applicable.

The Most Relevant Code for the Graham Scan


Option Explicit On
Option Strict On
Imports System.IO

Public Class Form1

Private Sub StartButton_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles StartButton.Click

' a mechanism to loop through all the circuits...
For Each circuit As String In circuits
Try
filterId = filterId + 1

' build a list of vertices of the
' conductors for a circuit...
Dim pList As New List(Of Point)
pList = BuildPointList(circuit)

' find the start point (the one with minimal Y)
Dim startPoint As New Point
Dim pCount As Integer = pList.Count - 1
Dim yList(pCount) As Integer

For j As Integer = 0 To pCount
yList(j) = pList(j).Y
Next

Dim minY As Integer = yList.Min

' now find the index of the minimal point...
Dim i As Integer = 0
For i = 0 To pCount
If pList(i).Y = minY Then
startPoint = pList(i)
Exit For
End If
Next

' sort all points by polar coordinate
' against startpoint...
Dim sortedList As List(Of Point) = _
PreSortPoints(pList, startPoint, i)

' do the Graham Scan...
Dim convexList As New List(Of Point)
convexList = GrahamScan(sortedList)

Catch ex As Exception
'Logtime("Error in processing circuit " & circuit)
End Try
Application.DoEvents()
Next
End Sub

Private Function PreSortPoints(ByRef pList As List(Of Point), _
ByVal startPoint As Point, _
ByVal startPointIndex As Integer) _
As List(Of Point)

' start a new list and fill it with the
' start point, then all the points in pList '
' up to the startpoint, then
' all the points after the start point...

Dim sortedList As New List(Of Point)

sortedList.Add(startPoint)

For i As Integer = 0 To startPointIndex - 1
sortedList.Add(pList(i))
Next

For i As Integer = startPointIndex + 1 To pList.Count - 1
sortedList.Add(pList(i))
Next

' then sort the list by angle from zero,
' in preparation for the Graham Scan...
sortedList.Sort(1, sortedList.Count - 1, _
New FunctionComparer(Of Point)(Function(a, b) _
Orientation(sortedList(0), a, b)))

Return sortedList
End Function

' Does the point C lie counterclockwise or
' clockwise of the vector AB?
' If counterclockwise, return a positive number.
' If clockwise, return a negative number.
' If A, B, and C are colinear, return zero.
Private Function Orientation(ByVal A As Point, _
ByVal B As Point, _
ByVal C As Point) As Integer

Dim dif1 As Double = (B.X - A.X)
Dim dif2 As Double = (C.Y - A.Y)
Dim dif3 As Double = (C.X - A.X)
Dim dif4 As Double = (B.Y - A.Y)

Dim tmp As Double = (dif1 * dif2) - (dif3 * dif4)

If tmp < 0 Then
Return 1
ElseIf tmp > 0 Then
Return -1
Else
Return 0
End If
End Function

Private Function GrahamScan(ByVal slist As List(Of Point)) _
As List(Of Point)

Dim convexList As New List(Of Point)
If slist.Count < 4 Then
Return slist
Else
convexList.Add(slist(0))
convexList.Add(slist(1))

For j As Integer = 2 To slist.Count - 1
Do Until (convexList.Count < 2) OrElse _
Orientation(convexList(convexList.Count - 2), _
convexList(convexList.Count - 1), _
slist(j)) < 0
' i.e., if Orientation returns a
' number < 0 then remove the previous point

convexList.RemoveAt(convexList.Count - 1)
Loop

' in either case, add a point from slist...
convexList.Add(slist(j))
Next
Return convexList
End If
End Function

The VB.NET Project in a Zip File

Download here.

Discussion of the code

  1. The venerable Graham Scan was published in 1972. It builds a Convex Hull (CH) for an arbitrary sets of points in the Cartesian plane. (I have sometimes called the CH a “minimal bounding convex polygon”.) It first finds the coordinate pair with minimal Y. Then sorts the point set by polar coordinate from right to left with respect to the x axis. It then uses an algorithm to pick which of these points will remain in the CH. It runs in NlogN time. That is a terribly brief description, but I direct the reader to the references for further detail and insight.
  2. I altered the VB.NET code in the function “Orientation” in the German example because an integer value was routinely exceeding its capacity.
  3. I also altered the comparison function to return a 1, 0, or -1 instead of the actual value of an expression that is positive, zero, or negative depending on the slope of two lines.
  4. The whole subject of .NET interfaces, IComparable, and IComparer deserves a series of articles that I am not competent to write. I invite the reader to do his own research.
  5. I did not implement point thinning (interior point elimination). In the Year of Our Lord 2011, most computers are able to do the full Graham Scan of all the points in each circuit (in my case, from 0 to 2791) in a reasonable time. In fact, now would be a good time to share some performance numbers. There are 253 circuits at Huntsville Utilities. In the total of these circuits, there are 85,078 conductors. The GTVx application that reads in a list of circuit names and for each of the 253 circuits uses a query to build a point list of conductor vertices, then sorts the point list, then does the Graham Scan to determine the CH, then places a redline shape element defined by the CH, then finds the streets within the shape, and then writes a text file with each circuit name followed by the street names that fall within its area, takes under 5 minutes to run.

Practical results in GTViewer – What Problem is Solved?

This section is primarily intended for the audience of GTVx application developers.

We get questions from our users. If we are lucky. And if we are very lucky indeed, we get interesting questions. The application above rose from one: “Hey Charlie, is there any way to tell what streets are near a circuit?” “Probably, tell me more.” “Well, the dispatch department keeps a bunch of facts about each circuit. A map. The substation name. More stuff. And a list of the streets that are close to it. They look on a printed map and copy down the street names. Sure would be nice to do automatically.”

One of the most fortunate things that happens to GTVx application developers is that we can ask Joey Rogers how it would be most appropriate to approach a problem. In this case, he pointed me to the Graham Scan and a few web sites that describe it. And scanned a chapter of a textbook about the Graham Scan. From these, I was able to develop the code in the zip file. I think anyone who has worked for more than a few days with GTVx will recognize the techniques used in the project. Almost all of them come directly from code examples in the GTVx documentation.

Here’s a sketch of the approach: It’s pretty straightforward to use a query to get all the primary conductors on a circuit. Then it’s easy to get all their vertices. That is the point set processed by the two-step Graham Scan. Once you have an ordered list of points describing the convex hull, you can use that list to place a redline shape. Then you can count all the street features within the shape and use the CountDetails method to make a list of street names. Then you sort them and place them in a Listbox. Once all the circuits have been processed, you can write the Listbox contents to a text file. Done.

Not perfect. The convex hull surrounding a circuit may contain streets that are not very close to any conductor on that circuit. So the list of streets produced by the application is in practical terms a superset of street names from which inappropriate street names will need to be removed. I suspect this will turn out to be a manual task. But it makes producing the final lists of streets much simpler than starting with a map and a pencil.

Screen Shots

  • The full application form with GTVx control and Listbox for debugging.


  • Detail of a single circuit area.

  • The GTVx control with all circuits highlighted.




References

  1. http://www.iti.fh-flensburg.de/lang/algorithmen/geo/graham.htm - Includes a discussion of the Graham Scan in German, code in C, and a citation of Graham’s original paper in 1972.
  2. http://www.activevb.de/tipps/vbnettipps/tipp0113.html - Includes code in VB.NET with comments on German.
  3. http://www.cs.princeton.edu/courses/archive/fall06/cos226/lectures/geometry.pdf - Looks like a PowerPoint presentation lecture on various geometric algorithms, including the Graham Scan, in English.
  4. http://en.wikipedia.org/wiki/Graham_scan - Good article, in English, includes pseudo-code and some nuances of processing since 1972.
  5. Robert Sedgewick, Algorithms in C++, 1992. Chapter 25.

Thursday, January 13, 2011

GTV .NET Control version 9.0.0.16 is Available





The GTViewer .NET Control for Windows version 9.0.0.16 is Available.

------------
09.00.00.16 - 01/13/11
------------

- NEW - #6593 - GPS Trail functionality added. New Properties: GpsTrail,
GpsTrailMode, GpsDecayingTrailSize, GpsDecayingTrailFromColor,GpsDecayingTrailToColor, GpsDecayingTrailWidth, GpsRedlineTrailFilterId,GpsRedlineTrailColorId, GpsRedlineTrailWidth, GpsRedlineTrailStyleId.
- FIX - #6597 - GPS Keep Centered Mode was not working correctly.

- CHG - #6598 - If the GPSUpdateInterval value is changed, timer events will now respect the new value without having to stop and start tracking.
- NEW - #6601 - EmphasizeSessionGraphicsColor setting in Additional Properties is now supported. The Get/SetDataProperty methods for EmphasizeSessionGraphicsColor are also supported.

------------
09.00.00.15 - 12/22/10
------------

- FIX - #6588 - Element selection was not working correctly in some situations.

Wednesday, January 05, 2011

GTViewer version 10.0.0.6 is Available



GTViewer version 10.0.0.6 is available.

-----------------------
10.00.00.06 - 01/05/11
-----------------------

- NEW - #6583 - Option to check for updated version of a .GTM file at a remote location.

- FIX - #6584 - Setup was not delivering the Detail Photos directory.

- CHG - #6585 - Sample data was defaulting the Show Element Tab setting to off.

- CHG - #6586 - Category Thresholds are no longer stored in the session file. These thresholds will now be determined by the .GTM file.

- NEW - #6587 - Restore Default Display Settings has been added to the View menu to reset the sessions view settings to the default values defined by the .GTM and Filter Files.

- FIX - #6592 - DG entries in the Additional Properties section of the .GTM file were not parsing expressions containing Equal Signs "=" correctly.

GTVx version 10.0.0.4 is Available



Version 10.0.0.4 of GTVx is available.

-----------------------
10.00.00.04 - 01/05/11
-----------------------

- FIX - #6593 - DG entries in the Additional Properties section of the .GTM file were not parsing expressions containing Equal Signs ("=") correctly.

- NEW - #6594 - ViewUpdated Event was added.


Tuesday, December 28, 2010

Dynamic Graphics in GTViewer and GTVx

Introduction

Version 10 of GTViewer and GTVx provides an exciting new feature called Dynamic Graphics which gives the user a powerful visualization tool for analyzing data, creating more informative or alternate views of data, and giving the user the ability to explore various decision making aspects of the data they already have. The Dynamic Graphics functionality uses a set of rules to generate new graphics on-the-fly from a variety of sources including a feature’s attribute values, the current zoom level, and even the presence of other dynamic graphics. The goal of the Dynamic Graphics functionality is to provide an easy way to generate thematic maps, feature labels, and analytical constructions in both an ad hoc manner or as prepackaged queries delivered with a dataset. The end result is data for your users that will enhance their productivity and ability to make decisions in the office or in the field.

History

The beginnings of the Dynamic Graphics functionality first appeared in Version 9 of GTViewer as the Dynamic Highlighter. This tool provided a significant amount of functionality for performing thematic queries whose results were shown by highlighting features meeting specified criteria. The highlight color was determined by one of the feature’s attributes value and looking up the value in a specified color map. The original purpose of the Dynamic Highlighter was to help identify a specific circuit on a map containing many circuits drawn in the same area all with the same style (color, weight, and linestyle). The Dynamic Highlighter gets a particular attribute on a feature, looks that value up in a color map (which maps a set of values to corresponding colors), and then highlights the feature in that color (appearing that the feature of interest changes color). Now, a single circuit in the view is easily identifiable amongst many other circuits. Color coding all circuits is also possible if an attribute is available to drive the color of the highlight. Many other applications of the Dynamic Highlighter quickly appeared such as showing circuit by phase, circuit by high or low voltage, gas pipes by pressure or material, and many more.

While being a very powerful tool, the Version 9 Dynamic Highlighter has some limitations. It can only look at a single attribute of a feature when determining the highlight color. Often, this single value was enough to do the job, but sometimes you needed several attribute values to determine the color or more complicated computations that go beyond a value lookup in a color map. Work-arounds for this problem are available, but they usually required creating a View in the GIS to create a single value for the highlighting task which hindered the “ah hoc-ness” of the functionality if the views were not already created. The interface for the Dynamic Highlighter was also a little primitive. Its rules could be defined as entries in the in the GTM file and methods were provided for External Applications to load new rules from a file. The Dynamic Highlighter was not supported in GTVx either. In the end, the Version 9 Dynamic Highlighter turned out to be more useful to the design of the new Dynamic Graphics functionality than it was to the Version 9 user base; nevertheless, it laid a down a good foundation for the next generation and greatly contributed to making Version 10 the best yet.

Dynamic Graphics

In Version 10 of GTViewer, the new Dynamic Graphics functionality provides a significantly enhanced version of the Dynamic Highlighter seen in version 9 plus a completely new Dynamic Labeler. A user-friendly Interface is also provided to configure the Dynamic Graphics rules. Now, users can quickly and easily create thematic queries or labels on-the-fly without the need to add entries to a configuration file or even need to know what the configuration files contain.

Dynamic Highlighting

The new Version 10 Dynamic Highlighter contains many new features:
  • One or more feature attributes can now be used in expressions to define a filter criteria which determines which features will get highlighted and to define a Map Value which will be used to look up the highlight style. Previously, only one feature attribute could be used and its value had to appear in the highlight style map.
  • The Highlighted Elements that get produced by the Dynamic Graphics are no longer limited to just being a different color. Weight and Linestyle can now be specified.

  • The Highlighted Elements can now be set to behave like regular elements in the Emphasize Session Graphics mode (which typically gray out when active). This ability to masquerade the highlighted elements as regular elements adds a new dimension to what can be done with highlighted elements since the original GIS features can be hidden and the Dynamic Graphics can provide an alternate view of the features.

  • The Dynamic Highlighter provides 2 modes of operation. The regular Highlight mode provides the full set of functionality utilizing a Color/Weight/Linestyle map to assign highlight styles according to an evaluated Map Value. A scaled down mode called Simple Highlight is also provided and simply highlights all features meeting the filter criteria using the same Color/Weight/Linestyle setting which eliminates the need to configure a Color/Weight/Linestyle Map for simpler Actions.

  • Dynamic Graphics is now supported in GTVx as well as GTViewer.

Dynamic Labeler

The Dynamic Labeler is the second half of the Dynamic Graphics functionality, and it does precisely what its name implies. The Dynamic Labeler generates labels for point, line, and area features using a set of rules. Depending on the type of label desired and the type of geometry it will be created for, many different options are available to specifying the label. The “Dynamic” in Dynamic Label pulls double duty since the labels are generated on-the-fly from the features in the current view, and can also take into account what parts of a feature is actually displayed in the view. For example, centering a label on a line that is 75% out of the view would likely produce a label you would not see since the center of the line would be outside the view, but the Dynamic Labeler can clip the geometry and only use the part that is in the view keeping the label displayed. Much more effective labels can be generated for an ever changing view. Our previous approach to generating labels that were not part of the source GIS was to use the GTLabelGtg tool (part of GTData) to build a nice set of labels for a dataset. These labels are static and will always be the same size and in the same relative position regardless of the view extents. The Dynamic Labeler can be configured to create similar static labels, but its power comes from its dynamic capabilities which simultaneously create more useful labels and a more aesthetically pleasing map view.

Dynamic Label Examples

To illustrate what the Dynamic Graphics functionality actually does, pictures are worth a thousand words.

The screenshot below shows 3 lines that use a Dynamic Label. In each line, the segment containing the mid-point of the line is found, then the mid-point of that segment is used as the origin for the label:

The Dynamic Labeling supports a Static placement mode (like GTLabelGtg would produce) and the screenshot below shows how the label behaves in the static mode when the lines are partially moved out of the current view:



The topmost line has its label go out of the view, and the bottom two lines have their labels moved to the edge of the screen.

In the screenshot below, the dynamic placement is active and the labels are placed more intelligently by only using the parts of the lines that are currently visible:



The example below shows a rotated "V" shape line that is fully in the current view. Here the line gets one label:


However, if the line is moved partially out of the current view, two separate lines are left and each gets a label of its own:


A more realistic example is shown below. Street centerlines are labeled with information from the database (the street name and street type) and a variety of rules are used to create a usable view: duplicates are removed, labels that overlap other labels are removed, and labels that are longer than the street segment they are associated with are removed.



In the screenshots below, the primary conductor feature is labeled with its Circuit Name, Phase, and Voltage in Red text:


Dynamic Labeling is not limited to lines. Both Point and Shape features are supported as well. The following screenshots show how Shape elements can take advantage of the dynamic label placement:

The topmost screenshot above shows two shapes in the current view with a Dynamic Label placed at the centroid. The lower left image shows how static labels will be have if the shapes are moved partially out of the current view, and the lower right image shows the same view with the dynamic positioning turned on (which uses the centroid of the visible parts of the polygons).

Dynamic Highlight Examples

A Dynamic Highlighting example is shown in the screenshots below where the gas main features are highlighted according to the feature's Pressure attribute values:

The topmost screenshot above shows the regular view of a gas network. The middle screenshot shows the gas network with Medium Pressure main colored Orange and Low Pressure main colored Blue. The bottom screenshot shows the highlighted gas mains with the emphasize mode turned on so that the Highlighted results are easier to see.

In the screenshot below, electric facilities are colored by their phase (A is Red, B is Green, C is Blue, and Orange is multiple).


Monday, November 29, 2010

GTViewer 10 has been Released!







What’s New in GTViewer 10


Dynamic Graphics –a powerful visualization tool for analyzing data and creating more informative or alternate views of the data. The Dynamic Graphics functionality uses a set of rules to generate new graphics on-the-fly based on a feature’s attribute values, the current zoom level, and even the presence of other dynamic graphics. The goal of the Dynamic Graphics functionality is to provide an easy way to generate thematic maps, feature labels, and analytical constructions in an ad hoc manner or as prepackaged queries delivered with a dataset.

Command-Line Options – an extended set of command-line options has been added to simplify the integration of GTViewer with other applications like mobile workforce management. These new options can be used to start GTViewer and then locate on a specific coordinate, perform a query, initialize the GPS and Reference Points, set Display Presets, and activate Favorites. If GTViewer is already running, these command-line options can still be used to update the view location and change view settings.

Expressions Support – Custom Attribute Info Tabs and Feature Tooltips can now use expressions to specify the information they display. These expressions can use one or more feature attributes as well as formatting, mathematical, and string manipulation functions.

Custom Raster – standard raster formats (such as .bmp, .jpg, .tif) can now be attached to the main view. These raster files can serve as embedded detail drawings or be used to enhance a view’s appearance.

Style Definition Id –Version 10 elements now support an optional Style Definition Id which directly associates a Style Definition with an element and does not require a mapping from the element’s Filter Id to a Style Definition via the Style Map. The Style Definition Id can be used to decouple the Filter Ids from the Style Definitions, allowing more flexible groupings in the Display Filter Definitions.

GPS Components – the GTViewer Installation now supports the installation of the GPS Component without the need of a separate installation.

Demo Dataset – The Electric Demo dataset previously delivered with GTViewer has been updated. The new Electric/Gas/Fiber demo dataset illustrates many of the newer features in GTViewer including the Dynamic Graphics, Feature Tooltips, and Custom Attribute Info tabs.



GTViewer 10.0.0.5 is Available



GTViewer version 10.0.0.5 is available.

This version is the official release of GTViewer version 10.


-----------------------
10.00.00.05 - 11/29/10
-----------------------

- NEW - #6581 - Dynamic Graphic ocumentation added.


-----------------------
10.00.00.04 - 11/23/10
-----------------------

- FIX - #6576 - FillOffForRaster was not working correctly when Dynamic Graphics Actions were being processed.

- FIX - #6578 - Updates to the MRU file list so that that opened files properly added to the list.

- NEW - #6579 - Dynamic Graphics interface delivered as a custom component in the Installshield setup.

-----------------------
10.00.00.03 - 11/18/10
-----------------------

- NEW - #6572 - GPS Components are now available as an Optional Component in the Custom Setup options with the Installshield setup.

- NEW - #6573 - Online Help files updated.

- CHG - #6574 - Demo Dataset has been updated and is also not installed by default. It can still be selected under the Custom Setup option.

-----------------------
10.00.00.02 - 11/17/10
-----------------------

- FIX - #6565 - Label Size for Dynamic Graphics has been changed to a double to handle larger values when computing pixel sizes for lat/long projections.

- FIX - #6566 - Fill Off For Raster setting was prevent mask feature in Dynamic Graphics functionality from drawing.

- FIX - #6567 - Problems with Magnify mode and Dynamic Graphics element in emphasize mode.

- FIX - #6568 - Shapefile export will now support Style Origins for Text Elements using Symbol fonts.

- CHG - #6570 - GetFeatureList will now skip records for mode 1 if the GIS feature is blank and skip records for mode 2 if the GIS feature or GIS component is blank.

-----------------------
10.00.00.01 - 11/9/10
-----------------------

- FIX - #6552 - The highlight list and cache were not updated after a Dynamic Graphics Action was deleted.

- FIX - #6553 - Dynamic Graphics kept the previous highlight if DMRestoreDefault reverted back to an empty action list.

- CHG - #6556 - Label Size for Dynamic Graphics will now defaults to Master Units, but can be specified in Text Element units using: Text:. Fixed Size mode is now specified in Pixels as the unit.

- NEW - #6561 - PresetGetPresetIdEx, PresetAvailableListEx,and PresetActivateEx methods have been added to access user-defined presets.

- NEW - #6562 - PresetGetAvailableList added.

- FIX - #6563 - The + and - keys where corresponding to the MouseWheelIncrement direction which was not correct. The + should always zoom in, and the - should always zoom out.

- FIX - #6564 - About Dialog was showing a menu bar at the top.

===============================================================================

-----------------------
09.00.00.19 - 10/04/10
-----------------------

- NEW - #6501 - DataSetId can now be retrieved with GetDataProperty.

- NEW - #6508 - GTI_DG.Length and GTI_DG.Area variable are now supported for Dynamic Graphic Expressions.

- NEW - #6509 - Expression support for Custom Attribute Tab Definitions.

- NEW - #6510 - Expression support for Feature Tooltip Definitions.

- NEW - #6513 - CHR function added to expression evaluator.

- FIX - #6515 - Expression Evaluator was not handling Unary Minus correctly in several situations.

- FIX - #6517 - Expression Evaluation was not handling double values correctly with the IN operator.

- FIX - #6519 - Lpad and Rpad functions were not handling the pad string correctly when it contained more than 1 character.

- NEW - #6522 - Pretty function added to expression evaluator.

- FIX - #6524 - Expression Evaluator was not handling nested expressions correctly if functions with more than one parameter were used as a parameters.

- FIX - #6527 - Expression containing internal parentheses and commas in literal strings could cause problem with the expression parsing.

- FIX - #6547 - Highlighting elements where some had weight overrides and priority style values greater than 0 would cause the weight override to sometimes not display.

- FIX - #6548 - Preventing of the duplicate draw of dynamic graphic elements on the screen and the backing store.

- FIX - #6549 - Preventing of the duplicate draw of dynamic graphic elements on the screen and the backing store.

-----------------------
09.00.00.18 - 10/04/10
-----------------------

- NEW - #6495 - Custom Raster support.

- NEW - #6498 - The LoadDefaultStyleInfo method has been added to restore the default style definition, style map, and linestyle definition informaiton.

- NEW - #6500 - Toolboxes now support the LoadDefaultStyleInfo command.

-----------------------
09.00.00.17 - 10/01/10
-----------------------

- FIX - #6496 - If an elements style id was set greater than 7 (could be done with FME), then GTViewer could have problems with the element.

- CHG - #6497 - The GpsMaxZoomLevel functionality has been modified so that the zoom is not applied until the first GPS Update.

-----------------------
09.00.00.16 - 09/27/10
-----------------------

- FIX - #6490 - Using the command-line option -query with -GpsOn would result in an invalid previous location if no records were found and the query is cancelled.

- NEW - #6491 - The Info1 and Info2 properties were added to the Dynamic Graphics Action items.

-----------------------
09.00.00.15 - 09/23/10
-----------------------

- NEW - #6458 - The Favorite Preset can now be a user preset as well as a fixed preset.

- NEW - #6460 - Dynamic Graphics functionality added.

- FIX - #6465 - Dynamic Highlight was not closing temp file when using a GTX file. This prevent an internal session from being saved.

- FIX - #6466 - Redline elements that are placed with several thresholded style rules were computing the index range using zoom level 1. You can now set a RedlineStyleZoomLevel entry in the [Additional Properties] section of the .GTM file to specify which zoom level will be used when computing ranges for redline graphics.

- FIX - #6467 - ImportSessionGraphics did not initialize the Style Rules before importing.

- NEW - #6468 - Feature Tooltip will now support embedded data.

- NEW - #6469 - LineStyleDefinitionFileScaleFactor and StyleDefinitionFileScaleFactor entries have been added to the [General Info] section to scale the linestyle and style as a whole.

- NEW - #6470 - Component Name and Feature Name fields from the GIS: tag are now supported.

- FIX - #6473 - Closing the document before the Attribute Info dialog could cause problems when the unhighlight code is executed on the non-existent view.

- NEW - #6474 - AutoReverseHighlightColor added to the Data Properties. Defaults to 1, if set to 0, Highlight features of the same color will not reverse the color.

- NEW - #6476 - Message 600 added to indicate that the zoom level has changed.

- NEW - #6477 - GpsMaxZoomLevel added to the Additional Properties section to specify the maximum zoom level when the Gps is started. If the zoom level is greater than the specified value, the zoom level will be adjusted.

- NEW - #6478 - Highlighting can now internally support a linestyle style id override.

GTData Objects version 10.0.0.1 is Available








GTData Objects version 10.0.0.1 is available.

The GTData Objects is a new component for the GTViewer SDK to create and read .GTG files (GTViewer’s native graphics format). Providing similar functionality to the GTCreate and GTRead ActiveX controls already delivered with the GTViewer SDK, the GTData Objects are 100% .NET and have been optimized for the .NET environment.

Wednesday, November 24, 2010

GTVx version 10.0.0.3 is Available



Version 10.0.0.3 of GTVx is available. This version of GTVx is the official release of GTVx Version 10. This version contains several major enhancements including the Dynamic Graphics functionality, Style Manager, Expression support in the Custom Attribute Info Tabs and Feature Tooltips, Custom Raster support, and Style Definition Ids support. The API has 23 new methods and a new example application is available to demonstrate the Dynamic Graphics interface.

-----------------------
10.00.00.03 - 11/24/10
-----------------------

- FIX - #6580 - Installation was not delivering documentation or examples.

-----------------------
10.00.00.02 - 11/23/10
-----------------------

- FIX - #6551 - Dynamic Graphics kept between sessions. It is now reset.

- FIX - #6554 - Dynamic Graphics kept the previous highlight if DMRestoreDefault reverted back to an empty action list.

- FIX - #6555 - The highlight list and cache were not updated after a Dynamic Graphics Action was deleted.

- NEW - #6560 - PresetGetPresetIdEx, PresetAvailableListEx, and PresetActivateEx methods have been added to access user-defined presets.

- FIX - #6569 - Shapefile export will now support Style Origins for Text Elements using Symbol fonts.

- CHG - #6571 - GetFeatureList will now skip records for mode 1 if the GIS feature is blank and skip records for mode 2 if the GIS feature or GIS component is blank.

- FIX - #6577 - FillOffForRaster was not working correctly when Dynamic Graphics Actions were being processed.

-----------------------
10.00.00.01 - 10/25/10
-----------------------

- FIX - #6359 - Display Filter would complain when threshold values were greater than 500000. Changed to match GTViewer's limit of 2 billion.

- NEW - #6371 - The Contains token is now supported by the Display Toggles so that you can turn on or off items by filter names that contain a specified string.

- FIX - #6373 - for the ColorValue with Layered Symbol Definition did not work correctly.

- FIX - #6377 - Composite Group elements (extended Style id = 1, 2, or 3) were not correctly handling having no Style Rule.

- CHG - #6381 - All default Stroke Angles changed from 15 to 5 degrees.

- NEW - #6393 - StyleManager has been added.

- NEW - #6396 - Set and GetDataProperty now supports AttributeInfoEditStyle.

- NEW - #6399 - Data Id added to the Attribute Info Element data in the Header section.

- NEW - #6405 - GetHighlightList method added.

- NEW - #6411 - The ScaleMode parameter for Redline Symbols is now supported. If set to 0, it will use the Length and Height parameter for the symbol size. If set to 1, it will use the Height value as a text size (similar to the Text placement dialog).

- NEW - #6412 - Additional logging added to the Sym entries in the Additional Properties section.

- FIX - #6443 - Range Mask could obscure the view at very low zoom levels.

- FIX - #6455 - A Custom Attr Tab with the same name as another tab for a feature will cause problems. Now, if the Custom Attr Tab name is not unique, it will log an error message and ignore the custom attr tab.

- NEW - #6459 - AutoReverseHighlightColor added to to Data Properies. Defaults to 1, if set to 0, Highlight features of the same color will not reverse the color.

- NEW - #6487 - Dynamic Graphics Functionality added.

- NEW - #6488 - Shift Pan mode has been added to Attr Info Mode and Zoom Mode.

- NEW - #6499 - The LoadDefaultStyleInfo method has been added to restore the default
style definition, style map, and linestyle definition information.

- NEW - #6502 - DataSetId can now be retrieved with GetDataProperty.

- NEW - #6504 - Custom Raster support.

- NEW - #6511 - Expression support for Custom Attribute Tab Definitions.

- NEW - #6512 - Expression support for Feature Tooltip Definitions.

- NEW - #6514 - CHR function added to expression evaluator.

- FIX - #6516 - Expression Evaluator was not handling Unary Minus correctly in several situations.

- FIX - #6518 - Expression Evaluation was not handling double values correctly with the IN operator.

- FIX - #6520 - Lpad and Rpad functions were not handling the pad string correctly when it contained more than 1 character.

- NEW - #6523 - Pretty function added to expression evaluator.

- FIX - #6525 - Expression Evaluator was not handling nested expressions correctly if functions with more than one parameter were used as a parameters.

- FIX - #6533 - Expression containing internal parentheses and commas in literal strings could cause problem with the expression parsing.

- FIX - #6545 - Problems when computing the length of Shape with Hole elements with the Attribute Info. Shape with Hole elements are not supported for length and an unitialized precision value could cause issues.

- FIX - #6546 - Highlighting elements where some had weight overrides and priority style values greater than 0 would cause the weight override to sometimes not display.

- FIX - #6550 - Preventing of the duplicate draw of dynamic graphic elements on the screen and the backing store.

GTData version 10.0.0.1 is Available


GTData version 10.0.0.1 is available.

-----------
10.00.00.01 - 11/23/10
-----------

- FIX - #6333 - GTTextQuery - Problem caused when the new element linkage was generated but no linkage array was populated. Introduced with #6312.

- NEW - #6360 - GTGts2gtg - The -i option can now repeat to specify multiple input files.

- NEW - #6361 - GTGts2gtg - The -tag and -tagAll options have been added to embed the source file's filename on each element.

- FIX - #6429 - All - Data Range now defaults to a valid range if no range is specified in the .GTM file.

- FIX - #6456 - GTConv - The point buffer for Attribute Elements (Type 37) linked to Arc elements was not large enough.

- NEW - #6489 - GTDumpOrcl - The GTDumpOrcl utility has been added.

- NEW - #6503 - GTQuery - The Feature entry will now support an internal wildcards (*, ?).

- NEW - #6507 - GTInterGtg - HighMemoryMode entry has been added. When set to 1, it will create a file for the spatial index instead of an in memory one.

Tuesday, November 16, 2010

Rocket City Geospatial Conference 2010




Come see us at the Rocket City Geospatial Conference.

Nov 16th & 17th,

Davidson Center for Space Exploration
(adjacent to the U.S. Space and Rocket Center)
Huntsville, Alabama