Tuesday, April 19, 2011

Demo of GTWeb Client for Android Tablets (Honeycomb)

You may have seen our video demonstrating the GTWeb Client on an Android phone, but we have a new video showing off the app on a Motorola Xoom tablet which is running Android 3.0 (Honeycomb).

http://gti-us.mobi/video/honeycomb/gtweb-honeycomb.html


For more information on the GTWeb Client, see this post.

And for a demo of the GTWeb Client on a BlackBerry phone, see this post.

Friday, April 15, 2011

GTViewer Plugin for 64 Bit FME is now Available



The GTViewer Reader/Writer plugin for FME is now available in both 32bit and 64bit versions.

The new 64 bit version will work with FME 2011 and higher. This version will be delivered with future versions of FME, but it can also be added to a current installation. Contact support for more information.

Wednesday, April 06, 2011

GTWeb Client for BlackBerry Demo


GTI announces GTWeb Client for BlackBerry.

Here is a short video showing some of the features:

http://gti-us.mobi/video/bb/gtweb-bb.html

GTWeb Server provides a geospatial viewing solution for internet and intranet clients. GTWeb is centrally managed and can support a large number of clients requiring frequent or occasional access to both graphical map data and tabular database records.

GTWeb Server can be accessed using a browser on any platform; however, the GTWeb Client for BlackBerry provides a rich experience tailored specifically for the BlackBerry device and supports supports GPS location, locate queries, favorites, map panning and zooming, display presets, attribute info review, and linked detail files.

If you would like to be part of the GTWeb Client beta program, please contact GTI.

Also, watch the demo of GTWeb Client for Android.



Wednesday, March 30, 2011

GTViewer version 10.0.0.9 is Available



GTViewer version 10.0.0.9 is available.

-----------------------
10.00.00.09 - 03/30/11
-----------------------

- FIX - #6677 - Problem parsing embedded data with escape sequences.

- FIX - #6678 - Problem computing range for group element in Session File when sub-element were not displayable elements.

- FIX - #6679 - Problem with StyleDefinitionId and Override flags being read in from .GTS files no using the enhanced format.

- CHG - #6680 - Changes to the MrSid printing so that it will support larger format prints.

- NEW - #6682 - The command-line option -startMode can now be specified.

- FIX - #6683 - Magnify window could get the wrong initial setting when using session files from GTField.

- FIX - #6684 - Highlighting priority element with Magnify could cause problems. Introduced with #6632.

- FIX - #6687 - The -GpsOn flag was overriding the default Startup Mode.

-----------------------
10.00.00.08 - 03/19/11
-----------------------

- NEW - #6634 - MoveActionUp and MoveActionDown have been added to the list of commands supported by DGProcessCommand.

- NEW - #6635 - The Pretty function for the Dynamic Graphics expression will now capitalize words after '_', '-', and '/'.

- NEW - #6636 - The following methods have bene added: SaveCurrentStyleMapFile, SaveCurrentStyleDefFile, SaveCurrentLinestyleDefFile.

- NEW - #6637 - Fill option added for Dynamic Graphics Map entries, Simple Highlight mode, and the Highlight Mode's default values.

- FIX - #6638 - The Info1 and Info2 properties were not handled correctly by the Dynamic Graphics.

- FIX - #6641 - Priority Display has been disabled for Dynamic Graphics since this conflicts with the Action drawing order.

- NEW - #6645 - User Mode has been added to Dynamic Graphics Interface.

- NEW - #6646 - The Dynamic Graphics Admin form is now collapsible.

- NEW - #6647 - The Expression Form in the Dynamic Graphics Interface now includes a Clear
and a Set to TRUE button.

- FIX - #6654 - Justification combobox has wrong label for Center/Right in Dynamic Graphics Interface.

- FIX - #6656 - Problem with styles on Complex Elements (Type 1, 2, 3).

- FIX - #6660 - Pressing the Add Attribute on the Expression dialog without an attribute being set would cause problems.

- FIX - #6662 - Dynamic Graphics was not considering Complex Lines as Linear element and Complex Polygons as Polygons.

