Skip to content

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 VectorPmTilesAsyncLayer and RasterPmTilesAsyncLayer for PMTiles v3 archives, vector tiles styled with a style.json or raster image tiles, and PmTilesHeader for an archive's tile type, zoom range, bounds and center.
  • Added VectorMbTilesGenerator and VectorPmTilesGenerator (GenerateMbTilesAsync, GeneratePmTilesAsync, EstimateTotalTiles) to build vector tile archives from any FeatureSource up to zoom 26 or 30, and FeatureSourceVectorTileCutter for single MVT tiles.

Vector tiles styled with style.json

  • Rebuilt style.json support in MvtTilesAsyncLayer, VectorMbTilesAsyncLayer and VectorPmTilesAsyncLayer on 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-fit and 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 MvtTilesAsyncLayer to raise its MaxDataZoom to 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 ThinkGeoVectorTileAsyncLayer for the newer ThinkGeo Cloud vector tiles (API key, StyleUri such as ThinkGeoVectorStyles.Light), with VectorTileCache, LabelDisplayMode, TransparentBackground, WebProxy, TimeoutInSeconds and HTTP events.
  • Moved GeocodingCloudClient to the v3 geocoding service and ReverseGeocodingCloudClient to the v2 reverse geocoding service, with DataSources, LocationTypes, and Description, Location, IntersectingRoads and Priority on results.

Printing and PDF

  • Added page-layout printing to ThinkGeo.Core: PagePrinterLayoutAsyncLayer, MapPrinterLayoutAsyncLayer, LabelPrinterLayoutAsyncLayer, ImagePrinterLayoutAsyncLayer and LegendPrinterLayoutAsyncLayer, asynchronous and free of GDI+.
  • Added ScaleBarPrinterLayoutAsyncLayer, ScaleLinePrinterLayoutAsyncLayer, ScaleTextPrinterLayoutAsyncLayer, DataGridPrinterLayoutAsyncLayer and MagneticDeclinationPrinterLayoutAsyncLayer to the page-layout family (PrinterLayoutAsyncLayer).
  • Added PdfGeoCanvas for 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. SetPageSize sizes the page.
  • Added PrinterLayoutDocument and PrinterLayoutPage for multi-page layouts: ExportPdfAsync writes every page into one PDF, each at its own sheet size, and DrawAsync draws 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 Dpi and display scaling, and added MapPrinterLayoutAsyncLayer.DrawingMode and PreviewDrawingMode (vector print, cached preview).
  • Added DataGridPrinterLayoutAsyncLayer.RowsPerPage and SplitIntoPages(), 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 A0 to A5 to PrinterPageSize, also for the classic PagePrinterLayer, and PrinterLayoutHelper (ConvertLength, GetPointsPerGeographyUnit) for custom layout layers, replacing PrinterHelper.

Online feature services (WFS, OGC API - Features, ArcGIS Server REST)

  • Added AsyncFeatureSource and AsyncFeatureLayer (GetFeaturesIntersectingAsync, GetFeaturesNearestToAsync and more); the WFS, OGC API and ArcGIS REST async layers expose theirs as FeatureSource, and the layer's SendingHttpRequest sees its requests.
  • Added WfsAsyncLayer/WfsAsyncFeatureSource for WFS 1.x (GeometryType from the schema, GetCapabilitiesAsync, GetLayersAsync) and OgcApiAsyncLayer/OgcApiAsyncFeatureSource for OGC API - Features (CollectionIds, BulkSize, GetFeaturesPageAsync).
  • Added Crs (server-side reprojection), GeometryType, WfsV2AsyncFeatureSource, and GetCapabilitiesAsync and GetLayersAsync with proxy and cancellation to WfsV2AsyncLayer; WfsV2FeatureSource and WfsV2FeatureLayer gained Crs and GeometryType.
  • Added Resolve and ResolveDepth to WfsV2AsyncFeatureSource to have the service resolve references, GetFeaturesPageAsync returning a FeaturePage, and ReadUntilEmptyPage for services that send short pages.
  • Added WfsV2CompositeAsyncLayer and WfsV2CompositeAsyncFeatureSource for WFS 2.0 feature types whose geometry lives in referenced features (for example ATKIS roads), joined as WfsComponentRelation describes.
  • Added ArcGisServerRestVectorAsyncFeatureSource with OutFields, OutSR, MaxAllowableOffset, GeometryPrecision and paging limits; ArcGisServerRestVectorAsyncLayer.MaxConcurrentRequests replaces MaxParallelRequests.

Online raster services

  • Added GoogleMapTilesAsyncLayer for 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 made WmsClient and WmtsClient public to read a server's layers, styles, formats and coordinate systems.
  • Added WebBasedAsyncLayer.HttpMessageHandler, RasterXyzTileAsyncLayer.GetTileContentAsync, AzureMapsRasterAsyncLayer.GetAttributionAsync with cancellation and ArcGisServerRestLayerImageFormat.Png32; rejected requests now show the server's reason.

