Friday, November 06, 2026

GTViewer Turns 25


I'm a little late getting this post out, but twenty-five years ago this year, GTViewer and Pocket GTViewer were officially announced at GITA in San Diego on March 4th, 2001. GTViewer ran on Windows 2000/XP and Pocket GTViewer ran on Windows CE 2.11/Pocket PC.

The picture below is the HP Jornada 430 that Pocket GTViewer was developed on:

And yes, I still have the James Bond keychain it came with:  


And here it is in the movie (disarming a nuclear warhead, no less):

Pocket GTViewer

Pocket GTViewer traveled a long and winding road. It started with devices that weren't breaking any performance records and were hindered by limited resources, so there were a lot of challenges to overcome when making a usable map viewing application for them. The devices did improve significantly over the years, but they were a far cry from any PC.  However, these limitations required a lot of optimizing and clever design which really paid off when running GTViewer on more powerful desktop machines.

In 2003, when Pocket PC became Windows Mobile, Pocket GTViewer became GTViewer for Windows Mobile. The last version (8.0.0.9) shipped in 2010, but it lived on for over a decade as a .NET control allowing developers to embed map viewing capabilities into their own Windows Mobile applications.


 

 

In 2008, the mobile world shifted. The iPhone opened up to third-party apps and the App Store launched. In 2010, the iPad arrived and finally provided a viable platform for GTViewer. By 2013, GTViewer for iOS replaced GTViewer for Windows Mobile, and GTViewer for Android arrived shortly after. 

Here is a picture showing several iOS and Android devices running GTViewer:

Microsoft replaced Windows Mobile with Windows Phone in 2010 to compete with Apple and Google.  Unfortunately, the early versions were not capable of handling the graphics for our map rendering (we tried), and we abandoned the Windows Phone platform (and so did Microsoft in 2017). We did have a short-lived Windows Phone version of the GTWeb Client that worked pretty well, but GTWeb Server did all of the rendering. 

Here is a sample from the GTI museum of the many devices GTViewer has run on, ranging from Windows CE to the iPad:


And let's not forget the many accessories available for the devices:

In 2016, Data Collection was built directly into GTViewer for iOS/Android, replacing GTField (which ran inside GTViewer on Windows), the standalone GTField Pro for Windows, and GTField for Windows Mobile. GTShare, a redline and data sharing server product, was recycled into the GTViewer Data Server for the Data Collection backend (and its heritage can still be seen in tools today, like GTShareViewer and GTShareAdmin).


GTViewer

GTViewer version 1.1 was the first released version in 2001.  The oldest version of GTViewer I could get running on a modern computer (with no effort) was version 1.1.0.12.  Here it is showing our original demo dataset (which still works with current versions of GTViewer):


The first GTViewer was simple and to the point. It broke away from the CAD-file-based method and prioritized performance and resource management since it also had to run on Windows CE.

Here is a list of the major versions and some of their milestones:
  • GTViewer 1 (2000-2001) was the Beta version with Map Viewing, Redlining, Sessions, Extracts, Locate and Thematic Queries, Print and Print to Scale, Feature Counting, and Raster Backdrops.  Exporters were available for FRAMME and MicroStation-based data.
  • GTViewer 1.1 (2001) was the first released version.  Support added for Smallworld data.
  • GTViewer 2 (2002) supported developing your own applications (with Visual Basic 6 and Visual C++) using a COM interface.  
  • GTViewer 3 (2003) gave us the Style Manager and support for TrueType fonts.  Exporter added for G/Tech.
  • GTViewer 4 (2004) added UI upgrades and non-category Raster.  FME Reader/Writer Plugins were created to read and write GTViewer data, opening up support for ESRI data as well as anything else FME could read.
  • GTViewer 5 (2005) included GTField (configurable data collection) and Data Monitors.
  • GTViewer 7 (2007) provided Feature Tooltips.  The G/Tech Loader had major enhancements.
  • GTViewer 8 (2008) added Toolboxes, Display Toggles, and Dynamic Highlights.
  • GTViewer 9 (2009) provided Dynamic Graphics (extending Dynamic Highlights).
  • GTViewer 10 (2010) supported Rotated Views and view heading orientation for GPS.
  • GTViewer 11 (2011) introduced Add-On Apps and the Drawing Info Dialog.
  • GTViewer 14 (2013) was a mature app, feature-rich, and stable, allowing more attention to be spent on GTViewer for iOS/Android. 
  • GTViewer 15 (2017) was a quality-of-life release that smoothed out some of the rough spots and is the longest-running major version release.
  • GTViewer 20 (2025) began development in 2020 as a major platform upgrade including a new Visual Studio platform, new coordinate transformation libraries, and new raster libraries.  It also had a big slate of new features: UI overhaul, Proximity Search, consolidated Display Filter and Display Manager, native touch support, and unlimited undo/redo for redlines. It took the longest of any version to release and had the shortest life, because it was the stepping stone to GTViewer 25.