- FIX - #6665 - Extracting by Shape would not get Shape with Holes elements (type 114).

- FIX - #6667 - Map entries were not correctly saving and restoring the Linestyle and fill values.

- FIX - #6671 - Problem with embedded data in Session Files (.gts).

GTVx verison 10.0.0.7 is Available



Version 10.0.0.7 of GTVx is available.

-----------------------
10.00.00.07 - 03/29/11
-----------------------

- FIX - #6685 - Highlighting priority elements with Magnify could cause problems. Introduced with #6632.

- FIX - #6686 - Changes to the MrSid printing so that it will support larger format prints.

- NEW - #6688 - The ExportFontAsBitmaps method has been added.

-----------------------
10.00.00.06 - 03/19/11
-----------------------

- NEW - #6629 - MoveActionUp and MoveActionDown have been added to the list of commands supported by DGProcessCommand.

- NEW - #6630 - The Pretty function for the Dynamic Graphics expression will now capitalize words after '_', '-', and '/'.

- NEW - #6631 - The following methods have bene added: SaveCurrentStyleMapFile, SaveCurrentStyleDefFile, SaveCurrentLinestyleDefFile.

- NEW - #6632 - Fill option added for Dynamic Graphics Map entries, Simple Highlight mode, and the Highlight Mode's default values.

- FIX - #6633 - The Info1 and Info2 properties were not handled correctly by the Dynamic Graphics.

- FIX - #6639 - Priority Display has been disabled for Dynamic Graphics since this conflicts with the Action drawing order.

- CHG - #6640 - Drawing order for the Dynamic Graphic Actions has been reversed so that the first item in the Action list is the last drawn. This change make the Action list list the Action is the order they appear with the first Action on top, the second action under it, and so on.

- FIX - #6655 - Problem with styles on Complex Elements (Type 1, 2, 3).

- FIX - #6663 - Dynamic Grahpics was not considering Complex Lines as Linear element and Complex Polygons as Polygons.

- FIX - #6664 - RasterPC entries were not processing absolute paths correctly.

- FIX - #6666 - Extracting by Shape would not get Shape with Holes elements (type 114).

- FIX - #6672 - Problem with embedded data in Session Files (.gts).


Friday, March 25, 2011

GTData version 10.0.0.2 is Available


GTData version 10.0.0.2 is available.

-----------
10.00.00.02 - 03/25/11
-----------

- NEW - #6606 - GTFont - The -b2a flag has been added to use the Binary to Ascii mode.

- NEW - #6609 - GTPreset - The Display Definitions will now support wildcards in the GIS() tokens for both feature and component.

- NEW - #6610 - GTPreset - The verbose flag (-v) has been added to the command-line to output all filter id by GIS feature and component name.

- NEW - #6626 - GTVSendClose - New utility added to gracefully shutdown GTViewer when run.

- NEW - #6661 - GTQuery - Key1Attribute and Key2Attribute can now be used in place of GidAttribute and UfidAttribute. Key Attributes are now display in the query output as well.

- FIX - #6681 - GTCompact - The original files Header Info String was not being carried over to the compacted file.

Friday, March 18, 2011

10th Anniversary for GTViewer and Pocket GTViewer



In honor of GTViewer and Pocket GTViewer’s 10th Anniversary, here are 10 things you probably don’t know about them:
  1. GTViewer and Pocket GTViewer were announced at GITA in San Diego, March 4-7, 2001.

  2. Pocket GTViewer was developed on a Hewlett Packard Jornada 430, running Windows CE 2.11, 16M of memory, and a 133MHz processor. Sorry, they are no longer available.

  3. GTViewer’s original purpose was to create Extract files (.GTX) for Pocket GTViewer. We have since found other uses for GTViewer.

  4. The original codename for GTViewer was “Dog”, and Pocket GTViewer was “DogCE”. Some evidence of these names still exist today. The GTViewer Font file format is .DFN (Dog FoNt). Extract files were .DCE (Dog for CE) before .GTX.

  5. Version 1.0 of GTViewer had separate Zoom In and Zoom Out modes which were replaced by the single Zoom mode using gesturing that we have today. Today we would call that Refactoring the GUI.

  6. While there are 10 major versions of GTViewer, there is no version 6.0. There was, however, a version 1.1 to make major 10 versions. The version number roughly corresponds to the year, or at least the year it was released in.

  7. There are no versions with “13” in them. Not superstitious, but not taking any changes either.

  8. There are currently 353 exposed methods in the GTViewer API. So start writing code!

  9. There have been 274 minor versions of GTViewer from 1.1.0.4 to 10.0.0.7. There are probably another 50 minor versions, but the records for version 1.0 are not as detailed as the rest.

  10. GTViewer alone has around 600 pages of documentation not including the numerous blog posting. And people still say there is not enough!