Grids, heatmaps and graticules

  • Added GridRasterLayer, which draws a GridSource (AscGridSource for ASCII grid files, InMemoryGridSource for your own values) as a colored raster through a GridFillStyle with gradient or class color stops.
  • Added HeatmapStyle, the same Gaussian heatmap as MapLibre GL, with Radius, RadiusUnit (pixels or ground distance), Weight, WeightColumnName, Intensity, Opacity and ColorStops; it replaces HeatStyle.
  • Added GraticuleAdornmentLayer for latitude and longitude lines with edge labels, replacing GraticuleFeatureLayer, and AdornmentLayer.UpdateWhileTransforming so 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 RasterImageCache to 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 with Opacity below 1 is faster.
  • Added WebP: SkiaRasterLayer draws WebP files and GeoImageFormat.Webp saves 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.GenerateTileCacheAsync to draw tiles in parallel, with an overload that builds a layer set per worker, and added TileCache.GetLastUpdatedTimeUtcAsync, TileCache.DrainAsync and FileTileCache.DeleteTiles.

Projections

  • Added ProjectionConverter.DecimalDegreesToSphericalMercator (always open), TryConvertToExternalProjection and TryConvertToInternalProjection; converting no longer checks for a missing grid file per feature, and WKT input gets a clear error.
  • Added TileMatrixSet.Projection and TileMatrixSet.CreateTileMatrixSet(tileSize, boundingBox, projection, ...) to build a tile grid in any projection.

Geometry, Z values and the dateline

  • Added Z values: PointShape.HasZ, ZValues, SetZ and SetZValues on LineShape and RingShape, Z-aware WKB and WKT (WkbShapeType.PointZ and others), Z shapefiles and 3D GDAL sources. See ThinkGeoSettings.PreserveZ under Upgrading.
  • Added DatelineHelper (Split, Merge, IsSplit) to split geometry at the dateline and join it back, in any unit, and LineBaseShape.GetLineOnALine overloads that measure distances on the ground through a Projection.
  • Improved dateline handling: with WrapDateline, a feature layer draws geometry stored past +/-180 whole and without a seam line, and PointShape.TranslateByDegree and TranslateByOffset wrap the longitude instead of throwing.

Feature sources and layers

  • Added GeoJsonFeatureSource for GeoJSON files or text (FromGeoJson), and FeatureIdColumn on ShapeFileFeatureLayer, ShapeFileFeatureSource, TabFeatureLayer and TabFeatureSource to take stable feature ids from a column.
  • Added FeatureSource.GetAllFeatureAttributes and CanGetFeatureAttributesWithoutGeometry to 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, replacing LayerBase.ThreadSafe, and LayerBase.Opacity/RasterSource.Opacity replacing Transparency.

Symbols

  • Added SVG point symbols (PointStyle.CreateStyleFromSvgFile, CreateStyleFromSvg, CreateStyleFromPathData, PointType.PathData) and PathDataParts in PointStyle.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.Unsafe binding redirect fixes a TypeInitializationException on 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 VectorMbTilesAsyncLayer reading MBTiles files without a tile scheme with flipped rows (now TMS), ArgumentOutOfRangeException on concurrent MBTiles reads, and closing a ThinkGeoMBTilesLayer leaving the .mbtiles file in use.
  • Fixed vector tile shapes shifting up to half a pixel between tiles, a MultiTile race at tile boundaries, MvtTilesAsyncLayer failing to open on Blazor WebAssembly, and ThinkGeoVectorMapsAsyncLayer drawing only its background in SingleTile.
  • Fixed WFS feature types losing their geometry when the service binds GML to a prefix other than "gml"; requests now send prefixed names with NAMESPACES and leave out PROPERTYNAME when 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 WfsV2FeatureSource taking 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 ArcGisServerRestVectorAsyncLayer returning geometry simplified for the last drawn view to hit tests and other queries, and OgcApiFeatureSource ignoring WebProxy and TimeoutInSeconds on its asynchronous path.
  • Fixed WmsServerLayer.MinScale and MaxScale always reading 0 (now read from 1.1.1 and 1.3.0 capabilities, with HasMinScale and HasMaxScale), and a second or canceled WmsAsyncLayer.OpenAsync throwing.
  • 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 HttpClient they 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 SkiaRasterSource keeping its decoded image after Close, 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 GetFeatureIds returning ids of records with no shape, and GpxFeatureSource adding 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 a ProjectionConverter or drawn by an AreaStyle.
  • Fixed concurrent FeatureSource.Open and Close calls corrupting a source, columns added through InMemoryFeatureLayer.Columns missing from GetColumns(), and in-memory queries missing features after InternalFeatures changed.
  • Fixed MapInfo TAB editing: attribute indexes are rebuilt correctly after a commit, copied features are added, committing through a ProjectionConverter keeps 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 (ScaleFactor above 1).
  • Fixed kriging grid interpolation hanging when asked for more neighbors than the data has, and reverse geocoding throwing ArgumentNullException when 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 LegendAdornmentLayer starting a new column because of a rounding difference and its layout when it has no items, and LogoAdornmentLayer throwing 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 SkiaGeoCanvas not finding installed Windows fonts whose display name differs from their family name, such as "Franklin Gothic Medium", and a GeoFont with both Underline and Strikeout drawing only the strikeout.
  • Fixed LineStyle throwing for a GeoPen made from a hatch, texture or gradient brush (the line is now stroked with that brush), and GeoLinearGradientBrush.WrapMode being ignored, which made some PDF viewers drop gradients.
  • Fixed line labels disappearing at random while zooming MultiTile overlays when they crossed a tile edge, and labels of lines that cross the dateline drawn off-center or not at all (with WrapDateline they are labeled once).
  • Fixed multi-line polygon labels, such as a TextStyle with a DateFormat, drawn as one line on top of each other, and TextStyle.FittingPolygonInScreen being ignored when LabelAllPolygonParts is on.
  • Fixed ValueStyle, ClassBreakStyle, GradientStyle, IconValueStyle and RegexStyle throwing 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 GdalGrid to read a band of any GDAL raster (GRIB2, NetCDF, GeoTIFF...) as values or as an InMemoryGridSource for GridRasterLayer.
  • Added GdalRasterSource.WarpProjection to warp a raster to another projection when it opens and SourceProjection to override a wrong or missing projection, and GdalRasterLayer.GdalCacheMax and EcwGdalRasterLayer.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 with dotnet 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 GdalConfiguration class 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 GdalRasterSource locking its world file.
  • Fixed GdalProjectionConverter drawing the world again in the corners of Equal Earth or sinusoidal maps, and GdalFeatureSource reading 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 GetFeatureIds no 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, CadWidthColumnName and CadStyleKindColumnName columns to CadFeatureSource, 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 OracleFeatureLayer returning only the features crossing the antimeridian for views wider than about 180 degrees; it now queries with Oracle's native SDO_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 Encrypt nor TrustServerCertificate now gets TrustServerCertificate=True, as before.
  • Fixed WhereClause: it accepts a bare condition, applies to GetFeatureIds, 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 PostgreSqlFeatureSource to read attributes without reading geometry and to format values the same on every machine.