In these 14 Major GTViewer versions, there were 410 Minor Version updates.  Version 14 had the most with 51, just beating out version 1.1 with 49. 

Announcing GTViewer 25

GTViewer 25 builds on every platform and library upgrade GTViewer 20 provided and adds a long list of new capabilities:

  • Every dialog refreshed to have a modern Windows look and feel.

  • HiDPI support and improved native touch support.

  • Builds for x86, x64, and native ARM64.

  • Cloud Optimized GeoTIFF (COG) raster backdrop support.

  • Built-in Map Service support for both raster backdrops and address queries: Azure Maps, Google Maps, and OpenStreetMap (the GetImagery Add-On App is no longer needed).

  • The Display Manager now supports custom Category Orders and the ability to group and hide categories from the user.  It also provides more ways to present the information to the users, like Tree Views.

  • The View Sync, Search Session Graphics, Show Google Maps, and Google Maps Directions Add-On Apps are now baked into GTViewer.

  • New GPS features include an upgraded NMEA parser, COM port enumeration, an Accuracy Circle on the map, Constellation support in the Sky Plot, and Signal Strength info.

  • A new tabular data storage method has been added using a SQLite database file instead of the standard data.txt/.idx/.tab files, plus a new Locate Query system which also leverages the SQLite database.  This new data storage method is not a replacement, but it does provide some additional features that were not possible before.

  • The API added support for .NET 8+ External Apps, resizable forms, and form follow mode.  There is also a new wrapper to make the original COM method work with standard C# and VB.NET data types with IntelliSense.

  • The biggest change for GTViewer 25 is under the hood. The graphics engine migrated from GDI to GDI+, delivering a better display with enhanced TrueType text rendering and anti-aliased lines. This is probably the single biggest change in GTViewer's history, and it has shed a lot of our tech debt.

Here is GTViewer 25 showing our demo data, Proximity Search, View Sync, GPS Accuracy Circle, Display Manager's Tree View, and Map Service Backdrop and Address Query (using OpenStreetMap, though Azure Maps and Google Maps are also suppored):



 



Also happening in this 25th year of GTViewer