Thursday, March 17, 2011

GTV Control verison 9.0.0.20 is Available





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

------------
09.00.00.20 - 03/17/11
------------

- NEW - #6628 - The maximum number of items specified in the tap-and-hold picklist menu can now be set with the MaxPickListItems property.

- FIX - #6658 - Problem with styles on Complex Elements (Type 1, 2, 3).

- NEW - #6668 - More GPS Update Interval Option are now available (1/10, 1/4, 1/2, and 0 seconds).

- CHG - #6669 - The buffer zone when the GPS Indicator is recentered when in Keep in View mode has been increased.

- NEW - #6670 - The IsPointInShape method has been added.


------------
09.00.00.19 - 02/22/11
------------

- FIX - #6624 - FitSessionGraphics method did not fit correctly when GTField elements were present.

------------
09.00.00.18 - 02/9/11
------------

- FIX - #6607 - File Handle test was not being performed before Session Saves and Element Additions. This problem could affect .GTX files
when the machine goes to sleep or some other condition that could invalidate a file handle.

------------
09.00.00.17 - 01/14/11
------------

- FIX - #6602 - GPS Redline trail had problems when control was minimized.

Tuesday, March 08, 2011

TechAdvantage 2011




Come see us today at TechAdvantage® 2011 Conference and Expo
in Orlando. We will be there from March 8-11, 2011.

Our booth number is #1435 on the North-East side of the show floor.




Tuesday, March 01, 2011

GTWeb Client for Android Demo




Here is a short video showing the GTWeb Client for Android:

http://gti-us.mobi/video/gtwebdemo.html

*** Watch in Full Screen Mode to see all of the details.

For more information on the GTWeb Client, see this previous post.

Monday, February 28, 2011

PGTV .NET Control Version 9.0.0.9 is Available



The PGTViewer .NET Control for Window Mobile version 9.0.0.9 is available.

------------
09.00.00.09 - 02/28/11
------------

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

- NEW - #6627 - The maximum number of items specified in the tap-and-hold picklist menu can now be set with the MaxPickListItems property.

------------
09.00.00.08 - 09/21/10
------------

- FIX - #6485 - Fixes to .MSI Setup.


Friday, February 25, 2011

TechAdvantage 2011

GTI will have a booth at the TechAdvantage® 2011 Conference and Expo from March 8-11, 2011.

Our booth number is #1435 on the North-East side of the show floor.

We invite you to stop by and visit our booth. We will be showing the GTWeb Client for Android, GTViewer's Dynamic Graphics capabilities, GTField's Pole Joint Use application, Outage Analysis, Upstream/Downstream tracing, and much more.



Using GTViewer for Streetlight Inventory

Rather than relying on estimates and negotiation, GTField can be used to determine the actual number of streetlights and attachments on each company owned pole. Too much revenue is lost due to inaccurate or incomplete facility records. GTField provides the ability to easily capture the revenue from those new and changing facilities.

The payback is almost immediate. One of our customers captured well over $100,000.00 in revenue using GTI’s Streetlight Light Inventory/Pole Inspection Application in a city with a population of 65000.

GTI can implement GTField in as little as 2 weeks with no existing GIS or minimal integration with an existing GIS system. Training on using GTField is fast and easy. Implementation of other competitive services takes much longer at a significantly higher cost.

Thursday, February 24, 2011

GTVSendClose Utility