ThinkGeo.NauticalCharts:

  • Added GetFeatureDescription to NauticalChartsFeatureLayer and NauticalChartsFeatureSource, which translates a feature's S-57 codes into plain names and values (for example COLOUR "3;1" to "red, white").
  • Added NauticalChartsFeatureLayer.ExportDefaultStyleFile to 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 PrinterGeoCanvas to 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, PrinterZoomLevelSet and 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 MapPrinterLayer printing too large when the print Dpi is raised, and its BackgroundMask outline printing as a hairline while map content ran past the frame.
  • Fixed layers inside a MapPrinterLayer choosing their zoom level for the wrong scale, and ScaleLinePrinterLayer drawing too long, in the print preview on high-DPI displays.
  • Fixed PrinterGeoCanvas measuring text differently from how it draws it (centered labels drifted, text overflowed its box), and LegendPrinterLayer starting a new column because of tiny rounding differences.

New Package: ThinkGeo.Gpu (WPF and WinForms, .NET 8 and later)

Engine

  • Added the ThinkGeo.Gpu package, 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 new MapView.Basemap: the GPU map is drawn beneath the whole Overlays collection, 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 (@2x sprites).

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 with MapStyle.LoadAsync or new 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, interpolate and feature-state are evaluated per feature and zoom. line-pattern and line-gradient are not drawn yet.
  • Added MapStyle.AddStyle (optionally keeping only some StyleLayerTypes, such as roads and labels over imagery), AddVectorTiles, AddRaster and AddFeatureLayer, each placed with StyleLayerSlot (Top, Bottom, AboveFills, UnderLabels).
  • Added StyleLayer.CreateFill, CreateLine, CreateCircle, CreateSymbol, CreateFillExtrusion and CreateHeatmap, whose paint, filter and label text are C# functions, and MapStyle.AddFillLayer, AddLineLayer, AddSource and AddLayer with StyleExpressions.
  • Added runtime changes: MapStyle.SetLayerVisibility, SetHeatmapPaint and SetFeatureState/ClearFeatureState (for ["feature-state", ...] highlights) show on the next frame, and RemoveLayer, MoveLayer or Add calls are applied as one restyle.
  • Added GpuBasemap.SetStyleAsync to 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: a GeoImage, a classic Style drawn once (such as a PointStyle symbol), or a GeoHatchBrush as a seamless pattern.
  • Added MapStyle.SetBackground, SetSky, SetLight, SetGlyphs and SetSprite; a style without a background leaves the map transparent, and GpuBasemap.IsBackgroundTransparent lets content beneath the map show through.
  • Added FeatureLayerTranslator.Translate and MapStyle.AddFeatureLayer to draw an existing FeatureLayer, WfsV2AsyncLayer or OgcApiAsyncLayer on 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, RegexStyle and CompositeStyle (hatch pens, dashes, text masks, rotated text); anything else is listed in FeatureLayerTranslation.Warnings.
  • Added FeatureLayerTranslator.TranslateInto to translate several classic layers into one FeatureSourceVectorTileSource, 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.FromTextStyle and DashArray.FromGeoPen to reuse classic styles in code-built layers.