GTViewer's anniversary year is a busy one across the whole product family:

  • GTWeb 25 releases soon, with a major platform upgrade in the same spirit as GTViewer 20 and a new graphics engine like GTViewer 25.
    • It adds user authentication support for Microsoft Entra ID (Azure AD), GTAuth (GTI's new Authentication Server), and upgrades to its native authentication, which can now support email invites.
    • The browser client was rewritten as a modern, single-page web app and runs in device browsers as well as on the desktop with GPS support.
    • GTWeb for iOS and Android were updated to support the new features, including multiple Map Services per project and picklists for query prompts as well as the new authentication modes.
    • User Notes can now restrict edits to the user or group, and can include photos (like GTSpot).
    • GTWeb Server also gained a new Administrator Console page for managing the server, including monitoring status and activity. It also makes most of the configuration possible via a browser page instead of editing files on the server.
    • GTWeb Server can now update its project data from GTViewer Data Server with the click of a button in the Administrator Console, and the new GTWeb_Deploy app can be used to add or update data on the server.
    • Also, for the first time, GTWeb can run as an Azure App Service (thanks to its new graphics engine).
    • The setup has also been simplified to make installing and updating datasets easier.  Project-level configuration files and auto-discovery make adding and removing projects as simple as moving a directory.




  • GTViewer Data Server 7 was released last October with support for Microsoft Entra ID authentication.  Version 8 will be released soon and includes several new features:

    • GTAuth is supported for user authentication (in addition to the Legacy and Entra ID modes).
    • A new native authentication mode has been added to support email invites, revocation, and forgotten-password retrieval.
    • A new console web page has been added for administrators to view the server configuration, project info, server status, log files, and user activity.  It can also take the place of several tools: GTVDS_Reset, GTVDS_ReturnLicense, and GTVDS_UsageFileViewer.
    • GTViewer Data Server can now run on IIS or as an Azure App Service.
    • Several new features have been added to make setup simpler, including an inferred Master Manifest.
    • The new GTVDS_Deploy app can simplify pushing data to the server.



  • GTAuth is a new server app that implements an OIDC Identity Provider built to mimic Microsoft Entra ID (Azure AD) behavior. It currently works with both GTViewer Data Server and GTWeb Server.  It provides a console web page for user management and email invites.




  • GTVx is also getting a long-overdue refresh with GTViewer's new platforms and graphics engine plus a lot of features that had never been brought over from GTViewer.  An x64 version allows it to work seamlessly with Visual Studio 2022 and 2026 and supports both .NET 4.8 and .NET 8+. A new API wrapper has been added to allow the use of native C# and VB.NET types, as well as IntelliSense.

  • G/Tech Loader no longer needs the Oracle Client installed and has been optimized to run up to 30% faster.


  • GTMetaExp (G/Tech Metadata Explorer) has also been upgraded to run without the Oracle Client and now has better feature style tracing and a slew of usability fixes. 


  • GTNodes is the most exciting news. It's a new product expected to be available for testing soon. It's hard to describe it, but it's basically a generic ETL app with a GTViewer twist.  It provides data visualization, analysis, conversion, and processing.  It includes:
    • Visual Designer app to interactively create your data pipelines.
    • Live Map Viewer to visualize the data (and optionally use GTViewer data as a basemap).
    • MCP server for AI users who want help creating complex pipelines.
    • Scriptable command-line runner to integrate data pipelines into your workflows. 

It currently supports GTViewer data, GTViewer Data Server's data collection records, Oracle Spatial, G/Technology Data, Shapefiles, GeoPackage, CSV, OpenStreetMap, SQLite, PostGIS, and GeoJSON, with more to come.

Its transformers can reproject coordinates, build buffer zones, find features within polygons, filter by attribute expressions, clip, aggregate, find nearest points, trace circuits, join, and much more.

The original goal was to replace as many GTData tools as possible with a single versatile tool, but it's grown into something much more exciting.

The example below uses OpenStreetMap data to serve as a backdrop landbase for GTViewer data. The Live Map Viewer shows how it will look under the GTViewer data and can save it off as a GTViewer Category.



    


Thanks to everyone who has been with us on this journey.

Here's to the next 25.





Wednesday, February 25, 2026

GTViewer Reader/Writer plugins (8.0.0.1) for FME 2025.2 is available for Testing

 

GTViewer Reader/Writer Plugins are now available for FME 2025.2.

This is a significant upgrade and has split the reader and writer into two separate plugins to get around some FME limitations.

The new GTViewer Reader still supports GTG files and session graphics in GTX files.  It does a much better job of using embedded Coordinate Factors and can use the parameters to override those values. 

The new GTViewer Writer now supports both POINT text and Text geometries (Labeler/TextStore).  Support for FME's UTF-8 only text has also been supported (but it does downgrade to LATIN1 for GTViewer).

-----------

08.00.00.01 - 02/23/26
-----------

- NEW - #8869 - Updated for FME 2025.2.

CHG - #8870 - The FME Plugin has been split into a separate reader and writer.  The Writer will still be GTI_GTVIEWER, but the reader is now GTI_GTVIEWER_READER.   You will probably need to replace your existing GTViewer Readers in your workbenches with the new one, but the existing GTViewer Writers should still work.   This change is to overcome a problem with FME where it can't have different reader and writer file types in a single plugin. 

- NEW - #8871 - The default Coordinate Factors for the Reader are no longer required and will use the embedded coordinate factors in a GTG or GTX file if they are available.   The logging will now show the Reader Coordinate Factors and their origin (read from file, overridden with parameters, or default).

- NEW - #8872 - Additional Logging has been added to both the Reader and Writer.

- NEW - #8873 - Text Element support for both Point (legacy) and Text (Labeler/TextStore) geometries.

- NEW - #8874 - Support for FME's UTF-8 text, but it is converted down to Latin1 for GTViewer.

GTech Loader version 10.0.0.79 is Available

 



GTech Loader version 10.0.0.79

This GTech Loader update has a significant upgrade focused on boosting performance and will likely make a noticeable improvement in your export times.  All the main export loops (graphics and tabular) were optimized to improve performance.  You will get this boost by default.  There is also support for specifying the Oracle Fetch Buffer size which can make significant improvement, but you do have to set the buffer size in the GTech Loader configuration file.  Support for providing Oracle Hints in the SQL queries GTech Loader execute has been added (like /*+ NO_PARALLEL */). This feature was added for those who have minimal resources allocated to Oracle coupled with the many-table joins in GTech.

 There were also some Quality-of-Life improvements:

  • More details in the logging, including a new logfile ending in .stats which appends the total tabular and graphic record counts after each run, so you can get a better picture of the export over time and may be able to identify issues the export (such as fewer tabular records exported from the previous time(s)).
  • The Cancel button in the command-line version finally terminates the app and doesn't wait for the current Oracle query to finish.
  • The supported Oracle version is now part of the Title bar text, so you don't have to guess which version you have any more.

Another option was brought back.  You can now choose between using the default dimension elements (reproducing what is in GTech), or using our old style dimensions that were a greatly simplified version of what was in GTech).


