Changelog¶
15.0¶
Release date: 11/08/2026
ThinkGeo 15 is a major release. WPF and WinForms gain the ThinkGeo.Gpu map engine (.NET 8 and later), which draws MapLibre style.json maps with 3D terrain and buildings, tilt, a globe and other display projections, and GPU heatmaps, isolines and particle flow. Every platform gets offline PMTiles, the newer ThinkGeo Cloud vector tiles, asynchronous WFS, OGC API and ArcGIS feature sources, page-layout printing with vector PDF output and a new developer licensing model. Read Upgrading from ThinkGeo 14 at the end of this section before upgrading.
ThinkGeo.Core Namespace:
New Features & Improvements
Offline vector tiles
- Added
VectorPmTilesAsyncLayerandRasterPmTilesAsyncLayerfor PMTiles v3 archives, vector tiles styled with a style.json or raster image tiles, andPmTilesHeaderfor an archive's tile type, zoom range, bounds and center. - Added
VectorMbTilesGeneratorandVectorPmTilesGenerator(GenerateMbTilesAsync,GeneratePmTilesAsync,EstimateTotalTiles) to build vector tile archives from anyFeatureSourceup to zoom 26 or 30, andFeatureSourceVectorTileCutterfor single MVT tiles.
Vector tiles styled with style.json
- Rebuilt style.json support in
MvtTilesAsyncLayer,VectorMbTilesAsyncLayerandVectorPmTilesAsyncLayeron a new engine that follows MapLibre, .NET Framework included: expressions, filters, zoom interpolation, circle layers and fill patterns. - Improved label placement in these layers to match MapLibre: street names follow curved roads, shield numbers stay upright,
icon-text-fitand upright CJK text are supported, and labels at tile edges are no longer cut (unrotated Web Mercator maps). - Improved PDF output of style.json vector tile layers: roads and areas are drawn as vector shapes instead of tile images, also inside a
MapPrinterLayoutAsyncLayer, and straight line labels stay searchable text. - Changed
MvtTilesAsyncLayerto raise itsMaxDataZoomto the maxzoom the source's TileJSON publishes, so sources with tiles past zoom 14 (for example Mapbox at zoom 16) show their full detail.
ThinkGeo Cloud
- Added
ThinkGeoVectorTileAsyncLayerfor the newer ThinkGeo Cloud vector tiles (API key,StyleUrisuch asThinkGeoVectorStyles.Light), withVectorTileCache,LabelDisplayMode,TransparentBackground,WebProxy,TimeoutInSecondsand HTTP events. - Moved
GeocodingCloudClientto the v3 geocoding service andReverseGeocodingCloudClientto the v2 reverse geocoding service, withDataSources,LocationTypes, andDescription,Location,IntersectingRoadsandPriorityon results.
Printing and PDF
- Added page-layout printing to ThinkGeo.Core:
PagePrinterLayoutAsyncLayer,MapPrinterLayoutAsyncLayer,LabelPrinterLayoutAsyncLayer,ImagePrinterLayoutAsyncLayerandLegendPrinterLayoutAsyncLayer, asynchronous and free of GDI+. - Added
ScaleBarPrinterLayoutAsyncLayer,ScaleLinePrinterLayoutAsyncLayer,ScaleTextPrinterLayoutAsyncLayer,DataGridPrinterLayoutAsyncLayerandMagneticDeclinationPrinterLayoutAsyncLayerto the page-layout family (PrinterLayoutAsyncLayer). - Added
PdfGeoCanvasfor vector PDF export without a print driver on Windows, Linux and macOS: shapes stay vector, text stays searchable with its font embedded, and images keep full resolution.SetPageSizesizes the page. - Added
PrinterLayoutDocumentandPrinterLayoutPagefor multi-page layouts:ExportPdfAsyncwrites every page into one PDF, each at its own sheet size, andDrawAsyncdraws a one-page layout on any canvas, such as a printer. - Improved page layouts to print at the physical size you set, so preview, PDF and paper match at any
Dpiand display scaling, and addedMapPrinterLayoutAsyncLayer.DrawingModeandPreviewDrawingMode(vector print, cached preview). - Added
DataGridPrinterLayoutAsyncLayer.RowsPerPageandSplitIntoPages(), so a long attribute table runs onto following pages with its header repeated and its columns aligned from page to page. - Added the ISO page sizes
A0toA5toPrinterPageSize, also for the classicPagePrinterLayer, andPrinterLayoutHelper(ConvertLength,GetPointsPerGeographyUnit) for custom layout layers, replacingPrinterHelper.
Online feature services (WFS, OGC API - Features, ArcGIS Server REST)
- Added
AsyncFeatureSourceandAsyncFeatureLayer(GetFeaturesIntersectingAsync,GetFeaturesNearestToAsyncand more); the WFS, OGC API and ArcGIS REST async layers expose theirs asFeatureSource, and the layer'sSendingHttpRequestsees its requests. - Added
WfsAsyncLayer/WfsAsyncFeatureSourcefor WFS 1.x (GeometryTypefrom the schema,GetCapabilitiesAsync,GetLayersAsync) andOgcApiAsyncLayer/OgcApiAsyncFeatureSourcefor OGC API - Features (CollectionIds,BulkSize,GetFeaturesPageAsync). - Added
Crs(server-side reprojection),GeometryType,WfsV2AsyncFeatureSource, andGetCapabilitiesAsyncandGetLayersAsyncwith proxy and cancellation toWfsV2AsyncLayer;WfsV2FeatureSourceandWfsV2FeatureLayergainedCrsandGeometryType. - Added
ResolveandResolveDepthtoWfsV2AsyncFeatureSourceto have the service resolve references,GetFeaturesPageAsyncreturning aFeaturePage, andReadUntilEmptyPagefor services that send short pages. - Added
WfsV2CompositeAsyncLayerandWfsV2CompositeAsyncFeatureSourcefor WFS 2.0 feature types whose geometry lives in referenced features (for example ATKIS roads), joined asWfsComponentRelationdescribes. - Added
ArcGisServerRestVectorAsyncFeatureSourcewithOutFields,OutSR,MaxAllowableOffset,GeometryPrecisionand paging limits;ArcGisServerRestVectorAsyncLayer.MaxConcurrentRequestsreplacesMaxParallelRequests.
Online raster services
- Added
GoogleMapTilesAsyncLayerfor the Google Maps Platform Map Tiles API (roadmap, satellite, terrain, hybrid), with session handling, attribution, language, region, and traffic and Street View layers. - Added
WmsAsyncLayer.DrawingMarginInPixel(50 by default) so symbols and labels at tile edges are no longer cut, and madeWmsClientandWmtsClientpublic to read a server's layers, styles, formats and coordinate systems. - Added
WebBasedAsyncLayer.HttpMessageHandler,RasterXyzTileAsyncLayer.GetTileContentAsync,AzureMapsRasterAsyncLayer.GetAttributionAsyncwith cancellation andArcGisServerRestLayerImageFormat.Png32; rejected requests now show the server's reason.
Grids, heatmaps and graticules
- Added
GridRasterLayer, which draws aGridSource(AscGridSourcefor ASCII grid files,InMemoryGridSourcefor your own values) as a colored raster through aGridFillStylewith gradient or class color stops. - Added
HeatmapStyle, the same Gaussian heatmap as MapLibre GL, withRadius,RadiusUnit(pixels or ground distance),Weight,WeightColumnName,Intensity,OpacityandColorStops; it replacesHeatStyle. - Added
GraticuleAdornmentLayerfor latitude and longitude lines with edge labels, replacingGraticuleFeatureLayer, andAdornmentLayer.UpdateWhileTransformingso adornments can redraw while the map zooms and rotates.
Raster files and tile caches
- Improved GeoTIFF reading: overviews (pyramids) are used when zoomed out, a strip-organized image is decoded once instead of once per tile, and tiled files with non-square internal tiles no longer draw with a transparent bottom.
- Added
RasterImageCacheto share decoded raster images across layers within a memory budget (MaximumBytes), and zoomed-out JPEG and GIF images are decoded at reduced size; drawing a raster withOpacitybelow 1 is faster. - Added WebP:
SkiaRasterLayerdraws WebP files andGeoImageFormat.Webpsaves images and file tile caches as lossy WebP. Raster layers without a world file now read a GDAL .aux.xml file (WorldFile.TryLoadFromAuxXml). - Improved
LayerBase.GenerateTileCacheAsyncto draw tiles in parallel, with an overload that builds a layer set per worker, and addedTileCache.GetLastUpdatedTimeUtcAsync,TileCache.DrainAsyncandFileTileCache.DeleteTiles.
Projections
- Added
ProjectionConverter.DecimalDegreesToSphericalMercator(always open),TryConvertToExternalProjectionandTryConvertToInternalProjection; converting no longer checks for a missing grid file per feature, and WKT input gets a clear error. - Added
TileMatrixSet.ProjectionandTileMatrixSet.CreateTileMatrixSet(tileSize, boundingBox, projection, ...)to build a tile grid in any projection.
Geometry, Z values and the dateline
- Added Z values:
PointShape.HasZ,ZValues,SetZandSetZValuesonLineShapeandRingShape, Z-aware WKB and WKT (WkbShapeType.PointZand others), Z shapefiles and 3D GDAL sources. SeeThinkGeoSettings.PreserveZunder Upgrading. - Added
DatelineHelper(Split,Merge,IsSplit) to split geometry at the dateline and join it back, in any unit, andLineBaseShape.GetLineOnALineoverloads that measure distances on the ground through aProjection. - Improved dateline handling: with
WrapDateline, a feature layer draws geometry stored past +/-180 whole and without a seam line, andPointShape.TranslateByDegreeandTranslateByOffsetwrap the longitude instead of throwing.
Feature sources and layers
- Added
GeoJsonFeatureSourcefor GeoJSON files or text (FromGeoJson), andFeatureIdColumnonShapeFileFeatureLayer,ShapeFileFeatureSource,TabFeatureLayerandTabFeatureSourceto take stable feature ids from a column. - Added
FeatureSource.GetAllFeatureAttributesandCanGetFeatureAttributesWithoutGeometryto read ids and column values without geometry; the SQL Server, PostgreSQL, GDAL and File Geodatabase sources do it natively. - Added
ConcurrentAccess(Safe,UnsafeClone,UnsafeLock), which says whether a source can be read from several threads or must be copied or locked, replacingLayerBase.ThreadSafe, andLayerBase.Opacity/RasterSource.OpacityreplacingTransparency.
Symbols
- Added SVG point symbols (
PointStyle.CreateStyleFromSvgFile,CreateStyleFromSvg,CreateStyleFromPathData,PointType.PathData) andPathDataParts inPointStyle.PathDataParts; they stay sharp and print as vector. Gradients, CSS and SVG text are not read.
.NET Framework
- Improved .NET Framework packaging: Any CPU projects get the x86 and x64 SQLite engines and load the right one, and the
System.Runtime.CompilerServices.Unsafebinding redirect fixes aTypeInitializationExceptionon the first draw.
Dependencies
- Upgraded SkiaSharp to v4.154.0, and Microsoft.Data.Sqlite and System.Text.Json to v10.0.9, with SQLite 3.53.4 through SQLitePCLRaw v3.0.5.
Bug Fixes
- Fixed
VectorMbTilesAsyncLayerreading MBTiles files without a tile scheme with flipped rows (now TMS),ArgumentOutOfRangeExceptionon concurrent MBTiles reads, and closing aThinkGeoMBTilesLayerleaving the .mbtiles file in use. - Fixed vector tile shapes shifting up to half a pixel between tiles, a
MultiTilerace at tile boundaries,MvtTilesAsyncLayerfailing to open on Blazor WebAssembly, andThinkGeoVectorMapsAsyncLayerdrawing only its background inSingleTile. - Fixed WFS feature types losing their geometry when the service binds GML to a prefix other than "gml"; requests now send prefixed names with
NAMESPACESand leave outPROPERTYNAMEwhen all columns are wanted or it is refused. - Fixed WFS 2.0 schemas that declare the geometry in a base type, use element references, groups or imports, or reuse a type name; a type with several geometries is read through the first, as GeoServer, GDAL and QGIS do.
- Fixed
WfsV2FeatureSourcetaking a timestamp column for the geometry (services such as PDOK), and a WFS exception report, even with HTTP 200, returning no features instead of an error that says what the service said. - Fixed
ArcGisServerRestVectorAsyncLayerreturning geometry simplified for the last drawn view to hit tests and other queries, andOgcApiFeatureSourceignoringWebProxyandTimeoutInSecondson its asynchronous path. - Fixed
WmsServerLayer.MinScaleandMaxScalealways reading 0 (now read from 1.1.1 and 1.3.0 capabilities, withHasMinScaleandHasMaxScale), and a second or canceledWmsAsyncLayer.OpenAsyncthrowing. - Fixed WMTS layers failing to open when the server gives its CRS as a URI, such as
http://www.opengis.net/def/crs/OGC/1.3/CRS84, and cached WMTS capabilities not being found offline after a restart. - Fixed web layers leaking connections (they now dispose the
HttpClientthey create and leave yours alone), opening one service several times when tiles opened it in parallel, and treating a timed-out open as a success. - Fixed raster XYZ layers (Bing Maps and others) printing blank on servers, now capped by
XyzTilesAsyncLayer.MaxConcurrentTileLoads, and overzoomed tiles (RenderBeyondMaxZoom) bypassing the tile cache or throwing. - Fixed GeoTIFF files with unsigned SHORT strip byte counts failing to read, and
SkiaRasterSourcekeeping its decoded image afterClose, which grew memory as layers were opened and closed. - Fixed raster tile layers drawn in another projection (OpenStreetMap, ThinkGeo Cloud raster, XYZ) showing seams or bands, smearing or throwing past the edge of the projected world (Robinson, Mollweide), and azimuthal maps cut to a sliver.
- Fixed a view past a projection's world (a narrow Robinson map) throwing "does not pass our simple validation", an EPSG:4326 raster XYZ layer throwing a PROJ error at zoom 0, and projected tiles missing their last pixel row.
- Fixed PointZ, PointM and multipoint shapefiles drawing nothing, shapefile
GetFeatureIdsreturning ids of records with no shape, andGpxFeatureSourceadding the whole track again each time it was reopened. - Fixed the static
BaseShape.ScaleTo(shape, scale)changing the shape passed in (it now returns a scaled copy), and a feature with no geometry throwing when read through aProjectionConverteror drawn by anAreaStyle. - Fixed concurrent
FeatureSource.OpenandClosecalls corrupting a source, columns added throughInMemoryFeatureLayer.Columnsmissing fromGetColumns(), and in-memory queries missing features afterInternalFeatureschanged. - Fixed MapInfo TAB editing: attribute indexes are rebuilt correctly after a commit, copied features are added, committing through a
ProjectionConverterkeeps the stored coordinates, and zoom-level styles override embedded styling. - Fixed scale-limited layers and zoom-level styles switching at the wrong scale, and features at tile edges being missed, on high-DPI canvases (
ScaleFactorabove 1). - Fixed kriging grid interpolation hanging when asked for more neighbors than the data has, and reverse geocoding throwing
ArgumentNullExceptionwhen no location is found near the point. - Fixed the NOAA weather sources: a duplicate station id no longer leaves the stations layer empty, requests time out after 20 seconds (
TimeoutInSeconds), and both sources work on Blazor WebAssembly. - Fixed
LegendAdornmentLayerstarting a new column because of a rounding difference and its layout when it has no items, andLogoAdornmentLayerthrowing before its image is set. - Fixed labels jumping by a pixel against the map while panning and label fills wobbling inside their halos on bitmap canvases, and an access violation in text drawing when tiles are rendered in parallel.
- Fixed
SkiaGeoCanvasnot finding installed Windows fonts whose display name differs from their family name, such as "Franklin Gothic Medium", and aGeoFontwith bothUnderlineandStrikeoutdrawing only the strikeout. - Fixed
LineStylethrowing for aGeoPenmade from a hatch, texture or gradient brush (the line is now stroked with that brush), andGeoLinearGradientBrush.WrapModebeing ignored, which made some PDF viewers drop gradients. - Fixed line labels disappearing at random while zooming
MultiTileoverlays when they crossed a tile edge, and labels of lines that cross the dateline drawn off-center or not at all (withWrapDatelinethey are labeled once). - Fixed multi-line polygon labels, such as a
TextStylewith aDateFormat, drawn as one line on top of each other, andTextStyle.FittingPolygonInScreenbeing ignored whenLabelAllPolygonPartsis on. - Fixed
ValueStyle,ClassBreakStyle,GradientStyle,IconValueStyleandRegexStylethrowing when a feature's column value is null or missing.
ThinkGeo.Gdal:
- Upgraded ThinkGeo.Gdal to use GDAL v3.12.1 with PROJ v9.7.1, for both Windows and Linux.
- Added
GdalGridto read a band of any GDAL raster (GRIB2, NetCDF, GeoTIFF...) as values or as anInMemoryGridSourceforGridRasterLayer. - Added
GdalRasterSource.WarpProjectionto warp a raster to another projection when it opens andSourceProjectionto override a wrong or missing projection, andGdalRasterLayer.GdalCacheMaxandEcwGdalRasterLayer.EcwCacheMax. - Fixed ThinkGeo.Gdal using another copy of gdal.dll already loaded in the process, which could crash
Gdal.AllRegister, and GDAL data and PROJ files not being found in apps published withdotnet publish -r <rid>. - Fixed ThinkGeo.Gdal replacing PROJ search paths the application had set, and projects whose name contains a hyphen failing to build with CS1514 because a
GdalConfigurationclass was added to them. - Fixed MrSID and VRT mosaic reads failing at the dataset edge, 16-bit or five-band rasters writing past their image, rasters closed mid-read or open at exit crashing the process, and
GdalRasterSourcelocking its world file. - Fixed
GdalProjectionConverterdrawing the world again in the corners of Equal Earth or sinusoidal maps, andGdalFeatureSourcereading NULL integers as 0, losing ids on multi-layer files and formatting values per machine.
ThinkGeo.FileGeoDatabase:
- Upgraded ThinkGeo.FileGeoDatabase to use the latest File Geodatabase API v1.5.5.
- Added
FileGeoDatabaseFeatureSource.GetTableInfos(also on the layer) to list every table with its geometry type without opening it. - Improved speed, most of all on network shares: listing and opening tables reads the geodatabase catalog in one query, and
GetFeatureIdsno longer reads every feature. - Fixed closing one File Geodatabase source breaking other sources on the same geodatabase, a geodatabase left open crashing .NET Framework apps on exit, and rows without a shape being returned by feature reads.
ThinkGeo.Cad:
- Upgraded ThinkGeo.Cad to use the latest ODA SDK v27.9.
- Added the
CadLayerNameColumnName,CadColorColumnName,CadWidthColumnNameandCadStyleKindColumnNamecolumns toCadFeatureSource, so each entity's own layer, color, width and style kind can be used in styles and queries. - Fixed apps using ThinkGeo.Cad crashing or hanging at exit, including while a DWG was still being read.
ThinkGeo.Oracle:
- Upgraded ThinkGeo.Oracle to use Oracle Instant Client v23.26.4 with the GDAL v3.12.1 Oracle plugins.
- Fixed
OracleFeatureLayerreturning only the features crossing the antimeridian for views wider than about 180 degrees; it now queries with Oracle's nativeSDO_FILTER.
ThinkGeo.SqlServer:
- Upgraded ThinkGeo.SqlServer to use Microsoft.Data.SqlClient v6.1.8.
- Fixed connections that failed after the move to Microsoft.Data.SqlClient: a connection string that sets neither
EncryptnorTrustServerCertificatenow getsTrustServerCertificate=True, as before. - Fixed
WhereClause: it accepts a bare condition, applies toGetFeatureIds, and no longer leaves features outside a stale cached extent after the table is edited elsewhere. - Fixed the SRID being missed when the first row has no geometry, geography queries near the poles and the dateline, the spatial index of another geometry column being used, and values formatted differently per machine.
ThinkGeo.PostgreSql:
- Upgraded ThinkGeo.PostgreSql to use Npgsql v8.0.9.
- Improved
PostgreSqlFeatureSourceto read attributes without reading geometry and to format values the same on every machine.
ThinkGeo.NauticalCharts:
- Added
GetFeatureDescriptiontoNauticalChartsFeatureLayerandNauticalChartsFeatureSource, which translates a feature's S-57 codes into plain names and values (for example COLOUR "3;1" to "red, white"). - Added
NauticalChartsFeatureLayer.ExportDefaultStyleFileto export the built-in S-52 style file for editing. - Fixed S-52 symbols, soundings, light sectors and pattern fills drawing too small on high-DPI screens.
ThinkGeo.Printers:
- Improved
PrinterGeoCanvasto print the new page-layout layers of ThinkGeo.Core too, and to honor a comma-separated font list, falling back to Noto Sans and then Segoe UI instead of letting GDI+ substitute a font silently. - Moved
PrinterPageSize,PrinterOrientation,PrinterZoomLevelSetand five other printer types from ThinkGeo.Printers to ThinkGeo.Core; they are forwarded, so code compiled against 14.x keeps running. - Fixed raster and tile layers inside a
MapPrinterLayerprinting too large when the printDpiis raised, and itsBackgroundMaskoutline printing as a hairline while map content ran past the frame. - Fixed layers inside a
MapPrinterLayerchoosing their zoom level for the wrong scale, andScaleLinePrinterLayerdrawing too long, in the print preview on high-DPI displays. - Fixed
PrinterGeoCanvasmeasuring text differently from how it draws it (centered labels drifted, text overflowed its box), andLegendPrinterLayerstarting a new column because of tiny rounding differences.
New Package: ThinkGeo.Gpu (WPF and WinForms, .NET 8 and later)
Engine
- Added the
ThinkGeo.Gpupackage, a GPU map engine for WPF and WinForms on Windows that draws MapLibre style.json documents or styles built in code. - Added
GpuBasemap, set as the newMapView.Basemap: the GPU map is drawn beneath the wholeOverlayscollection, so existing overlays keep drawing on top of it. - Added OpenGL ES 3.0 rendering through ANGLE on Direct3D 11, with a fallback to WARP, Direct3D's software rasterizer, where no GPU is available, including over Remote Desktop. ANGLE ships in
ThinkGeo.Gpu.Native, so nothing has to be installed. - Added
GpuBasemap.AutoRequestHighPerformanceGpu(on by default): on hybrid-GPU laptops where the map starts on the integrated GPU, the next launch is set to use the high-performance GPU. - Improved speed and sharpness: the map draws only when something changes, builds vector tiles off the UI thread with one pipeline per source, fetches the next zoom levels in advance, and compiles the style at the display's scale (
@2xsprites).
Styles (MapStyle)
- Added
MapStyle, the style for the GPU map and the tile renderers: load a MapLibre style.json from a URL, file or string withMapStyle.LoadAsyncornew MapStyle(json), combine several, or build one entirely in code. - Added style.json support for background, fill, line, circle, symbol, raster, fill-extrusion, heatmap and hillshade layers, with vector, raster, raster-dem and GeoJSON sources, sprites, glyph servers, terrain, sky and light.
- Added data-driven paints, filters and label text: expressions such as
get,match,case,step,interpolateandfeature-stateare evaluated per feature and zoom.line-patternandline-gradientare not drawn yet. - Added
MapStyle.AddStyle(optionally keeping only someStyleLayerTypes, such as roads and labels over imagery),AddVectorTiles,AddRasterandAddFeatureLayer, each placed withStyleLayerSlot(Top,Bottom,AboveFills,UnderLabels). - Added
StyleLayer.CreateFill,CreateLine,CreateCircle,CreateSymbol,CreateFillExtrusionandCreateHeatmap, whose paint, filter and label text are C# functions, andMapStyle.AddFillLayer,AddLineLayer,AddSourceandAddLayerwithStyleExpressions. - Added runtime changes:
MapStyle.SetLayerVisibility,SetHeatmapPaintandSetFeatureState/ClearFeatureState(for["feature-state", ...]highlights) show on the next frame, andRemoveLayer,MoveLayeror Add calls are applied as one restyle. - Added
GpuBasemap.SetStyleAsyncto swap the whole style on a running map without blinking: decoded tiles are reused and nothing is downloaded again, and a style that fails to compile or is canceled leaves the map as it was. - Added
MapStyle.Images(StyleImages) to register icons and fill patterns by name: aGeoImage, a classicStyledrawn once (such as aPointStylesymbol), or aGeoHatchBrushas a seamless pattern. - Added
MapStyle.SetBackground,SetSky,SetLight,SetGlyphsandSetSprite; a style without a background leaves the map transparent, andGpuBasemap.IsBackgroundTransparentlets content beneath the map show through. - Added
FeatureLayerTranslator.TranslateandMapStyle.AddFeatureLayerto draw an existingFeatureLayer,WfsV2AsyncLayerorOgcApiAsyncLayeron the GPU map with its zoom levels and styles, so classic layers move over without restyling. - Added translation of area, line, point and text styles plus
ValueStyle,ClassBreakStyle,RegexStyleandCompositeStyle(hatch pens, dashes, text masks, rotated text); anything else is listed inFeatureLayerTranslation.Warnings. - Added
FeatureLayerTranslator.TranslateIntoto translate several classic layers into oneFeatureSourceVectorTileSource, so their data is cut into tiles once and keeps its decoded tiles across style changes. - Added
FillPaint.FromAreaStyle,LinePaint.FromGeoPen,CirclePaint.FromPointStyle,SymbolPaint.FromTextStyle,SymbolLayout.FromTextStyleandDashArray.FromGeoPento reuse classic styles in code-built layers.
Tile sources
- Added vector tile sources:
VectorTileSource(any style.json or TileJSON service),ThinkGeoVectorTileSource,MbTilesVectorTileSourceandPmTilesVectorTileSource, set through the style orGpuBasemap.TileSources. - Added
FeatureSourceVectorTileSource, which cuts vector tiles on the fly from anyFeatureSource(shapefile, database, WFS...), on Web Mercator or a grid of your own, with an optionalVectorTileCache. - Added
XyzRasterTileSource,OpenStreetMapRasterTileSource,ThinkGeoRasterTileSource,WmsRasterTileSource,WmtsRasterTileSource,MbTilesRasterTileSource,PmTilesRasterTileSource,GeoImageRasterTileSourceandClassicRasterTileSource. - Added
MapStyle.AddRasterwithRasterPaintfor opacity, brightness, contrast, saturation, hue, resampling and fade; raster tiles fade in from their parent, and loaded tiles of nearby zoom levels stand in while new ones load. - Added
TileCache,WebProxy,TimeoutInSecondsand aSendingHttpRequestevent (for keys and tokens) toWmsRasterTileSource,WmtsRasterTileSourceandXyzRasterTileSource; WMS asks for tiles at the screen's resolution. - Added
RasterTileSource.ReprojectOntoto put a raster source on another tile grid, such as a national-grid WMTS or WMS under a Web Mercator map, with a built-in warp that needs no GDAL. - Added
VectorTgTilesGeneratorandTgTilesVectorTileSourcefor .tgtiles archives, vector tiles cut on a tile grid of your own such as a national projection; the GPU map draws projected-grid tiles in that projection. - Added
GpuBasemap.RefreshVectorTilesto re-read a vector source, or one extent of it, after its data changed, andGpuBasemap.RenderWorldCopies(on by default) to repeat the world when the view is wider than one world. - Added
GpuBasemap.TileLoadFailed(TileLoadFailedEventArgs): a failed tile is skipped without an exception, the handler can show the classic error tile (ShowOnMap) or its ownImage, and the tile is retried at most every 3 seconds unlessRetryis false.
Terrain, hillshade and 3D buildings
- Added terrain:
MapStyle.SetTerrain(or a style.jsonterrain) drapes the map over elevation from aRasterDemSource(Terrain-RGB or Terrarium tiles), anElevationRasterTileSource, or a DEM file throughGdalElevationSource, with exaggeration. - Added hillshade layers (style.json
hillshade,MapStyle.AddHillshade,HillshadePaint) that shade relief from the style's DEM, whether or not the terrain is lifted. - Added
GpuBasemap.GetElevationAsyncandGetElevationProfileAsyncto read the elevation at a point, or anElevationProfilealong a line, from the map's DEM tiles, even when terrain is off. - Added 3D buildings and other extruded shapes with
fill-extrusionlayers (FillExtrusionStyleLayer), lit byMapStyle.SetLightand lifted at runtime withSetFillExtrusionOffsetfor stacked floors;GpuBasemap.IsExtrusionDrawingEnabledturns them off.
Display projections and globe
- Added
DisplayProjection(FromEpsg,FromProjString,FromName,ToDisplay,FromDisplay) andGpuBasemap.DisplayProjectionto show the map in another projection while API coordinates stay Web Mercator; switching reuses loaded tiles. - Added ten projection families computed on the GPU, including Robinson, Mollweide, Winkel Tripel, Albers, Lambert conformal conic, UTM and polar stereographic; any other projection PROJ can evaluate is drawn through a lookup grid.
- Added
DisplayProjection.Globe, which draws the map, its labels, markers and imagery on a sphere and hands over to the flat map as you zoom in;GpuBasemap.IsGlobeActiveandGlobeHandoverFactorreport where the view stands. - Added
GpuBasemap.AnimateDisplayProjectionAsyncto morph smoothly from one projection to another, for example from Web Mercator to the globe, with cancellation and theDisplayProjectionChangedevent.
Heatmaps, isolines, grids and live data
- Added GPU heatmap layers (style.json
heatmaporStyleLayer.CreateHeatmapwithColorStops) with per-feature weight;MapStyle.SetHeatmapPaintchanges radius, intensity, opacity and colors at runtime without a rebuild. - Added
MapStyle.AddIsolinesto draw contour lines of aGridSource, or of scattered measurements in aPointValueSourceinterpolated on the GPU, styled byIsolineStylewith colored levels, fills between levels and value labels. - Added
GpuBasemap.GetIsolineFieldAsyncto read the interpolated field back as anIsolineFieldSnapshotin the data's units, ready to turn into features withIsoLineLayer.GetIsoFeatures. - Added
MapStyle.AddGridFillto color every cell of aGridSourceon the GPU with aGridFillStyle(color stops, gradient or classes, resampling, opacity); new grid values are a small texture upload. - Added
VectorFieldSourcefor wind and current data, drawn as arrows withMapStyle.AddVectorFieldor as animated particle flow withMapStyle.AddParticleFlow;GdalGridreads one from two bands of a GRIB2 or NetCDF file. - Added
DynamicSourceandMapStyle.AddDynamicfor fast-changing data such as vehicles: heading-oriented markers drawn from one image, lines, areas and labels, set or removed by id in WGS84 from any thread and rebuilt once per frame.
Labels
- Added MapLibre's label placement and collision engine, ported to .NET, across all sources and layers, so a style.json labels as it does in MapLibre, including line labels along curved roads and upright CJK text in vertical writing.
- Added label fading (
GpuBasemap.LabelFadeDurationInMilliseconds, 300 ms by default),IsLabelDrawingEnabledto hide all labels, andLocalFontsDirectoryfor fonts of other scripts; without a glyph server, text uses local fonts and Noto Sans. - Added symbol layer support for variable anchors, rotated text, letter spacing,
icon-text-fitwith stretchable nine-slice sprites, underline and strikethrough (TextDecoration), optional text or icon, and upright line labels.
Rendering without a map control
- Added
GpuTileRendererto render styled tiles (RenderTileAsync) or views (RenderAsync) to PNG with no window, at a scale factor for @2x tiles, for tile servers and batch jobs, on Windows, or on Linux through the system EGL (Mesa). - Added
GpuTileRenderer.SetStyleAsyncto restyle in place andGpuTileRendererBackend.Softwareto force software rendering; the renderer keeps its scene on the GPU between frames, so redrawing a view is many times faster. - Added
CpuTileRenderer(in ThinkGeo.Core) to render the same style to PNG with Skia alone and the same label placement, also shapes only or labels only (LabelDisplayMode); hillshade and heatmap layers are skipped. - Added
MapStyleAsyncLayer(in ThinkGeo.Gpu), a classicAsyncLayerthat draws aMapStyleover feature sources with the GPU renderer, for aLayerOverlay, a tile cache or printing. - Added
MapStyleFeatureAsyncLayer(in ThinkGeo.Core), which draws aMapStyleover your feature sources on anyGeoCanvas, including printers andPdfGeoCanvas, with labels placed as the GPU map places them. - Added
GpuBasemap.IsSceneStableForCapture, which tells when every tile and label of the current view is drawn, so a screenshot or export misses nothing.
ThinkGeo.UI.WinForms Namespace / ThinkGeo.UI.WPF Namespace:
New Features & Improvements
Rotation and tilt
- Added
MapView.RotateToAsyncto animate to a rotation angle the short way round, cancelable (.NET 8 and later), andMapView.IsRotationEnabledto turn off the rotation gestures; a two-finger twist now rotates the map about the fingers. - Added
MapView.TiltAngle(0 to 85 degrees) andTiltToAsyncto tilt a map that has a GPUBasemapinto perspective, animated and cancelable; labels stay upright, andTiltAngleraisesPropertyChangedfor two-way binding (.NET 8 and later). - Added
MapView.IsTiltEnabled(off by default): right-drag or Alt+drag tilts and turns the map, and a left-drag on a tilted map keeps the grabbed ground under the cursor (.NET 8 and later). - Added
MapView.ToWorldCoordinate(screenX, screenY, elevationInMeters)andToScreenCoordinate(worldPoint, elevationInMeters)for points above the ground on a tilted map, such as a roof or an upper floor (.NET 8 and later). - Improved tilted WPF maps: classic tile overlays are draped into the 3D scene,
MarkerOverlayandPopupOverlaystay anchored to their locations, and aFeatureLayerWpfDrawingOverlayis hidden while tilted (.NET 8 and later).
Navigation and zooming
- Added
ExtentInteractiveOverlay.ZoomStepto set how many zoom levels one wheel notch or double-click moves; a fraction such as 0.15 zooms smoothly betweenZoomScaleslevels, and with a GPUBasemapthe wheel defaults to 0.15. - Changed track zoom (the rectangle dragged with Shift held) to zoom to exactly the rectangle drawn instead of snapping 1.4x to 2.8x too deep;
ZoomSnapDirectionno longer has any effect. - Added
MapView.ZoomScalesChangedon WPF and WinForms, raised whenZoomScalesis replaced; the pan-zoom bar andCurrentZoomnow follow the new scales. - Changed
RefreshAsyncto complete quietly instead of throwingTaskCanceledExceptionwhen a newer refresh or navigation supersedes it (navigation calls still throw), and calls on a disposed map or overlay to return without drawing.
Mouse and keyboard events
- Added
MapMouseMove,MapMouseDown,MapMouseUp,MapMouseWheel,MapMouseEnter,MapMouseLeave,MapKeyDownandMapKeyUpon the WPF and WinFormsMapView, raised before any interactive overlay sees the input; an overlay cannot block them. - Added
ScreenX,ScreenY,WorldLocationandMouseButtonorWheelDeltato the map mouse event args, andKeywithIsCtrlKeyPressed,IsShiftKeyPressedandIsAltKeyPressedto the key event args. - Added
InteractiveResult.EventBubblingMode(Bubble,NoBubble), so a custom interactive overlay can stop an input event from reaching the overlays below it; it replacesProcessOtherOverlaysMode.
Custom overlays
- Simplified custom overlays:
Overlay.DrawAsyncCoreis the one method to override,OpenAsyncandCloseAsynctake aCancellationToken, and an overlay can be opened before it is added to a map, for example to read a WMTS service's capabilities. - Added
Overlay.DrawingExceptionMode(the sameDrawingExceptionModeas layers) to control whether an overlay's drawing errors are rethrown; it replacesOverlay.ThrowingExceptionMode. - Improved resilience: one overlay that fails to open no longer stops the map drawing the others and is retried on the next refresh, and WMS, WMTS, XYZ and WFS overlays whose service cannot be reached show the error on their tiles.
- Changed closing an overlay to cancel and wait for its drawing in progress and close the layers it opened;
ThinkGeoMBTilesOverlayandXyzTileOverlayrelease the .mbtiles file, and a closed overlay reopens before its next draw.
New overlays
- Added
ThinkGeoVectorTileOverlayfor the newer ThinkGeo Cloud vector tiles drawn from a MapLibre style, withApiKeyandStyleUri; it replacesThinkGeoCloudVectorMapsOverlay, and its parameterless constructor allows XAML. - Added
LabelDisplayMode,VectorTileCache(one disk cache serves every style),TransparentBackground,WebProxy,TimeoutInSeconds,ShowDebugInfoand the HTTP events toThinkGeoVectorTileOverlay, which places labels once over the whole view. - Added
GoogleMapTilesOverlayfor Google Maps Platform Map Tiles, withMapType,RequestLanguage,Region, traffic and Street View layers, theSessionand attribution; tile caching is blocked, as Google's terms require. - Added
GoogleMapsStaticOverlayfor the Google Maps Static API; it replacesGoogleMapsOverlay. - Added
GridOverlayto draw aGridSource, such as an ASCII grid or values set in code, as a colored raster with aGridFillStyle; it redraws when the source changes, which suits animated grids. - Added
OgcApiFeaturesOverlay.AsyncLayerto show OGC API - Features collections throughOgcApiAsyncLayer, drawn progressively as each page of features arrives.
Tile overlays
- Added
TileOverlay.TileReplacementModeso semi-transparent overlays no longer look opaque during a redraw;Automatic, the default, sees layer opacity and translucent style colors, and custom overlays overrideHasSemiTransparentContentCore. - Added
TileOverlay.CurrentZoomTileCacheCapacityandZoomOutTileCacheCapacityto keep recent tiles in memory, so zooming back out shows the coarser tiles at once; they replaceTileViewInMemoryCache. - Added
TileOverlay.MaxConcurrentTileDrawsto cap how many tiles draw at once, which limits memory and thread-pool use on slow networks or low-memory machines.
Editing, tracking, measuring and printing
- Added Escape to cancel the shape being drawn and right-click to take back its last vertex;
TrackInteractiveOverlay.CancelTrackingandUndoLastVertexdo the same from code. - Added
MeasureInteractiveOverlay.Projectionto measure on the ground instead of on the map's plane, where Spherical Mercator overstates distances away from the equator. - Added
PrinterInteractiveOverlay.PrinterLayoutAsyncLayersto lay out and edit pages built from the new page-layout layers in ThinkGeo.Core.
Drawing and performance
- Improved WPF drawing (
WpfDrawingGeoCanvas,FeatureLayerWpfDrawingOverlay) to try each font in a style's font list, then Noto Sans, Segoe UI and the system font, instead of silently substituting a missing font. - Improved
MarkerOverlaywith thousands of markers to redraw in one layout pass: panning 1,466 markers went from 0.9 s to 0.11 s, and adding them from 3.2 s to 0.85 s. - Improved panning:
FeatureLayerWpfDrawingOverlaymoves the drawn picture instead of rebuilding every feature and label, and a slow map draws only the newest pending move, so it no longer lags behind the cursor. - Improved memory and settling time: XYZ raster overlays hand downloaded tile images straight to the screen, and zooming cancels unneeded tile work sooner and reuses tiles already drawn.
Bug Fixes
- Fixed
MultiTileoverlays drawing their tiles one after another on the UI thread since 13.1.1; parallel tile drawing is restored, so a small shapefile takes milliseconds instead of seconds. - Fixed the UI freezing while a slow or unreachable service opened: classic layers such as
OgcApiFeatureLayernow open on a background thread inLayerOverlay. - Fixed
TileType.SingleTileoverlays replaying every position already left once a drag stopped while the UI thread was busy (since 14.4.2), and drawing at a scale slightly above the map's at fractional DPI such as 150%. - Fixed the background overlay leaving its last row of pixels unpainted at fractional DPI scaling, and a full redraw cut short by navigation, for example after a style change, leaving tiles of the old content on screen.
- Fixed feature overlays shifting by up to a pixel against a raster basemap on every pan, so features and labels shimmered over the basemap, including on rotated maps (a 14.5.0 regression).
- Fixed a
NullReferenceExceptionwhen overlays were added before the map control had its template, for example from a WinForms form constructor, and map mouse events throwing on a map with no width or height. - Fixed pinch and two-finger pan on a rotated map: the map moved along the wrong axis, drifted away from the fingers and jumped when they were lifted.
- Fixed interactive overlays being opened with
MapArgumentsstill null; the map now setsMapArgumentsbeforeOpenAsyncCoreruns. - Fixed "Collection was modified" from
LayerOverlaywhen itsLayerschanged while a slow asynchronous layer, such as WFS, was still drawing. - Fixed
ThinkGeoCloudVectorMapsOverlaydrawing only its background whenTileTypewasSingleTile, andAzureMapsRasterOverlayfailing when navigation canceled an attribution request. - Fixed a tile overlay keeping stale tiles after its
TileMatrixSetchanged, a redraw splitting its tiles between two caches whenTileCachewas replaced, and a cache-only overlay not drawing the debug grid on missing cells. - Fixed
EditInteractiveOverlay.ControlPointSelectingfiring on every press with an emptyTargetPointShapeand ignoringCancel, and the move handle of a self-intersecting polygon appearing off the shape, often off screen. - Fixed the
MeasureInteractiveOverlayruler bearing on a decimal-degree map, which used the angle on the plane instead of the great-circle bearing. - Fixed popups shaking by a pixel against the map while panning on scaled displays, and draggable and resizable adornments throwing
ObjectDisposedExceptionon every render. - Fixed the track and edit overlays being hidden under the printer overlay in a print preview; interactive overlays now stack in a fixed order.
- Fixed
OgcApiFeaturesOverlaydrawing symbols and labels too small on high-DPI screens, andOgcApiFeaturesOverlayandWfsV2Overlaysqueezing their image by up to a pixel at fractional scaling such as 150%. - Fixed a disposed
SimpleMarkerOverlaybeing kept alive by markers held elsewhere. - Fixed an unlicensed map running out of memory and closing while drawing its watermark on a tile stretched by a deep zoom.
ThinkGeo.UI.WinForms specifically
- Added
MapView.Basemap,TiltAngle,TiltToAsync,RotateToAsyncandIsTiltEnabledto the WinFormsMapView(.NET 8 and later); markers and popups do not follow the tilt on WinForms. - Added a public
MapView.CancellationTokenSource, the documented way to cancel a render in progress, which WinForms code could not reach before. - Changed a disposed
MapViewto answer its property getters and ignore setters instead of throwing. - Fixed the hosted map keeping its old size when
SizeChangedwas raised, so a refresh or zoom started fromSizeChangedused the old size or waited on a 0x0 map.
Upgrading from ThinkGeo 14:
Licensing
- ThinkGeo 15 licenses developers, not machines: each developer keeps a license key file that is checked when the project builds, and deployed apps need nothing installed or activated. ThinkGeo 14 licenses do not carry over.
- See the License Guide for ThinkGeo 15 for license keys, the 30-day trial, subscriptions and renewals, the build messages and build servers.
Target frameworks and dependencies
ThinkGeo.UI.WpfandThinkGeo.UI.WinFormstarget .NET Framework 4.6.2 and .NET 8. On .NET 8 they bringThinkGeo.Gpu, which needs exactly the sameThinkGeo.Coreversion (upgrade both together), andThinkGeo.Gpu.Nativewith ANGLE 2.1.1.ThinkGeo.Coreuses SkiaSharp 4.154.0, Microsoft.Data.Sqlite 10.0.9, System.Text.Json 10.0.9 and SQLitePCLRaw 3.0.5 (SQLite 3.53.4, fixing CVE-2025-6965); NetTopologySuite stays at 2.6.0.ThinkGeo.Gdaluses GDAL 3.12.1 with PROJ 9.7.1 on Windows and Linux and targets .NET Framework 4.6.2 and .NET 8 instead of .NET Standard 2.1; apps that reference theGDALpackage directly must move to 3.12.1.ThinkGeo.FileGeoDatabaseuses the File Geodatabase API 1.5.5 (Expat, libxml2 and libxslt security fixes) and targets .NET Framework 4.8 and .NET Standard 2.1, so .NET Framework apps need 4.8 or later.ThinkGeo.Caduses the ODA CAD SDK 27.9,ThinkGeo.OracleOracle Instant Client 23.26.4 with the GDAL 3.12.1 Oracle plugin,ThinkGeo.SqlServerMicrosoft.Data.SqlClient 6.1.8, andThinkGeo.PostgreSqlNpgsql 8.0.9.- The native packages ship an app-local Microsoft Visual C++ runtime 14.51.36247.0 (
ThinkGeo.Dependency.MicrosoftVisualCRunTime140), andThinkGeo.Printersuses System.Drawing.Common 9.0.22.
Removed and renamed APIs
- Removed the ThinkGeo.Core APIs that were obsolete in 14.x, such as
XyzTileAsyncLayer,NativeImageRasterLayer,Layer.RequestDrawing,TileSnappingMode,ZoomLevelSnappingMode,LowerThreshold/UpperThresholdandGdalFeatureSource.ActiveLayer. - Renamed, now compile errors:
CanGetBoundingBoxQuickly→CanGetBoundingBoxWithoutScan,CanGetCountQuickly→CanGetCountWithoutScan,LayerBase.ThreadSafe→ConcurrentAccess,DrawingQuality.Default→Standard,DataGridResizeMode.Default→AutoFit. - ThinkGeo Cloud:
CloudGeocodingOptions.SearchMode,ResultDetail,LocationTypeand the Overture options, and the reverse geocodingSearchAreaandSearchLine, are compile errors; useSearchPointorSearchPointswith a radius. - The
GeoCanvas.DrawTextWithScreenCoordinateandDrawTextWithWorldCoordinateparameters are renamed fromupperLeft*tocenter*, which breaks calls with named arguments; the ThinkGeo 14ThinkGeoLicenseStatusvalues are compile errors. - Removed without an earlier warning:
BuildingAreaStyle,OsmBuildingAreaStyleandBuildingShadowMode(usefill-extrusionlayers on the GPU map),MapView.GetSnappedExtent,IMapArguments.GetSnappedExtentandMapView.CollectedMapArguments. - Removed obsolete map members such as
MapView.RotatedAngle, WPFMapTap, WinFormsActualWidth/ActualHeight(useMapWidth/MapHeight),Overlay.OverlayCanvas,Overlay.PanTo,TileOverlay.ImageFormatandWmtsTiledOverlay(useWmtsOverlay). - Removed the
Markermouse events (MarkerMouseClick,MarkerMouseDown,MarkerMouseUp,MarkerMouseMove),Marker.Draw,MarkerDragMode.CopyWithShiftKey,PolygonTrackMode, and theLockLayerModeandMapClickDragModeenums. - Custom overlays:
Overlay.DrawAsyncCoreis abstract; overrideOpenAsyncCore(CancellationToken)andCloseAsyncCore(CancellationToken)and move one-time setup there, as the token-less overloads,InitializeandInitializeCoreare compile errors. - Now compile errors:
Overlay.ThrowingExceptionMode→DrawingExceptionMode,OgcApiFeaturesOverlay.FeatureLayer→AsyncLayer,ZoomSnapDirection(track zoom no longer snaps), andDefaultofMapPanMode,MapZoomMode,MapMouseWheelModeand similar enums. - WinForms
MapView.MapMouseDownandMapMouseUpnow useMapMouseDownMapViewEventArgsandMapMouseUpMapViewEventArgs,MapKeyDown,MapKeyUpandMapMouseMovework again with new args, andMapTapandZoomLevelSetChangedare compile errors.
Deprecated APIs
- Deprecated:
ThinkGeoVectorMapsAsyncLayer→ThinkGeoVectorTileAsyncLayer,GridFeatureLayer→GridRasterLayer,GraticuleFeatureLayer→GraticuleAdornmentLayer,HeatStyle→HeatmapStyle,GoogleMapsAsyncLayer→GoogleMapsStaticAsyncLayer. - Deprecated:
WfsFeatureLayer→WfsAsyncLayer,OgcApiFeatureLayer→OgcApiAsyncLayer, the staticWfsV2AsyncLayer.GetLayersandGetCapabilities→ their Async versions,LayerBase.Transparency→Opacity, andLayerBase.Background→ aBackgroundLayer. - The classic ThinkGeo.Printers layers (
MapPrinterLayer,PagePrinterLayerand the rest of thePrinterLayerfamily) andPrinterHelperstill print as before but are deprecated and will be removed after v15.4: move to the page-layout layers. - Also deprecated, with no replacement:
UsgsDemFeatureLayerandMapsQueryCloudClient. The new obsolete warnings break builds that treat warnings as errors; each message names the replacement and the release that removes it. - Deprecated:
ThinkGeoCloudVectorMapsOverlay→ThinkGeoVectorTileOverlay(API key),GoogleMapsOverlay→GoogleMapsStaticOverlay,TileViewInMemoryCache→CurrentZoomTileCacheCapacity/ZoomOutTileCacheCapacity,PrinterLayers→PrinterLayoutAsyncLayers. - Deprecated:
InteractiveResult.ProcessOtherOverlaysMode→EventBubblingMode(ProcessOtherOverlaysisBubble), andMapClickMapViewEventArgs.WorldXandWorldY→WorldLocation; the click event args are now read-only.
Behavior changes
ThinkGeoSettings.PreserveZis true by default: 3D shapefiles and GDAL sources return and write 3D data, and editing a Z or M shapefile in 2D mode throws. Set it to false once at startup, before opening any layer, for 14.x behavior.Layer.OpenandAsyncLayer.OpenAsyncnow throw when opening fails, unless the layer'sDrawingExceptionModeisDrawException, which still paints the error on the next draw.- Maps look different: the default
GeoFontis Noto Sans instead of Arial (text can measure and wrap differently),GeoLinearGradientBrushclamps instead of repeating, and style.json layers use the new engine and MapLibre labels. MaxExtents.SphericalMercatoris now exactly the Web Mercator world (0.11 m larger) andThinkGeoMaps,MapBoxMapsandBingMapsequal it.TouchesandTopologicalEqualqueries on a source with aProjectionConverternow return no features: coordinates converted between projections never coincide exactly, so these exact tests could only be decided by rounding.LayerOverlayopens only the layers it is going to draw (open a hidden layer yourself if you need it opened), one failing layer no longer leaves the others unopened, andTileOverlay.DrawnTileis raised on a thread-pool thread.
Recompile
- The ThinkGeo assemblies are version 15.0.0.0: rebuild code compiled against 14.x.
14.5¶
14.5.5¶
Release date: 08/31/2026
ThinkGeo.Core Namespace:
Bug Fixes
- Fixed a performance regression that made
GeoTiffRasterLayernoticeably slower than 14.4.5 when drawing strip-organized GeoTIFF files, because the whole decoded image was copied again for every drawn tile.
ThinkGeo.UI.WinForms Namespace / ThinkGeo.UI.WPF Namespace:
Bug Fixes
- Fixed
WpfRasterLayerrendering scrambled imagery when the source image is tagged with a DPI other than 96 (for example 254 DPI scanned map products): every tile drew an oversized crop of the image clipped to its top-left corner.
14.5.4¶
Release date: 07/31/2026
ThinkGeo.Core Namespace:
New Features & Improvements
- Added
GeoRadialGradientBrushfor filling shapes with a center-to-edge radial gradient, using either a two-color(centerColor, edgeColor)constructor or a collection ofGeoColorStopvalues for multi-stop gradients.
Bug Fixes
- Fixed nested
GroupAsyncLayerthrowing "A task may only be disposed if it is in a completion state" on every redraw when aGroupAsyncLayercontains another asynchronous layer. - Fixed a heap buffer overrun in
GdalProjectionConvertercoordinate transformation that could corrupt memory and crash 32-bit (x86) processes.
ThinkGeo.Printers:
- Fixed
MapPrinterLayerdeadlocking the UI thread when it contains asynchronous layers and the map is refreshed from the UI thread.
14.5.3¶
Release date: 06/28/2026
ThinkGeo.UI.WinForms Namespace / ThinkGeo.UI.WPF Namespace:
Bug Fixes
- Fixed undisposed draw cancellation sources in the map rendering pipeline to prevent handle count growth during frequent refresh and zoom redraws.
14.5.2¶
Release date: 06/02/2026
ThinkGeo.Core Namespace:
New Features & Improvements
- Added tile-cache generation options for controlling maximum concurrency, request pacing, retry count, and retry delay when generating raster tile caches.
Bug Fixes
- Fixed native dependency package metadata so CAD, File Geodatabase, GDAL, and Oracle native runtime files are copied into consuming applications.
- Fixed rotated unscaled Skia image rendering so the full image is drawn instead of being clipped.
- Fixed GDAL SQL query results for shapefiles and aggregate queries so result-set columns and typed values are returned correctly.
ThinkGeo.Printers:
- Fixed
ScaleLinePrinterLayerline and label alignment when rendering with scaled or high-DPI canvases.
ThinkGeo.UI.WinForms Namespace / ThinkGeo.UI.WPF Namespace:
Bug Fixes
- Fixed a map click and manipulation crash that could occur when the WPF visual was no longer connected to a presentation source.
- Fixed
PrinterLayer.SetPositionbeing overwritten while the printer layer was selected. - Fixed
LayerOverlayrendering blank tiles for projected layer data whose bounds fall outside the SDK default world extent. - Fixed
FeatureLayerWpfDrawingOverlaysoLineDashStyleand custom dash patterns are preserved when drawing lines.
14.5.1¶
Release date: 04/12/2026
ThinkGeo.UI.WinForms Namespace / ThinkGeo.UI.WPF Namespace:
- Fixed a bug where WMTS tiles do not align.
14.5.0¶
Release date: 03/31/2026
ThinkGeo.Core Namespace:
New Features & Improvements
- Added
ArcGisServerRestVectorAsyncLayerfor querying and rendering ArcGIS Server REST vector feature services. - Added
WfsV2AsyncLayerfor WFS 2.0 endpoints, with improved query string generation and property-name handling; it replacesWfsV2FeatureLayerfor WFS 2.0. - Added
Feature.MakeGeometryValid()to repair invalid geometries using NetTopologySuite. - Added
Feature.IsGeometryValid(out TopologyValidationError validationError)to validate a geometry and return the validation error when it is invalid. - Added
PolygonSeamRenderingModeto control polygon seam sealing independently of vector anti-aliasing and eliminate thin white seams between adjacent filled polygons with no outline. - Added
RasterXyzTileAsyncLayer.MinZoomOfTheDataandRenderBeyondMinZoom. - Added
DrawingExceptionMode.IgnoreException; layers that throw exceptions can now be ignored - Made
XyzTileOverlay.XyzTileAsyncLayerpublic. - Added
LineStyle.OffsetFromLinefor rendering lines at a parallel offset from the feature geometry. - Added
mapbox://URI support for sprites and glyphs referenced by MapBox style JSON. - Improved MapBox Streets v11 compatibility for
line-pattern,fill-pattern, and advanced text-layout properties. - Standardized number parsing on
CultureInfo.InvariantCultureto fix locale-specific coordinate and style parsing issues. - Upgraded magnetic declination data from IGRF13 to IGRF14.
- Added XML round-trip serialization support for
WebXyzRasterTileAsyncLayer. - Improved
TextStyleformatting support forNumericFormat,DateFormat, andTextFormat. - Added per-character font fallback in
SkiaGeoCanvasand the newCreatingSKTypefaceForCharacterevent for custom font resolution. - Enhanced
ScaleLineAdornmentLayerwithAboveLabelTextStyle,BelowLabelTextStyle,AboveLabelMargin, andBelowLabelMargin, plus better default text sizing. - Added Noto Sans as the default fallback font.
- Updated
FileGeoDatabaseFeatureLayer.GetInternalProj4ProjectionParametersString()to return the table's spatial reference, enabling CRS detection without a.prjfile. - Unified raster resampling under
RasterResamplingModeacross GeoTiff, Skia raster, and GDAL sources. - Added
SkiaRenderingOptionsfor fine-grainedSkiaGeoCanvasrendering configuration. - Reworked SkiaSharp bitmap/image ownership for better thread safety and lower contention in multi-tile rendering.
- Cached
StyleJsonTextStylezoom-level state and icon lookups to remove repeated allocations on unchanged zoom levels. - Released
ThinkGeoVectorMapsAsyncLayerfeature data and style references immediately after each tile draw to reduce peak heap usage during concurrent rendering. - Replaced
MultipolygonShapeconvex hull generation inPositionStylewith Andrew's monotone chain algorithm for faster, correct results.
Bug Fixes
- Fixed FileGDB multipart polygon conversion so outer and inner rings are classified correctly and emitted as
PolygonorMultiPolygonWKB as appropriate. - Fixed FileGDB polygon spatial queries throwing
TopologyExceptionfrom NTS. - Fixed a projected
MvtTilesAsyncLayerrendering regression introduced in14.4.x. - Fixed MVT tile seam artifacts when the overlay is in
SingleTilemode. - Fixed incorrect label offsets when labels are placed on rotated lines.
- Fixed the text-wrapping algorithm for CJK text so it no longer wraps mid-character.
- Fixed text wrapping so it accounts for canvas
ScaleFactor. - Fixed StyleJson icon/label conflict detection so the icon bounding box is included in the candidate region.
- Fixed StyleJson icon placement so it scales correctly with canvas
ScaleFactor. - Fixed thin white seams between adjacent filled polygons when outlines are disabled.
- Fixed
WmtsAsyncLayerfailures with servers that use decimal-degreeTileMatrixdefinitions. - Fixed
ProjectionConverternot handling the+Rproj4 parameter. - Fixed
PointShape.GreatCircle()returningNaNcoordinates for antipodal inputs. - Fixed
OgcApiFeatureSourceentering an infinite request loop when the server is offline. - Fixed an exception when zooming out past tiles with
RenderBeyondMaxZoomenabled. - Fixed
RenderBeyondMaxZoomnot working for the decimal-degrees map unit. - Fixed intermittent font rendering corruption where characters could mix between glyphs.
- Fixed
SkiaRasterSourcefailing to load PNG images from memory streams. - Fixed a
CartographicTilesresampling regression introduced in14.4.x. - Fixed an
AsyncLockerthreading conflict. - Fixed a
DrawGlyphthread-safety issue. - Fixed labels appearing below the line centerline instead of centered on it.
- Fixed
TextStyle.TextPlacementleft and right being swapped for point features. - Fixed
GeoJsonFeatureSourcefailing to parse features with special characters in property values. - Fixed images appearing blurry when pixel-stretched in a
14.4.xregression. - Fixed SkiaSharp resource leaks and
GeoImagelifecycle issues under concurrent tile drawing. - Fixed some meter-based projections failing to compute intersections against the SphericalMercator max extent.
- Fixed
GeoCanvas.Clear()not taking effect in certain rendering scenarios. - Fixed adornments rendering incorrectly on canvases with
ScaleFactor > 1. - Updated the NOAA weather alerts feed URL to
https://api.weather.gov/alerts/active.atom.
ThinkGeo.Gdal:
- Updated GDAL to
3.11.3. - Added ECW and JPEG2000 format support on Linux.
ThinkGeo.FileGeoDatabase:
- Updated the FileGDB API dependency to
1.5.3, enabling retrieval of a table's spatial reference (SRID). - Fixed multipart polygon and multi-ring conversion so clockwise outer rings and counter-clockwise inner rings are identified correctly, and features with multiple outer rings are emitted as valid WKB
MultiPolygon.
ThinkGeo.SqlServer:
- Upgraded from
System.Data.SqlClienttoMicrosoft.Data.SqlClient.
ThinkGeo.UI.WinForms Namespace / ThinkGeo.UI.WPF Namespace:
New Features & Improvements
- Added
GeoLinearGradientBrushsupport toWpfGeoCanvas. - Switched
AdornmentOverlayrendering toWpfDrawingGeoCanvasfor the same hardware-accelerated path used by other WPF overlays and more consistent high-DPI rendering. - Added draggable and resizable adornments so
AdornmentLayeritems can be repositioned and resized at runtime. - Added
MouseCoordinateMapTool.Projectionfor displaying coordinates in a custom CRS. - Disabled the ThinkGeo branding logo by default.
- Added
TileOverlay.RenderingOptionsto expose per-overlaySkiaRenderingOptions. - Moved
GeoImageandGeoCanvaslifecycle ownership toTileViewto reduce contention between overlays and individual tile renders. - Added configurable click and double-click dispatch behavior so single-click events can either wait for a possible double-click or fire immediately.
Bug Fixes
- Fixed the map being unable to zoom in past scale
1. - Fixed map flicker when switching between multi-tile and single-tile mode.
- Fixed seams on transparent background tiles through deterministic seam compensation.
- Fixed
CurrentExtentChangingandCurrentExtentChangednot being raised on resize when usingPreserveScaleAndCenter. - Fixed
TrackEndedTrackInteractiveOverlayEventArgsreturning duplicate end vertices. - Fixed
FeatureLayerWpfDrawingOverlaycrashing when the extent is null or a layer has not been opened yet. - Fixed
PreloadDataMultiTilecrashing when the prefill tile set is empty. - Fixed images and glyphs not rotating correctly in
WpfDrawingGeoCanvas. - Fixed
PanZoomBarusing a deprecated internal pan method. - Fixed crashes when rendering an error tile in tiled mode.
- Fixed
AccessViolationExceptionwhen converting aGeoImagetoWriteableBitmapby adding a fallback conversion path. - Fixed failed tiles being permanently marked as failed after a later successful reload.
- Fixed
FeatureSourceMarkerOverlaymarker mouse events not being wired correctly and deprecatedOnMarkerMouseDown,OnMarkerMouseUp, andOnMarkerMouseMove. - Obsoleted
SelectedEditsInProcessLayer,EditsInProcessLayerinEditInteractiveOverlay, andTrackShapesInProcessLayerinTrackInteractiveOverlay. - Fixed
TrackInteractiveOverlaythrowingNullReferenceExceptionwhenGetCurrentFeatureis called before any vertex has been added.
ThinkGeo.UI.WinForms specifically
- Added configurable mouse-over tooltips so
MapViewcan show feature information when the cursor hovers over a feature. - Improved drag-and-drop event bridging so handler-set
DragEventArgs.Effectis respected, allIDataObjectformats are supported, and preview events are routed consistently. - Fixed the map not gaining keyboard focus by default when the cursor enters the control.
14.4¶
14.4.5¶
Release date: 02/26/2026
ThinkGeo.Core Namespace:
- Fixed a
TextStyle.TextPlacementregression (introduced in v14.4.0 and reported against v14.4.4) where left/right placements were mirrored. - Fixed a zoom-level request filtering regression where online layers could still send requests outside the configured style zoom range, causing unnecessary network traffic.
ThinkGeo.UI.WPF Namespace / ThinkGeo.UI.WinForms Namespace:
- Fixed an
ExtentInteractiveOverlayinteraction issue where a single left mouse click/mouse down could incorrectly zoom the map to scale0. - Fixed a
TrackInteractiveOverlayissue where finishing a drawn shape with a double-click could return extra trailing duplicate vertices inTrackEndedTrackInteractiveOverlayEventArgs.TrackShape.
14.4.4¶
Release date: 01/28/2026
ThinkGeo.Core Namespace:
- Fixed an issue where MaskMargin is not correct
ThinkGeo.UI.WPF Namespace / ThinkGeo.UI.WinForms Namespace:
- Fixed an issue where an AccessViolationException could be thrown, causing the application to crash in certain edge cases.
- Fixed an issue where the map’s ZoomScale was reset after setting the map unit.
- Fixed an issue where tiles with internal errors were not reset unless zooming out of the current extent.
14.4.3¶
Release date: 01/11/2026
ThinkGeo.Core Namespace:
- Fixed an issue where the internal exceptions in OgcApiFeatureLayer/OgcApiFeatureOverlay are not thrown.
- Improved HatchStyle:
Fixed a bug (introduced in v14.4.1) where HatchStyle cannot have transparent backgroundFixed a bug (introduced in v14.4.1) where some of the items in GeoHatchStyle enumeration are not compatible with the ones in v14.4.0
ThinkGeo.UI.WinForms Namespace:
- Added HistoryExtents/HistoryExtentsCurrentIndex to the MapView
14.4.2¶
Release date: 11/03/2025
ThinkGeo.Core Namespace:
- XyzLruCache: Handles Capacity == 0 gracefully (effectively disables caching without errors).
- Improved HatchStyle:
Fixed a bug (introduced in v14.4.1) where HatchStyle were not displayedRendering now respects the ScaleFactor, which make it work better on a High-Res screenAdded protected virtual method GeoHatchBrush.GetHatchPatternSvgCore to allow custom hatch patterns
ThinkGeo.UI.WPF Namespace / ThinkGeo.UI.WinForms Namespace:
- Fixed the issue where Winform MapView could not receive focus when mapView.MapFocusMode == MapFocusMode.MouseEnterFocused
- Fixed the issue where in some cases markers don't follow the map on the first pan operation.
14.4.1¶
Release date: 10/20/2025
ThinkGeo.Core Namespace:
- Fixed an issue where creating a new table in a File GeoDatabase could fail.
- Fixed an issue where the Projection property doesn't work in WmsAsyncLayer.
- Added support for local sprite files in StyleJson.
- Added HatchBrush support in WpfDrawingCanvas and unified HatchBrush behavior between WpfDrawingCanvas and SkiaCanvas.
- Changed ProjectionConverter to suppress inner exceptions by default.
- Improved performance by adding caching to Projection and WmtsAsyncLayer.
ThinkGeo.UI.WPF Namespace / ThinkGeo.UI.WinForms Namespace:
- Added support for polygon inner rings in WpfDrawingGeoCanvas.
- Fixed an issue where the styles in EditInteractiveOverlay and TrackInteractiveOverlay could not be customized during initialization.
14.4.0¶
Release date: 10/10/2025
ThinkGeo.Core Namespace:
-
MvtTilesAsyncLayer greatly improved:
Supported ProjectionSupported Vector Tile CachingEnhanced robustness and reliability
-
WfsV2FeatureLayer improvements:
Added support for MultiPolygon geometriesImproved URI flexibility and automatic axis-order detection based on projectionFixed a bug preventing WFS from working correctly when added to a LayerOverlay.Enhanced robustness and reliability.
-
Upgraded ThinkGeo.Cad to use the latest ODA SDK v26.7.
- Fixed thread-safety issues in
GdalProjectionConverter.Convert(). - Created
SkiaGeoCanvas.CreatingSKTypefacesForTextevent to give user an option to customize the loading SKTypeface. - Fixed incorrect anchoring behavior in ScaleLineAdornmentLayer.
- Fixed exception when both
WhereClauseandMaxRecordsToDrawwere set in PostgresFeatureSource.
ThinkGeo.UI.WPF Namespace / ThinkGeo.UI.WinForms Namespace:
- Fixed the issue where the controls in PrinterInteractiveOverlay are not selectable or draggable.
- Fixed the issue where the Mouse hover would steal the focus from other controls.
-
Added the following drag-and-drop events in ThinkGeo.UI.WinForms
DragDropDragEnterDragLeaveDragOver
-
Fixed an issue where Graticule could not be added to
LayerWpfDrawingOverlay. - Created
TileOverlay.CreatingSKTypefacesForTextevent to give user the option to customize the loaded SKTypeface.
14.3¶
14.3.2¶
Release date: 7/28/2025
ThinkGeo.Core Namespace:
- Fixed an issue where MapPrinterLayer.Projection wasn’t respected in MagneticDeclinationPrinterLayer.
- Fixed an issue where certain MultiPolygon geometries were not supported in WFS 2.
- Enhanced WfsV2Layer to accept more flexible URIs (e.g. URIs containing ?SERVICE=WFS&VERSION=2.0.0).
- Enhanced MvtAsyncLayer to support local MBTiles referenced in the style JSON.
- Enhanced SkiaRasterLayer to lazily load only the needed tiles when the image is backed by a CPU‑resident pixel buffer.
- Added a cache‑generation API: LayerBase.GenerateTileCacheAsync().
ThinkGeo.UI.WPF Namespace / ThinkGeo.UI.WinForms Namespace:
- Improved and streamlined mouse events (DoubleClick / Click / Drag).
- Enhanced and streamlined marker rendering and behavior.
- Delayed initialization of EditOverlay and TrackOverlay to reduce startup overhead.
14.3.1¶
Release date: 6/3/2025
ThinkGeo.Core Namespace:
- Fixed an issue where BulkSize was not applied in some cases when using OgcApiFeaturesSource.GetRequestUrlForFeatures.
- Fixed an issue where WMS layer sent larger than necessary requests when the scale factor exceeded 100%.
- Removed some restrictions on column names in feature sources (e.g., "[" is now a valid character in shapefile column names).
- Deprecated BingMapsAsyncLayer; added support for AzureMapsRasterAsyncLayer.
ThinkGeo.UI.WPF Namespace / ThinkGeo.UI.WinForms Namespace:
- Added TileOverlay.TileViewInMemoryCache, allowing the user to control the memory-cached TileViews.
- Added AzureMapsRasterOverlay.
- Fixed an issue where custom markers were not positioned correctly.
- Enhanced MapResizeMode behavior when maximizing the map; the default is now PreserveScaleAndCenter.
- Enhanced zoom-out animations by preloading tiles from higher zoom levels using TileViewInMemoryCache.
- Enhanced rendering of Overlay.Attributions on the map.
- Enhanced MapTool behavior to prevent unnecessary refreshes.
14.3.0¶
Release date: 5/7/2025
ThinkGeo.Core Namespace:
- Streamlined the architecture of all XYZ-based layers and improved performance.
- Added RenderBeyondZoom and ProjectionConverter support to all RasterXyzTileAsyncLayer types (including WmtsAsyncLayer, RasterMbTilesAsyncLayer, etc.).
- Added a CacheGenerator API on RasterXyzTileAsyncLayer to create tile caches for a specified extent and zoom range.
- Added support for MvtTilesAsyncLayer and enhanced MbVectorTilesLayer (now inheriting from VectorXyzTileAsyncLayer).
- Added ProjectionConverter support to WmsAsyncLayer.
- Exception Handling: Streamlined the error-handling workflow across all layers.
- Updated to integrate the latest CAD package (ODA SDK 25.12).
- Obsolete the following Nuget Packages and move the corresponding classes to ThinkGeo.Gdal
ThinkGeo.UnmanagedProjThinkGeo.MrSidThinkGeo.UnmanagedGeoTiffThinkGeo.EcwThinkGeo.Jpeg2000ThinkGeo.PersonalGeoDatabaseThinkGeo.GeoPdfThinkGeo.Kml
ThinkGeo.UI.WPF Namespace / ThinkGeo.UI.WinForms Namespace:
- MapView Improvement: Introduced MapAnimationSettings (Duration, MapAnimationType – DrawAfterAnimation or DrawWithAnimation – and Easing), greatly enhancing zoom animations.
- MapView Improvement: Removed forced zoomlevel snapping so the map can stop at any arbitrary scale by default.
- MapView Improvement: Improved map resize modes, especially when the map is rotated.
- MapView Improvement: Greatly enhanced touch-screen support.
- MapView Improvement: Improved map cancellation: added MapView.CancellationTokenSource, allowing users to cancel any ongoing rendering.
- MapView Improvement: Some APIs (e.g. MapView.ZoomToAsync()) now throw TaskCanceledException when cancelled; see the API documentation for details.
- MapView Improvement: Removed the global stretch overlay and now stretch each overlay individually, eliminating potential unresponsiveness and flickering.
- MapView Improvement: Replaced MapView.ZoomLevelSet with the lightweight MapView.ZoomScales.
- MapView Improvement: Enabled setting CurrentExtent by specifying CurrentScale and CenterPoint.
- MapView Improvement: Made several properties bindable to improve XAML support.
- MapView Improvement: MapTools: Enhanced the ScaleLine map tool to allow setting a projection for more precise calculations.
- Overlay Improvements: Introduced WpfDrawingOverlay to draw directly on the canvas (instead of via an image), and supported dynamic labeling through it.
- Overlay Improvements: Made Overlay a subclass of Canvas and obsoleted Overlay.OverlayCanvas, to improve XAML support.
- Overlay Improvements: Fixed an issue where tiles containing exception details were being cached; improved exception-mode handling for both overlays and layers.
- Overlay Improvements: Added a CacheGenerator API on LayerOverlay to create cached tiles for a specified extent and zoom range.
- Overlay Improvements: Added TileOverlay.TileMatrixSet to allow a TileOverlay to easily set its tile matrix set.
- General: Obsoleted several “zombie” APIs to reduce user confusion.
- General: Optimized memory usage and fixed a potential issue that caused high peak memory usage.
- General: Fixed a memory leak when repeatedly refreshing the map with certain overlays.
- General: Introduced WpfRasterLayer, which uses native WPF classes for higher-performance image rendering.
- General: Breaking change: namespace consolidation—all classes now reside in the ThinkGeo.UI.Desktop namespace.
14.2¶
Release date: 10/10/2024
ThinkGeo.Core Namespace:
- Upgraded ThinkGeo.Gdal to use Gdal v3.9.1 for both Windows and Linux.
- Added the Weight property to GridCell in GridFeatureLayer.
- Improved the performance of loading and saving tiles from/to the cache.
- Fixed a performance issue where the license was being over-checked.
- Enhanced support for sparse matrices (where some cells are null) in InMemoryGridFeatureSource
- Made WMTSLayer auto-detect the server type (Restful or KVP).
- Fixed an issue where the WMTSLayer was a couple of meters off at lower zoom levels.
- Resolved a conversion issue between Srid and ProjString in the managed projection converter.
ThinkGeo.UI.WPF Namespace / ThinkGeo.UI.WinForms Namespace:
- Improved the exception handling. Resolved an issue where some methods did not respect DrawExceptionMode, and added the Overlay.ThrowingException event to give users more control.
- Enhanced map animations, fixing a bug where the animation result did not match the expected outcome when the second zoom action started before the first one finished.
- Fixed an issue where the track zoom rectangle would not disappear in certain scenarios.
14.1¶
Release date: 6/6/2024
ThinkGeo.Core Namespace:
- Added MbTilesLayer that renders the MBTiles v1.3 dataset using the standard StyleJson.
- Added MbTilesRasterLayer that renders the standard MBRasterLayer
14.0¶
Release date: 5/1/2024
ThinkGeo.Core Namespace:
- Added OGC Features API Support
- Added WFS V2 Support
13.3¶
Release date: 4/16/2024
ThinkGeo.Core Namespace:
- Fixed the issue that NoaaWeatherStationFeatureLayer not working
- Fixed the issue that NoaaWeatherWarningsFeatureLayer not working
- Fixed the issue that map border discrepancies when isGrayScale is set to true on MapPrinterLayer.
- Fixed the alignment issues in LabelPrinterLayer when printing to PDF.
- Enhanced LayerAsync by adding CancellationToken to OpenAsync() and CloseAsync() methods in AsyncLayer.
- Enhanced RasterTileCache by support saving and retrieving tiles asynchronously.
- Enhanced Docker compatibility by removing C++ redistributable installation from ThinkGeo.Core.
- Enhanced Performance of ColorTransformation for large image layers. Added KML support through GDAL on Linux platforms.
ThinkGeo.UI.WPF Namespace / ThinkGeo.UI.WinForms Namespace:
- Enhanced Multi-touch functionality in WPF applications.
- Enhanced: removed gaps when displying points with offsets in multi-tile mode
- Added MapViewStretchMode to better control the responsiveness and visual clarity.
13.2¶
Release date: 11/29/2023
ThinkGeo.Core Namespace:
-
Added the following classes with asynchronous data fetching to ThinkGeo.Core.Async namespace:
ArcGisServerRestLayerBingMapsLayerCloudMapClientGoogleMapsLayerHereMapsRasterTileLayerLayerAsyncMapBoxStaticTilesLayerOpenStreetMapLayerRasterLayerAsyncRasterSourceAsyncThinkGeoCloudRasterMapsLayerThinkGeoCloudVectorMapsLayerWebBasedLayerWmsRasterLayerWmsRasterSourceWmtsLayerXYZTileLayer
-
Upgraded the ThinkGeo.CAD dependencies to the latest version as of November 2023 (ODA 24.9).
- Fixed the issue where a layer is not showed up correctly when setting a custom style to the DefaultStyle instead of adding it to the CustomStyles collection
- Enhanced
WmsLayerfunctionality with new helper methods and better server compatibility.
ThinkGeo.UI.WPF Namespace / ThinkGeo.UI.WinForms Namespace:
- Integrated async overloads for most methods to enhance UI responsiveness, and updated HowDoI samples to reflect these changes.
- Upgrade all the WebBasedOverlays to internally use the new WebBasedLayers with asynchronous data fetching.
- Improved exception management using
Overlay.DrawingExceptionModeproperty andOverlay.ThrowingExceptionevent. - Addressed the issue of incorrect feature wrapping with
wrapDateLineenabled. - Fixed the issue where map doesn't resize smoothly when
SnappingModeis set tonull. - Enhanced TrackZoomIn animation accuracy for maps with a non-zero rotation angle.
13.1¶
Release date: 7/7/2023
ThinkGeo.Core Namespace:
- Optimized performance for layers at lower zoomlevels.
- Enhanced the performance of NoaaWeatherStationsLayer and NoaaWeatherWarningsLayer.
- Implemented AsyncLocker, replacing lock() internally wherever possible.
- Added support for V2 and X2 to ThinkGeoCloudRasterMapsLayer. Note: V2 represents the 2nd version, and X2 signifies High DPI.
- Added PositionStyle.AllowLabelNudging to permit label nudging.
- Introduced FeatureSource to GridDefinition to leverage featureSource's spatial index during InterpolationModel calculations.
- Fixed an issue causing GeoTiff to produce a vertical white line at certain zoom levels.
- Fixed an issue where some WKTs failed to function properly with French system culture.
ThinkGeo.UI.WPF Namespace / ThinkGeo.UI.WinForms Namespace:
- Resolved an issue where WrapDateLine didn't function correctly when mapView.ZoomLevelSnappingMode was set to None.
- Improved the performance of TileType.PreloadDataMultiTile mode, and fixed a problem where TileType.PreloadDataMultiTile didn't work properly under some conditions.
- Rectified an issue where LayerTileView didn't update when Layers of LayerOverlay changed.
- Set the default Map Unit to meter to avoid the WPF Design Time error.
- Fixed an issue with improper functioning of Resize|Drag on PrinterLayer.
- Corrected a problem where the legend items on printed PDF were larger than those on the print preview.
- Solved an issue causing ThinkGeoCloud Overlay Cache to not work or appear blurry if the screen is higher than standard DPI.
- Added MeasureInteractiveOverlay.
13.0¶
Release date: 11/29/2022
ThinkGeo.Core Namespace:
- Improved the accuracy and performance of isolines.
- Improved FileGeoDatabase performance and added more APIs using the latest FileGDB APIs(FileGDB_API_1.5.2) from ESRI.(Windows only)
- Improved multiple columns labeling through TextStyle.TextContent
- improved MagneticDeclinationAdornmentLayer by updating to the latest Geomagnetic Reference IGRF13 from: https://www.ngdc.noaa.gov/IAGA/vmod/
- Improved the heatmap styling by updating its color palette.
- Supported the GeoTiff files with separate planes and multiple strips
- Supported the MrSid files with more than four bands(Windows only)
- Supported HereMapsRasterTileLayer
- Supported deleting/adding/editing columns for TabFiles.
- Supported GeoPdf through NuGet package ThinkGeo.GeoPdf(Windows only)
- Supported KML through NuGet packages ThinkGeo.Kml(Windows only)
- Supported the latest CAD format by referencing the latest ODA dependencies from (https://www.opendesign.com/). (up to 2022)(Windows only)
- Upgraded all the dependencies to the latest (up to 11/2022) and streamline the 3rd party dependency reference.
- Updated the proj string of the SRIDs to the latest based on https://epsg.io/
- Implemented an API to check if a license is activated: ThinkGeoProductLicense.GetCoreLicenseStatus()
- Fixed the issue where a null numeric field in a shapefile returns bad results
- Fixed the issue where internal exceptions are thrown when cached tiles are read/updated simultaneously.
- Fixed the issue where the labeling of curved lines is not at the center in some scenarios.
- Fixed the issue where some labels are cut in busy places like New York City in ThinkGeoCloudRasterLayer.
ThinkGeo.UI.WPF Namespace / ThinkGeo.UI.WinForms Namespace:
- Support HereMapsRasterTileOverlay
- Support MapView.GetSnapShot()
- Support WrapDateLine for MarkerOverlay and XYZOverlay.
- Improved the map responsiveness by reaffirming using async for all the IO-intensive APIs.
- Fixed the issue where TileOverlay.Drawn event is raised before all the tiles are rendered.
- Fixed the issue where Tileoverlay is not displayed when the current scale is less than 3.
- Fixed the issue where the map turns blank when calling map.refresh() right after resizing the map.
- Fixed the issue where markers do not work if they are initialized with Marker.Content.
- Fixed the issue where Printing Raster Images are Offset and scaled improperly
- Fixed the issue where the alignment/text wrap does not work in the legend
- Fixed the issue where Map Flickering when calling CenterAt/ZoomTo
- Fixed the issue where mouse zooming is not centering at the mouse when the map's rotation angle is not 0.
- Fixed the issue where the legend's location/layout and feature size are not precise in some scenarios while printing
12.3¶
Release date: 11/6/2020
ThinkGeo.Core Namespace:
- Created ThinkGeo.UI.XamarinForms edition.
- Created MapBox layer and support MapBox static tile.
- Open web browser instead of Product Center when no license was found.
- Minimum supported .NET Framework version now has been updated to 4.6.2 from 4.6.1.
- Add an API to the WorldFile class to allow it to save a world file to disk.
- Added the API to convert feature collection to GeoJSON.
- Added TopologyValidator class for validating shapes.
- Added XYZ layer as the base class of all the XYZ-based layers.
- Greatly improved the performance of web-based layers, such as bingmaps layer, googlemaps layer and thinkgeo cloud layers.
- Request for X2 Google images if needed in Google Layer.
- Fixed the issue where application cannot work on both X86 and X64 systems when compiling with .NET Framework under AnyCPU, by upgrading the drawing engine to SkiaSharp 2.80.2.
- Fixed the issue where Proj String and EPSG number cannot be read correctly when opening a layer.
- Fixed the issue where printing doesn’t work properly on High DPI printer.
- Fixed the issue where the transparent background of a geotiff was not displayed properly.
- Fixed the issue where a geoimage cannot be serialize/deserialize properly.
- Fixed the issue where CAD layer throw a KeyNotFound exception in certain situations.
- Fixed an issue where the Red and Blue channels of a geoTiff are inverted on Linux, iOS and Android.
- Fixed the issue where drawing text with rotation angle other than 0 has some unexpected offset when zooming in to the lowest zoomlevel.
- Support raster projection for the web-based layers such as google maps, bing maps, ThinkGeo cloud maps and mapbox maps.
ThinkGeo.UI.WPF Namespace / ThinkGeo.UI.WinForms Namespace:
- Fixed the issue where map flashes when multiple overlays are added to the map if one overlay draws way faster than the others.
- Used async drawing and greatly improve the drawing performance.
- support customized zoombar tooltips
12.1¶
Release date: 11/29/2019
ThinkGeo.Core Namespace:
- Enhanced to support high resolution screen for ThinkGeo Cloud Maps.
- Enhanced to support high resolution screen for GoogleMapsLayer.
- Enhanced to support projection for WMTS layer.
- Fixed a bug where UnmanagedProjProjectionConverter converts extent to internal projection incorrectly.
- Fixed the font size issue for PointStyle.
- Fixed a bug where the WKB of MultiLine Empty can't parse.
- Fixed a bug where ThinkGeo Cloud Vector layer aren't rendered at zoom level 19.
- Fixed a bug where the alpha component of GeoColor style didn't work.
- Fixed a bug where TextBaseline can't support multi-line text.
- Enhanced to support cancel drawing line.
- Fixed a bug where the GeoImage being used is disposed for Noaa layer.
- Enhanced to support Cad.
- Enhanced to support multi-thread for projection converter.
- Fixed a bug where FeatureSource.GetColumns method throws exception in multi-threads.
- Enhanced to make SqliteFeatureLayer thread safe.
- Added DrawText method for PositionStyle.
- Added "PointStyle(GeoFont glyphFont, string glyphContent, GeoBrush fillBrush)" constructor for PointStyle.
- Published PointStyle.DrawGlyph method.
- Enhanced to support custom font for PointStyle.
- Changed the default tile size value of ZoomLevelSet from 256 to 512.
- Published PointStyle.DrawImage method.
- Published PointStyle.DrawSymbol method.
- Fixed a bug where the ProjectionConverter.ConvertToExternalProjection method doesn't work.
- Fixed a bug where SqliteFeatureSource querying data from R-Tree index table throws exception.
- Fixed a bug where the SqliteFeatureSource.GetFeaturesByIds method doesn't work.
- Changed longitude and latitude parameter order for some API.
- Enhanced to support GeoLinearGradientBrush for Printer and fixed bug the Printer get different result with the Map if polygon contains inner rings.
- Fixed a bug where the angle of label of GeoLinearGradientBrush is incorrect .
- Fixed an bug where when parsing tile format tiff image, throws "Array index is out of range" exception.
- Enhanced to support background for layer.
- Enhanced to support KeyColors for SkiaGeoCanvas.
- Changed the default web proxy from null to DefaultWebProxy of system.
- Fixed a bug where rendering tiff image is blurred.
ThinkGeo.UI.Wpf Namespace:
- Fixed a bug where LayerOverlay throws the exception when tile type is multiple tile.
- Enhanced to support high resolution screen for ThinkGeo Cloud Maps.
- Improved memory usage for Wpf.
- Changed the zoom animation time form 200ms to 100ms.
- Fixed a bug where ThinkGeocloudRasterMapsOverlay can't support to display map when custom zoom-level scale is smaller default min zoom-level scale.
- Fixed a bug where there are white gaps between tiles.
- Changed longitude and latitude parameter order for some API.
- Changed the default web proxy from null to DefaultWebProxy of system.
- Fixed a pinch zoom issue. When zoom in map, the target scale is smaller than expected.
- Fixed a bug where "map.TrackOverlay", "map.AdornmentOverlay", etc. were all null after Map initialized.
- Fixed a bug where InMemoryMarkerOverlay's marker can not display at first zoomlevel.
12.0¶
- Merge all the managed layers to Core and used GDAL to redesign Unmanged Layers. Rename the packages name, here is latest package names:
ThinkGeo.UI.WpfThinkGeo.UI.BlazorThinkGeo.UI.WebApiThinkGeo.CoreThinkGeo.GdalThinkGeo.EcwThinkGeo.CadThinkGeo.GeoTiffThinkGeo.Jpeg2000ThinkGeo.MrSidThinkGeo.UmanagedProjThinkGeo.NuticalChartsThinkGeo.FileGeoDatabaseThinkGeo.PersonalGeoDatabaseThinkGeo.OracleThinkGeo.SqliteThinkGeo.MsSqlThinkGeo.PostgreSqlThinkGeo.PrintersThinkGeo.Dependency.SQLiteThinkGeo.Dependency.MicrosoftVisualCRunTime140ThinkGeo.Dependency.NetTopologySuiteThinkGeo.Dependency.NpgsqlThinkGeo.Dependency.PrintersThinkGeo.Dependency.SkiaSharpThinkGeo.Dependency.SqlClientThinkGeo.Dependency.JintThinkGeo.Dependency.SQLiteThinkGeo.Dependency.WriteableBitmapEx
- Redesign GeoCanvas based on SkiaSharp.
- Updated all the C++ runtime to one single version, use MSVC140.
- Use one GDAL C# wrap instead of raster layer wrappers, like JPEG2000, ECW, MrSid, Tiff, .etc.
- Removed FDO, and SDF layer.
- Renamed our all MapControl to MapView.
- Used GDAL for S57 and FileGeoDatabase and PersonalGeoDatabase, this will inherit from GDAL Feature Layer.
- MapSuite TileCache/Tile Matrix, based on current design, the TileView, TileCache, Tile, Matrix are thread safe. It will improve the performance greatly.
- Matrix: Create/Calculate the matrix system for TileLayer and TileOverlay.
- Tile: The tiles for the cached items, the tile contains the tile data and tile location (z,x,y)
- TileCache: Tile Cache for ThinkGeo, it work with one tile.
- TileView: TileOverlay each tile view, it only draw the layers or render the drawing result in UI.
- Refine our MapSuite properties, make sure set one property won’t change other properties, like Map.Unit will update the map extent, .etc.
- Support Rotation for WPF.
- Support StyleJson.