Tile sources

  • Added vector tile sources: VectorTileSource (any style.json or TileJSON service), ThinkGeoVectorTileSource, MbTilesVectorTileSource and PmTilesVectorTileSource, set through the style or GpuBasemap.TileSources.
  • Added FeatureSourceVectorTileSource, which cuts vector tiles on the fly from any FeatureSource (shapefile, database, WFS...), on Web Mercator or a grid of your own, with an optional VectorTileCache.
  • Added XyzRasterTileSource, OpenStreetMapRasterTileSource, ThinkGeoRasterTileSource, WmsRasterTileSource, WmtsRasterTileSource, MbTilesRasterTileSource, PmTilesRasterTileSource, GeoImageRasterTileSource and ClassicRasterTileSource.
  • Added MapStyle.AddRaster with RasterPaint for 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, TimeoutInSeconds and a SendingHttpRequest event (for keys and tokens) to WmsRasterTileSource, WmtsRasterTileSource and XyzRasterTileSource; WMS asks for tiles at the screen's resolution.
  • Added RasterTileSource.ReprojectOnto to 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 VectorTgTilesGenerator and TgTilesVectorTileSource for .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.RefreshVectorTiles to re-read a vector source, or one extent of it, after its data changed, and GpuBasemap.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 own Image, and the tile is retried at most every 3 seconds unless Retry is false.

Terrain, hillshade and 3D buildings

  • Added terrain: MapStyle.SetTerrain (or a style.json terrain) drapes the map over elevation from a RasterDemSource (Terrain-RGB or Terrarium tiles), an ElevationRasterTileSource, or a DEM file through GdalElevationSource, 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.GetElevationAsync and GetElevationProfileAsync to read the elevation at a point, or an ElevationProfile along a line, from the map's DEM tiles, even when terrain is off.
  • Added 3D buildings and other extruded shapes with fill-extrusion layers (FillExtrusionStyleLayer), lit by MapStyle.SetLight and lifted at runtime with SetFillExtrusionOffset for stacked floors; GpuBasemap.IsExtrusionDrawingEnabled turns them off.

Display projections and globe

  • Added DisplayProjection (FromEpsg, FromProjString, FromName, ToDisplay, FromDisplay) and GpuBasemap.DisplayProjection to 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.IsGlobeActive and GlobeHandoverFactor report where the view stands.
  • Added GpuBasemap.AnimateDisplayProjectionAsync to morph smoothly from one projection to another, for example from Web Mercator to the globe, with cancellation and the DisplayProjectionChanged event.

Heatmaps, isolines, grids and live data

  • Added GPU heatmap layers (style.json heatmap or StyleLayer.CreateHeatmap with ColorStops) with per-feature weight; MapStyle.SetHeatmapPaint changes radius, intensity, opacity and colors at runtime without a rebuild.
  • Added MapStyle.AddIsolines to draw contour lines of a GridSource, or of scattered measurements in a PointValueSource interpolated on the GPU, styled by IsolineStyle with colored levels, fills between levels and value labels.
  • Added GpuBasemap.GetIsolineFieldAsync to read the interpolated field back as an IsolineFieldSnapshot in the data's units, ready to turn into features with IsoLineLayer.GetIsoFeatures.
  • Added MapStyle.AddGridFill to color every cell of a GridSource on the GPU with a GridFillStyle (color stops, gradient or classes, resampling, opacity); new grid values are a small texture upload.
  • Added VectorFieldSource for wind and current data, drawn as arrows with MapStyle.AddVectorField or as animated particle flow with MapStyle.AddParticleFlow; GdalGrid reads one from two bands of a GRIB2 or NetCDF file.
  • Added DynamicSource and MapStyle.AddDynamic for 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), IsLabelDrawingEnabled to hide all labels, and LocalFontsDirectory for 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-fit with stretchable nine-slice sprites, underline and strikethrough (TextDecoration), optional text or icon, and upright line labels.

Rendering without a map control

  • Added GpuTileRenderer to 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.SetStyleAsync to restyle in place and GpuTileRendererBackend.Software to 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 classic AsyncLayer that draws a MapStyle over feature sources with the GPU renderer, for a LayerOverlay, a tile cache or printing.
  • Added MapStyleFeatureAsyncLayer (in ThinkGeo.Core), which draws a MapStyle over your feature sources on any GeoCanvas, including printers and PdfGeoCanvas, 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.RotateToAsync to animate to a rotation angle the short way round, cancelable (.NET 8 and later), and MapView.IsRotationEnabled to turn off the rotation gestures; a two-finger twist now rotates the map about the fingers.
  • Added MapView.TiltAngle (0 to 85 degrees) and TiltToAsync to tilt a map that has a GPU Basemap into perspective, animated and cancelable; labels stay upright, and TiltAngle raises PropertyChanged for 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) and ToScreenCoordinate(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, MarkerOverlay and PopupOverlay stay anchored to their locations, and a FeatureLayerWpfDrawingOverlay is hidden while tilted (.NET 8 and later).

Navigation and zooming

  • Added ExtentInteractiveOverlay.ZoomStep to set how many zoom levels one wheel notch or double-click moves; a fraction such as 0.15 zooms smoothly between ZoomScales levels, and with a GPU Basemap the 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; ZoomSnapDirection no longer has any effect.
  • Added MapView.ZoomScalesChanged on WPF and WinForms, raised when ZoomScales is replaced; the pan-zoom bar and CurrentZoom now follow the new scales.
  • Changed RefreshAsync to complete quietly instead of throwing TaskCanceledException when 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, MapKeyDown and MapKeyUp on the WPF and WinForms MapView, raised before any interactive overlay sees the input; an overlay cannot block them.
  • Added ScreenX, ScreenY, WorldLocation and MouseButton or WheelDelta to the map mouse event args, and Key with IsCtrlKeyPressed, IsShiftKeyPressed and IsAltKeyPressed to 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 replaces ProcessOtherOverlaysMode.

Custom overlays

  • Simplified custom overlays: Overlay.DrawAsyncCore is the one method to override, OpenAsync and CloseAsync take a CancellationToken, 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 same DrawingExceptionMode as layers) to control whether an overlay's drawing errors are rethrown; it replaces Overlay.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; ThinkGeoMBTilesOverlay and XyzTileOverlay release the .mbtiles file, and a closed overlay reopens before its next draw.