-----------
10.00.00.79 - 2/20/26
-----------

- NEW - #8835 - Settings to specify Oracle Hints for Graphics queries and Tabular Queries.

- NEW - #8836 - Setting to specify Oracle Fetch size.

- CHG - #8837 - The Most Recently Used file list was only saved if you did a conversion.  It has been changed to save more frequently.

- FIX - #8838 - If there are Oracle Exceptions in the main Graphics export loop, it will now stop the after 100 exceptions (for the table or feature it is processing)

- NEW - #8839 - The Detail Logfile now shows the total Tabular and Graphics records at the bottom of the file.

- CHG - #8839 - The location of the non-GUI application log file has been moved from the application's directory to %AppData%\Graphic Technologies Inc\GTech_Loader_10.

- NEW - #8840 - The supported Oracle version is now appended to the version number in the title bar.

- CHG - #8841 - Changed the Tabular Count increment from 1000 to 5000 in GUI mode.

- NEW - #8842 - A new .stats file is created with the other logfile and is appended if the file already exists.  This file contains CSV records: Data,Time,ConfigFileName,Property,Value.  The properties are currently Graphic_Rec, Tabular_Recs, and Total_Export_Time.   These statistics can be used to see how your data is growing and if there is an anomaly.

- FIX - #8843 - Cancelling the command-line mode dialog box, did not stop the conversion.  It does now.

-----------
10.00.00.78 - 8/14/25
-----------

- FIX - #8345 - The LIKE operator was not handling all wildcarded cases correctly.

- NEW - #8819 - Support added for using the old Style Dimension elements (instead of GTech ones).

Friday, February 20, 2026

GTViewer 20.0.0.26 is Available

 


This GTViewer 20 update has a few fixes and changes:


-----------------------
20.00.00.26 - 02/19/26
-----------------------

- FIX - #8859 - When using Right Mouse to Edit Properties on Session Graphics, the preview was not properly clearing the previous version.

- FIX - #8860 - The Right-Mouse Edit Properties will now set the mode to Select before editing the feature.

- FIX - #8861 - Dimension Dialog was sending keys back to the view for shortcuts and wouldn't let you type a custom dimension.

- FIX - #8862 - New Session and Open will now set the current mode to the default mode (set in settings).

- FIX - #8863 - To fix an issue in the Drawing Info dialog when changing between different Documents (data sets) or views, the color, weight, style, and fill settings are now associated with the Document they were set in and will change back to the last settings for that view when switching between different views.  It will reload the color table for the document on change.

- FIX - #8864 - In Expressions, invalid tokens or undefined tokens were not correctly display the token causing the problem in the error message.

- FIX - #8865 - The All On and All Off buttons on the In View tab in the Display Manager were not working correctly. 