GTVSendClose is a new utility that will be delivered with GTData. Running the new utility will gracefully shutdown GTViewer. You may think this is an odd utility to have, but it was requested by a customer who uses a very clever and effective means of distributing data updates to its GTViewer users. I will describe the process below and show how GTVSendClose helps out the process. It may be useful to your workflow as well.

First, a GTViewer dataset is created and placed on a USB Flash Drive along with any GTViewer product updates. An autorun.inf file is also included to run a script which copies the updates from the USB Flash Drive to the laptop. When the USB Flash Drive is plugged-in to the laptop, the update process automatically begins.

Second, once the USB drive is prepared, a USB Flash Drive Duplicator (like this one) is used to copy the flash drive to a number of other USB Flash Drive.

Third, the copied USB Flash Drives are disseminated to the users and they plug them into their laptops and the data is automatically updated, and the USB Flash Drive is returned.

One problem that occurred in this workflow was that the user could have left GTViewer running when the USB Flash Drive was plugged-in and the updates could not be copied because the data files would be locked by GTViewer. Not a terribly difficult problem to overcome (shut down GTViewer, and try again), but there is an improvement that can be made to the workflow.

By inserting a call to GTVSendClose (which can be located on the USB Flash Drive) into the update script launched by the autorun.inf, you can guarantee GTViewer will not be running when the update begins and eliminate the potential for locked files.

There are some caveats here. If a user has created a new session in GTViewer that has not yet been saved, GTViewer will prompt the user for a filename and wait for the user to respond which will interfere with the update. However, there are solutions to this problem as well such as using the External Session only option which will also use a default session name.

Saturday, February 19, 2011

GTVx verison 10.0.0.5 is Available



Version 10.0.0.5 of GTVx is available.

-----------------------
10.00.00.05 - 02/18/11
-----------------------

- NEW - #6613 - DGCopyToSession method added.

- CHG - #6614 - The Mask drawn around the extract has been moved to after the drawing of the Dynamic Graphics.

- NEW - #6621 - Dynamic Labels for Shape with Hole elements will now use the part with the largest bounding area as the shape to compute the centroid.

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

Friday, February 18, 2011

GTViewer version 10.0.0.7 is Available



GTViewer version 10.0.0.7 is available.

-----------------------
10.00.00.07 - 02/18/11
-----------------------

- FIX - #6604 - A taskbar item appeared when displaying the Edit Attributes dialog.

- CHG - #6615 - The Mask drawn around the extract has been moved to after the drawing of the Dynamic Graphics.

- CHG - #6616 - The Favorite Settings path has been changed to be under a \Graphic Technologies Inc\GTViewer directory in the AppData path.

- CHG - #6617 - The Toolbox Settings path has been changed to be under a \Graphic Technologies Inc\GTViewer directory in the AppData path.

- CHG - #6618 - The Custom Print Label Settings path has been changed to be under a \Graphic Technologies Inc\GTViewer directory in the AppData path.

- FIX - #6619 - Measure/Pan would not release mouse control when a mouse up event occurred off the view.

- NEW - #6620 - Dynamic Labels for Shape with Hole elements will now use the part with the largest bounding area as the shape to compute the centroid.

Monday, February 07, 2011

DistribuTECH 2011



GTI debuted the GTWeb Client for Android at DistribuTECH 2011. The new GTViewer 10 with its Dynamic Graphics capabilities, GTField Pro, and the GTPlot Image Server were also highlights of the show.

Wednesday, February 02, 2011

GTWeb Client for Android

GTI announces GTWeb Client for Android.

GTWeb Server provides a geospatial viewing solution for internet and intranet clients. GTWeb is centrally managed and can support a large number of clients requiring frequent or occasional access to both graphical map data and tabular database records.

GTWeb Server can be accessed using a browser on any platform; however, the GTWeb Client for Android provides a rich experience tailored specifically for the Android device and supports supports GPS location, locate queries, favorites, map panning and zooming, display presets, attribute info review, and linked detail files.

If you would like to be part of the GTWeb Client beta program, please contact GTI.

You can also watch a demo here.









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.