New overlays

  • Added ThinkGeoVectorTileOverlay for the newer ThinkGeo Cloud vector tiles drawn from a MapLibre style, with ApiKey and StyleUri; it replaces ThinkGeoCloudVectorMapsOverlay, and its parameterless constructor allows XAML.
  • Added LabelDisplayMode, VectorTileCache (one disk cache serves every style), TransparentBackground, WebProxy, TimeoutInSeconds, ShowDebugInfo and the HTTP events to ThinkGeoVectorTileOverlay, which places labels once over the whole view.
  • Added GoogleMapTilesOverlay for Google Maps Platform Map Tiles, with MapType, RequestLanguage, Region, traffic and Street View layers, the Session and attribution; tile caching is blocked, as Google's terms require.
  • Added GoogleMapsStaticOverlay for the Google Maps Static API; it replaces GoogleMapsOverlay.
  • Added GridOverlay to draw a GridSource, such as an ASCII grid or values set in code, as a colored raster with a GridFillStyle; it redraws when the source changes, which suits animated grids.
  • Added OgcApiFeaturesOverlay.AsyncLayer to show OGC API - Features collections through OgcApiAsyncLayer, drawn progressively as each page of features arrives.

Tile overlays

  • Added TileOverlay.TileReplacementMode so semi-transparent overlays no longer look opaque during a redraw; Automatic, the default, sees layer opacity and translucent style colors, and custom overlays override HasSemiTransparentContentCore.
  • Added TileOverlay.CurrentZoomTileCacheCapacity and ZoomOutTileCacheCapacity to keep recent tiles in memory, so zooming back out shows the coarser tiles at once; they replace TileViewInMemoryCache.
  • Added TileOverlay.MaxConcurrentTileDraws to 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.CancelTracking and UndoLastVertex do the same from code.
  • Added MeasureInteractiveOverlay.Projection to measure on the ground instead of on the map's plane, where Spherical Mercator overstates distances away from the equator.
  • Added PrinterInteractiveOverlay.PrinterLayoutAsyncLayers to 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 MarkerOverlay with 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: FeatureLayerWpfDrawingOverlay moves 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 MultiTile overlays 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 OgcApiFeatureLayer now open on a background thread in LayerOverlay.
  • Fixed TileType.SingleTile overlays 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 NullReferenceException when 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 MapArguments still null; the map now sets MapArguments before OpenAsyncCore runs.
  • Fixed "Collection was modified" from LayerOverlay when its Layers changed while a slow asynchronous layer, such as WFS, was still drawing.
  • Fixed ThinkGeoCloudVectorMapsOverlay drawing only its background when TileType was SingleTile, and AzureMapsRasterOverlay failing when navigation canceled an attribution request.
  • Fixed a tile overlay keeping stale tiles after its TileMatrixSet changed, a redraw splitting its tiles between two caches when TileCache was replaced, and a cache-only overlay not drawing the debug grid on missing cells.
  • Fixed EditInteractiveOverlay.ControlPointSelecting firing on every press with an empty TargetPointShape and ignoring Cancel, and the move handle of a self-intersecting polygon appearing off the shape, often off screen.
  • Fixed the MeasureInteractiveOverlay ruler 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 ObjectDisposedException on 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 OgcApiFeaturesOverlay drawing symbols and labels too small on high-DPI screens, and OgcApiFeaturesOverlay and WfsV2Overlay squeezing their image by up to a pixel at fractional scaling such as 150%.
  • Fixed a disposed SimpleMarkerOverlay being 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, RotateToAsync and IsTiltEnabled to the WinForms MapView (.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 MapView to answer its property getters and ignore setters instead of throwing.
  • Fixed the hosted map keeping its old size when SizeChanged was raised, so a refresh or zoom started from SizeChanged used 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.Wpf and ThinkGeo.UI.WinForms target .NET Framework 4.6.2 and .NET 8. On .NET 8 they bring ThinkGeo.Gpu, which needs exactly the same ThinkGeo.Core version (upgrade both together), and ThinkGeo.Gpu.Native with ANGLE 2.1.1.
  • ThinkGeo.Core uses 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.Gdal uses 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 the GDAL package directly must move to 3.12.1.
  • ThinkGeo.FileGeoDatabase uses 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.Cad uses the ODA CAD SDK 27.9, ThinkGeo.Oracle Oracle Instant Client 23.26.4 with the GDAL 3.12.1 Oracle plugin, ThinkGeo.SqlServer Microsoft.Data.SqlClient 6.1.8, and ThinkGeo.PostgreSql Npgsql 8.0.9.
  • The native packages ship an app-local Microsoft Visual C++ runtime 14.51.36247.0 (ThinkGeo.Dependency.MicrosoftVisualCRunTime140), and ThinkGeo.Printers uses 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/UpperThreshold and GdalFeatureSource.ActiveLayer.
  • Renamed, now compile errors: CanGetBoundingBoxQuickly → CanGetBoundingBoxWithoutScan, CanGetCountQuickly → CanGetCountWithoutScan, LayerBase.ThreadSafe → ConcurrentAccess, DrawingQuality.Default → Standard, DataGridResizeMode.Default → AutoFit.
  • ThinkGeo Cloud: CloudGeocodingOptions.SearchMode, ResultDetail, LocationType and the Overture options, and the reverse geocoding SearchArea and SearchLine, are compile errors; use SearchPoint or SearchPoints with a radius.
  • The GeoCanvas.DrawTextWithScreenCoordinate and DrawTextWithWorldCoordinate parameters are renamed from upperLeft* to center*, which breaks calls with named arguments; the ThinkGeo 14 ThinkGeoLicenseStatus values are compile errors.
  • Removed without an earlier warning: BuildingAreaStyle, OsmBuildingAreaStyle and BuildingShadowMode (use fill-extrusion layers on the GPU map), MapView.GetSnappedExtent, IMapArguments.GetSnappedExtent and MapView.CollectedMapArguments.
  • Removed obsolete map members such as MapView.RotatedAngle, WPF MapTap, WinForms ActualWidth/ActualHeight (use MapWidth/MapHeight), Overlay.OverlayCanvas, Overlay.PanTo, TileOverlay.ImageFormat and WmtsTiledOverlay (use WmtsOverlay).
  • Removed the Marker mouse events (MarkerMouseClick, MarkerMouseDown, MarkerMouseUp, MarkerMouseMove), Marker.Draw, MarkerDragMode.CopyWithShiftKey, PolygonTrackMode, and the LockLayerMode and MapClickDragMode enums.
  • Custom overlays: Overlay.DrawAsyncCore is abstract; override OpenAsyncCore(CancellationToken) and CloseAsyncCore(CancellationToken) and move one-time setup there, as the token-less overloads, Initialize and InitializeCore are compile errors.
  • Now compile errors: Overlay.ThrowingExceptionMode → DrawingExceptionMode, OgcApiFeaturesOverlay.FeatureLayer → AsyncLayer, ZoomSnapDirection (track zoom no longer snaps), and Default of MapPanMode, MapZoomMode, MapMouseWheelMode and similar enums.
  • WinForms MapView.MapMouseDown and MapMouseUp now use MapMouseDownMapViewEventArgs and MapMouseUpMapViewEventArgs, MapKeyDown, MapKeyUp and MapMouseMove work again with new args, and MapTap and ZoomLevelSetChanged are compile errors.

Deprecated APIs

  • Deprecated: ThinkGeoVectorMapsAsyncLayer → ThinkGeoVectorTileAsyncLayer, GridFeatureLayer → GridRasterLayer, GraticuleFeatureLayer → GraticuleAdornmentLayer, HeatStyle → HeatmapStyle, GoogleMapsAsyncLayer → GoogleMapsStaticAsyncLayer.
  • Deprecated: WfsFeatureLayer → WfsAsyncLayer, OgcApiFeatureLayer → OgcApiAsyncLayer, the static WfsV2AsyncLayer.GetLayers and GetCapabilities → their Async versions, LayerBase.Transparency → Opacity, and LayerBase.Background → a BackgroundLayer.
  • The classic ThinkGeo.Printers layers (MapPrinterLayer, PagePrinterLayer and the rest of the PrinterLayer family) and PrinterHelper still print as before but are deprecated and will be removed after v15.4: move to the page-layout layers.
  • Also deprecated, with no replacement: UsgsDemFeatureLayer and MapsQueryCloudClient. 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 (ProcessOtherOverlays is Bubble), and MapClickMapViewEventArgs.WorldX and WorldY → WorldLocation; the click event args are now read-only.

Behavior changes

  • ThinkGeoSettings.PreserveZ is 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.Open and AsyncLayer.OpenAsync now throw when opening fails, unless the layer's DrawingExceptionMode is DrawException, which still paints the error on the next draw.
  • Maps look different: the default GeoFont is Noto Sans instead of Arial (text can measure and wrap differently), GeoLinearGradientBrush clamps instead of repeating, and style.json layers use the new engine and MapLibre labels.
  • MaxExtents.SphericalMercator is now exactly the Web Mercator world (0.11 m larger) and ThinkGeoMaps, MapBoxMaps and BingMaps equal it.
  • Touches and TopologicalEqual queries on a source with a ProjectionConverter now return no features: coordinates converted between projections never coincide exactly, so these exact tests could only be decided by rounding.
  • LayerOverlay opens 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, and TileOverlay.DrawnTile is 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 GeoTiffRasterLayer noticeably 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 WpfRasterLayer rendering 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 GeoRadialGradientBrush for filling shapes with a center-to-edge radial gradient, using either a two-color (centerColor, edgeColor) constructor or a collection of GeoColorStop values for multi-stop gradients.

Bug Fixes

  • Fixed nested GroupAsyncLayer throwing "A task may only be disposed if it is in a completion state" on every redraw when a GroupAsyncLayer contains another asynchronous layer.
  • Fixed a heap buffer overrun in GdalProjectionConverter coordinate transformation that could corrupt memory and crash 32-bit (x86) processes.

ThinkGeo.Printers:

  • Fixed MapPrinterLayer deadlocking 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 ScaleLinePrinterLayer line 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.SetPosition being overwritten while the printer layer was selected.
  • Fixed LayerOverlay rendering blank tiles for projected layer data whose bounds fall outside the SDK default world extent.
  • Fixed FeatureLayerWpfDrawingOverlay so LineDashStyle and 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 ArcGisServerRestVectorAsyncLayer for querying and rendering ArcGIS Server REST vector feature services.
  • Added WfsV2AsyncLayer for WFS 2.0 endpoints, with improved query string generation and property-name handling; it replaces WfsV2FeatureLayer for 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 PolygonSeamRenderingMode to control polygon seam sealing independently of vector anti-aliasing and eliminate thin white seams between adjacent filled polygons with no outline.
  • Added RasterXyzTileAsyncLayer.MinZoomOfTheData and RenderBeyondMinZoom.
  • Added DrawingExceptionMode.IgnoreException; layers that throw exceptions can now be ignored
  • Made XyzTileOverlay.XyzTileAsyncLayer public.
  • Added LineStyle.OffsetFromLine for 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.InvariantCulture to 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 TextStyle formatting support for NumericFormat, DateFormat, and TextFormat.
  • Added per-character font fallback in SkiaGeoCanvas and the new CreatingSKTypefaceForCharacter event for custom font resolution.
  • Enhanced ScaleLineAdornmentLayer with AboveLabelTextStyle, BelowLabelTextStyle, AboveLabelMargin, and BelowLabelMargin, 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 .prj file.
  • Unified raster resampling under RasterResamplingMode across GeoTiff, Skia raster, and GDAL sources.
  • Added SkiaRenderingOptions for fine-grained SkiaGeoCanvas rendering configuration.
  • Reworked SkiaSharp bitmap/image ownership for better thread safety and lower contention in multi-tile rendering.
  • Cached StyleJsonTextStyle zoom-level state and icon lookups to remove repeated allocations on unchanged zoom levels.
  • Released ThinkGeoVectorMapsAsyncLayer feature data and style references immediately after each tile draw to reduce peak heap usage during concurrent rendering.
  • Replaced MultipolygonShape convex hull generation in PositionStyle with 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 Polygon or MultiPolygon WKB as appropriate.
  • Fixed FileGDB polygon spatial queries throwing TopologyException from NTS.
  • Fixed a projected MvtTilesAsyncLayer rendering regression introduced in 14.4.x.
  • Fixed MVT tile seam artifacts when the overlay is in SingleTile mode.
  • 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 WmtsAsyncLayer failures with servers that use decimal-degree TileMatrix definitions.
  • Fixed ProjectionConverter not handling the +R proj4 parameter.
  • Fixed PointShape.GreatCircle() returning NaN coordinates for antipodal inputs.
  • Fixed OgcApiFeatureSource entering an infinite request loop when the server is offline.
  • Fixed an exception when zooming out past tiles with RenderBeyondMaxZoom enabled.
  • Fixed RenderBeyondMaxZoom not working for the decimal-degrees map unit.
  • Fixed intermittent font rendering corruption where characters could mix between glyphs.
  • Fixed SkiaRasterSource failing to load PNG images from memory streams.
  • Fixed a CartographicTiles resampling regression introduced in 14.4.x.
  • Fixed an AsyncLocker threading conflict.
  • Fixed a DrawGlyph thread-safety issue.
  • Fixed labels appearing below the line centerline instead of centered on it.
  • Fixed TextStyle.TextPlacement left and right being swapped for point features.
  • Fixed GeoJsonFeatureSource failing to parse features with special characters in property values.
  • Fixed images appearing blurry when pixel-stretched in a 14.4.x regression.
  • Fixed SkiaSharp resource leaks and GeoImage lifecycle 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.SqlClient to Microsoft.Data.SqlClient.

ThinkGeo.UI.WinForms Namespace / ThinkGeo.UI.WPF Namespace:

New Features & Improvements

  • Added GeoLinearGradientBrush support to WpfGeoCanvas.
  • Switched AdornmentOverlay rendering to WpfDrawingGeoCanvas for the same hardware-accelerated path used by other WPF overlays and more consistent high-DPI rendering.
  • Added draggable and resizable adornments so AdornmentLayer items can be repositioned and resized at runtime.
  • Added MouseCoordinateMapTool.Projection for displaying coordinates in a custom CRS.
  • Disabled the ThinkGeo branding logo by default.
  • Added TileOverlay.RenderingOptions to expose per-overlay SkiaRenderingOptions.
  • Moved GeoImage and GeoCanvas lifecycle ownership to TileView to 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 CurrentExtentChanging and CurrentExtentChanged not being raised on resize when using PreserveScaleAndCenter.
  • Fixed TrackEndedTrackInteractiveOverlayEventArgs returning duplicate end vertices.
  • Fixed FeatureLayerWpfDrawingOverlay crashing when the extent is null or a layer has not been opened yet.
  • Fixed PreloadDataMultiTile crashing when the prefill tile set is empty.
  • Fixed images and glyphs not rotating correctly in WpfDrawingGeoCanvas.
  • Fixed PanZoomBar using a deprecated internal pan method.
  • Fixed crashes when rendering an error tile in tiled mode.
  • Fixed AccessViolationException when converting a GeoImage to WriteableBitmap by adding a fallback conversion path.
  • Fixed failed tiles being permanently marked as failed after a later successful reload.
  • Fixed FeatureSourceMarkerOverlay marker mouse events not being wired correctly and deprecated OnMarkerMouseDown, OnMarkerMouseUp, and OnMarkerMouseMove.
  • Obsoleted SelectedEditsInProcessLayer, EditsInProcessLayer in EditInteractiveOverlay, and TrackShapesInProcessLayer in TrackInteractiveOverlay.
  • Fixed TrackInteractiveOverlay throwing NullReferenceException when GetCurrentFeature is called before any vertex has been added.

ThinkGeo.UI.WinForms specifically

  • Added configurable mouse-over tooltips so MapView can show feature information when the cursor hovers over a feature.
  • Improved drag-and-drop event bridging so handler-set DragEventArgs.Effect is respected, all IDataObject formats 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.TextPlacement regression (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 ExtentInteractiveOverlay interaction issue where a single left mouse click/mouse down could incorrectly zoom the map to scale 0.
  • Fixed a TrackInteractiveOverlay issue where finishing a drawn shape with a double-click could return extra trailing duplicate vertices in TrackEndedTrackInteractiveOverlayEventArgs.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 background
    • Fixed 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 displayed
    • Rendering now respects the ScaleFactor, which make it work better on a High-Res screen
    • Added 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 Projection
    • Supported Vector Tile Caching
    • Enhanced robustness and reliability
  • WfsV2FeatureLayer improvements:

    • Added support for MultiPolygon geometries
    • Improved URI flexibility and automatic axis-order detection based on projection
    • Fixed 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.CreatingSKTypefacesForText event to give user an option to customize the loading SKTypeface.
  • Fixed incorrect anchoring behavior in ScaleLineAdornmentLayer.
  • Fixed exception when both WhereClause and MaxRecordsToDraw were 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

    • DragDrop
    • DragEnter
    • DragLeave
    • DragOver
  • Fixed an issue where Graticule could not be added to LayerWpfDrawingOverlay.

  • Created TileOverlay.CreatingSKTypefacesForText event 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.UnmanagedProj
    • ThinkGeo.MrSid
    • ThinkGeo.UnmanagedGeoTiff
    • ThinkGeo.Ecw
    • ThinkGeo.Jpeg2000
    • ThinkGeo.PersonalGeoDatabase
    • ThinkGeo.GeoPdf
    • ThinkGeo.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:

    • ArcGisServerRestLayer
    • BingMapsLayer
    • CloudMapClient
    • GoogleMapsLayer
    • HereMapsRasterTileLayer
    • LayerAsync
    • MapBoxStaticTilesLayer
    • OpenStreetMapLayer
    • RasterLayerAsync
    • RasterSourceAsync
    • ThinkGeoCloudRasterMapsLayer
    • ThinkGeoCloudVectorMapsLayer
    • WebBasedLayer
    • WmsRasterLayer
    • WmsRasterSource
    • WmtsLayer
    • XYZTileLayer
  • 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 WmsLayer functionality 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.DrawingExceptionMode property and Overlay.ThrowingException event.
  • Addressed the issue of incorrect feature wrapping with wrapDateLine enabled.
  • Fixed the issue where map doesn't resize smoothly when SnappingMode is set to null.
  • 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

  1. 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.Wpf
    • ThinkGeo.UI.Blazor
    • ThinkGeo.UI.WebApi
    • ThinkGeo.Core
    • ThinkGeo.Gdal
    • ThinkGeo.Ecw
    • ThinkGeo.Cad
    • ThinkGeo.GeoTiff
    • ThinkGeo.Jpeg2000
    • ThinkGeo.MrSid
    • ThinkGeo.UmanagedProj
    • ThinkGeo.NuticalCharts
    • ThinkGeo.FileGeoDatabase
    • ThinkGeo.PersonalGeoDatabase
    • ThinkGeo.Oracle
    • ThinkGeo.Sqlite
    • ThinkGeo.MsSql
    • ThinkGeo.PostgreSql
    • ThinkGeo.Printers
    • ThinkGeo.Dependency.SQLite
    • ThinkGeo.Dependency.MicrosoftVisualCRunTime140
    • ThinkGeo.Dependency.NetTopologySuite
    • ThinkGeo.Dependency.Npgsql
    • ThinkGeo.Dependency.Printers
    • ThinkGeo.Dependency.SkiaSharp
    • ThinkGeo.Dependency.SqlClient
    • ThinkGeo.Dependency.Jint
    • ThinkGeo.Dependency.SQLite
    • ThinkGeo.Dependency.WriteableBitmapEx
  2. Redesign GeoCanvas based on SkiaSharp.
  3. Updated all the C++ runtime to one single version, use MSVC140.
  4. Use one GDAL C# wrap instead of raster layer wrappers, like JPEG2000, ECW, MrSid, Tiff, .etc.
  5. Removed FDO, and SDF layer.
  6. Renamed our all MapControl to MapView.
  7. Used GDAL for S57 and FileGeoDatabase and PersonalGeoDatabase, this will inherit from GDAL Feature Layer.
  8. 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.
  9. Refine our MapSuite properties, make sure set one property won’t change other properties, like Map.Unit will update the map extent, .etc.
  10. Support Rotation for WPF.
  11. Support StyleJson.