- FIX - #8866 - The parsing of the GTM file was modified to better handle entries that can have = or | as delimiter or if first delimiter can be different.

- FIX - #8867 - Logging was refactored to process message formatting differently to prevent problems with bad strings.

- CHG - #8868 - The Right Mouse menu will say "Clear GPS Reference" if active, instead of always saying "GPS Reference at Point".


Tuesday, February 17, 2026

GTViewer 20 - Tabbed Views


This is a short video on the new Tabbed Views in GTViewer 20 and how they differ from GTViewer 14/15.


 

Friday, February 13, 2026

GTViewer 20 - Toolbars


This is a short video on the new Toolbars in GTViewer 20 and how they differ from GTViewer 14/15.

 

Thursday, February 12, 2026

GTViewer version 20.0.0.25 is Available

 


This is a big update for GTViewer 20 with a lot of new features/fixes/changes:

  • Reorganization of  Toolbars and Menus (better groups, cleanup of lesser-used commands)
  • New features on the Right-Mouse menu:  Edit Properties (on session graphics), Measure from Point, GPS Reference Point (toggles to replace Set Reference Point and Clear Reference Point).
  • Allows reordering Tabbed Views
  • A new simplified set of Accelerator keys (shortcuts)
  • Support for .NET 8+ External Apps (and new template app)
  • API has several new methods to support automatically External App dialog boxes. Greatly simplifies the sizing of the dialogs, it and lets you set min and max sizes for the resizable ones.
  • API has a couple of new events:  View Changed and View Position Changed. This supports the View Sync app and allows external apps to follow the view.
  • External Apps can now use Follow Mode (to move with GTViewer)
  • Much better support for High DPI displays:  Better scaling, better images, better selection tolerances, etc.
  • This version also has the beginnings of SQLite support for tabular data and queries.  It is not complete, but it's getting there!


-----------------------

20.00.00.25 - 02/11/26
-----------------------

- FIX - #8847 - Fixed a problem with the View title after a File/Reload.  The new description was being appended every time, even when it was already present.

- FIX - #8848 - Closing a Toolbox from the Tools menu would not properly clean up the object and could crash when exiting GTViewer.

- FIX - #8849 - HDPI adjustments so resizable dialogs scale appropriately for different DPIs.

- FIX - #8850 - Magnify Windows was closing when it received focus (as when trying to move the window).

- FIX - #8851 - Selection Tolerance was not scaled to DPI, which made it hard to select features when using high DPI settings.

- FIX - #8852 - Added new method to DialogObject: RunDialogCommand, which can keep an External App at the top left of its View window.

- FIX - #8856 - The Large Toolbar Button Setting has been removed since the automatic HDPI adjustment should do a better job.

- FIX - #8857 - The View Scroll Bar Setting has been removed since scroll bars are no longer supported (they were necessary for simulating touch commands in the past).

- FIX - #8858 - Documentation update for delivery.


-----------------------
20.00.00.24 - 01/26/26
-----------------------

- NEW - #8754 - Added a View/Reset Toolbar Customizations to completely clear all custom settings.  The Reset Toolbar Locations will remain a separate command.

- NEW - #8755 - More keyboard shortcuts have been added to do the 3 Fits (Ctrl F for all, Shift-Ctrl F for session graphics).

- FIX - #8756 - Using the + and - keys (or , and .), the zoom in/out only worked if the window was close to the screensize.  It will now correctly zoom in/out from the view center when the keys are used.

- CHG - #8758 - Reorganized the main toolbar icons to be more similar to GTViewer 15 but have better groupings.

- CHG - #8759 - The Tool/Set Password was moved under the Extract Data pop-up menu.

- CHG - #8759 - Minor changes to Menus to better match reconfigured toolbar groupings.

- CHG - #8760 - On the Right Mouse menu, the Set/Clear Reference point items have been replaced with GPS Reference Point, which will toggle the point on (at mouse point) or off if on.

- NEW - #8761 - If a right mouse click happens on a Session Graphics, it will show an Edit Properties and Select item under its feature info item.  This eliminates the need for the Select option as a mode.

- CHG - #8762 - The Right Mouse menu items have been better organized into Groups.  The first group uses the right-mouse click point.  There is also a View Display group, a Mode group, and a Tools group.

- FIX - #8763 - If the Drawing Info dialog has focus, the Esc key will dismiss it, but not correctly.  Now, the Esc is forwarded to the view.

- NEW - #8765 - The Right Mouse menu now supports the "Measure from Point" command.

- FIX - #8766 - The Start Position for External Apps has been shifted down below the View Tabs.

- NEW - #8767 - The Drawing Info dialog for Measure mode now shows the Key commands instead of the Color/Weight/Style/Fill sections.

- NEW - #8768 - Updated all visual app styles to be current Windows 11 styles.

- NEW - #8769 - Allow View Tabs to be dragged to reorder.

- FIX - #8770 - The Where Am I functionality and ExpStateLoadElementData method did not work correctly since support for the extended GTI_ properties was added to the expressions.

- FIX - #8771 - The HighlightedSaveList API call was not handling the Active Dynamic Graphics list correctly (id = 100), but the other modes were fine.

- FIX - #8773 - The GetDataProperty API was not correctly formatting CoordinateReadoutPrecision, FeatureTooltipMaximumThreshold, and FeatureTooltipMinimumThreshold.

- FIX - #8774 - The XML Export properties for the Coordinate Factors and minor_per_major were not correctly formatting the values and may have lost some of the precision.

- NEW - #8777 - Upgraded C++ to version 17.

- FIX - #8778 – Fixed the Logging message for Hyperlink Details.

- NEW - #8781 - A new simplified set of Accelerator keys has been added, and can be used even when a mode using a non-modal dialog is present.   A=Attr Info, P=Pan, D=Disp Mgr, X = Prox Search, H=Hide Raster, E=Emphasize, S=Draw Select, M=Measure, L=Draw Line, T=Draw Text

- CHG - #8782 - Changed the Overview toolbar icon to look different from Fit.

- NEW - #8783 - The Magnify mode now behaves like the Drawing Info dialog and cancels if mode changes.

- CHG - #8784 - The View Tabs will now use 2 colors:  Blue for selected and Gray for all others.

- FIX - #8785 - Fixed a measure reference line refresh problem seen with Measure From.

- NEW - #8804 - Support for .NET 8 and 9 External Apps.

- CHG - #8805 - After a Draw/Import Data Import, the mode is not set to Attribute Info mode instead of no mode.

- NEW - #8817 - The UpdateAvailableInfo tokens are not case-insensitive, and currentVer and currentVerStr have been added to be more semantically equivalent to the other entries.  ver and verStr are still supported.

- FIX - #8820 - A problem where the toolbar held on to a mouse capture when pressing a button while a non-modal dialog was active.  Only non-mode commands were affected (fit, fit session graphics, refresh)

- NEW - #8821 - If the zoom level after a Fit Session Graphics or Fit Highlighted Elements is less than the default Zoom Level, it is adjusted up to the Default Zoom Level.

- NEW - #8822 - The Fit Highlightedtoolbar button was added.

- NEW - #8825 - Three new DialogObject methods have been added to the API: SetMinSize, SetMaxSize, SetUserControlSize.  These new methods greatly simplify setting the initial dialog size from the user control (using its own Height and Width) as well as being able to set a Min and Max for the sizeable dialog mode.

- FIX - #8826 - Automatically opening the last opened file when it is no longer available was not giving an informative error message.

- FIX - #8827 - The All On and All Off Buttons on the Feature tab in the Display Manager were not working correctly for all View types. 

- FIX - #8828 - Wait Cursor added to the All On and All Off buttons in the Display Manager.

- NEW - #8829 - A new EventMessage (604) is now sent through API to the External App to indicate that there was a view update.

- NEW - #8831 - External App will now use the top left corner of the Active View for its initial position.  It was the top left corner of the view area.

- NEW - #8832 - In the Display Manager, all icons in the Trees and Lists will show a tooltip for the item's status.

- NEW - #8833 - External App dialogs can now optionally follow GTViewer (instead of staying in the same spot even though GTViewer is moved).

- CHG - #8845 - The New Session dialog size has been enlarged.  Wider to show more of the path and taller to show the full 15-item history.

- FIX - #8846 - The Browse button will now use the base path of the path in the textbox.  This was broken at some point due to changes in Windows.