Interactive maps for .NET, done right.

Drop a MapControl into WinForms, WPF, .NET MAUI or Blazor and get markers, routes, clustering, heatmaps and drawing tools, plus geocoding, directions, elevation and places services. One API across Google Maps, Azure Maps, HERE, Apple MapKit, Leaflet and OpenLayers.

> dotnet add package TMS.Maps.Wpf.Trial --prerelease
.NET 10 Offline licensing, no telemetry Leaflet & OpenLayers need no provider key
4
UI frameworks
6
Interactive map providers
11
Map & service providers
7
Location services
1
API to learn

Works with the map and location providers you already use

  • Google Maps
  • Azure Maps
  • HERE
  • Apple MapKit
  • Leaflet
  • OpenLayers
  • Mapbox
  • TomTom
  • Geoapify
  • OpenRouteService
  • ipstack
Platforms

One map control for desktop, web and mobile.

Each framework gets a native control that feels at home there: the designer in WinForms, XAML properties in WPF and .NET MAUI, parameters and EventCallbacks in Blazor. Behind it is the same map, the same methods and the same events.

WF

WinForms

Drop it on a form in the designer or create it in code. Standard .NET events.

TMS.Maps.WinForms.Trial
W

WPF

A XAML MapControl with bindable properties, hosted in WebView2.

TMS.Maps.Wpf.Trial
M

.NET MAUI

A XAML control for MAUI apps on Android, iOS, Mac Catalyst and Windows.

TMS.Maps.Maui.Trial
B

Blazor

A Razor component for Blazor Server and WebAssembly, also hostable from ASP.NET Core MVC.

TMS.Maps.Blazor.Trial
On the map

Everything you need to put data on a map.

Markers, shapes, overlays, layers and events all work the same on every provider, so you can change providers without rewriting your map code.

Markers & popups

Add, update and remove markers one at a time or in batches, with custom icons, titles and info popups. FitToMarkersAsync frames them all.

Clustering

Group thousands of nearby markers into clusters that split apart as you zoom in. Tune the radius and maximum zoom with MapClusterOptions.

Heatmaps

Show where your data is densest with weighted heatmap layers that you can show, hide and update at runtime.

Shapes & overlays

Polylines, polygons, circles and rectangles, with full control over stroke, fill, opacity and z-order.

Interactive drawing

Let users draw markers, polylines, polygons, circles or rectangles themselves, and get the shape back in DrawingCompleted.

Labels & HTML elements

Place text labels on the map, or pin your own HTML panels (legends, toolbars, status cards) on top of it with element containers.

Tile layers

Stack custom tile overlays such as weather, cadastral or your own tiles, or point the base map at a tile server you host.

Traffic & transit

Switch live traffic and public transit layers on or off with one call, on providers that support them.

Camera control

Pan, zoom, fit to bounds, tilt and rotate. Convert between screen pixels and coordinates for your own overlays.

Rich events

Click, double-click, right-click, drag and vertex-changed events on the map, markers and every shape type.

Switch providers at runtime

Move from Leaflet during development to Google, Azure or HERE in production, or let users pick, without changing your map code.

GeoJSON & GPX

Load and save GeoJSON features and GPX tracks, so routes and regions can move between your app and other GIS tools.

Developer experience

Write your map code once.

Declare the control the way your framework expects. The code that fills the map is the same everywhere, so a feature built for the desktop app works in the web app too.

  • Async-first. Every map and service call is awaitable and safe to call from UI code.
  • Typed results. Services return ServiceResult<T>, so errors are values you can check. They don't surprise you as exceptions.
  • Pick providers by capability. Ask which providers support directions or elevation instead of hard-coding a vendor.
  • Documented network use. Every host the SDK contacts is listed, for firewall rules and privacy reviews.
<Window xmlns:maps="clr-namespace:TMS.Maps.Wpf;assembly=TMS.Maps.Wpf">
    <maps:MapControl x:Name="Map"
                     Provider="Leaflet"
                     CenterLatitude="50.8466"
                     CenterLongitude="4.3528"
                     ZoomLevel="9" />
</Window>
Shared code: same on every platformC#
using TMS.Maps.Core.Models;
using TMS.Maps.Core.Models.UI;

// Call once the map's ready event has fired
await map.AddMarkersAsync(new[]
{
    new MapMarker(new Coordinate(51.0543, 3.7174)) { Title = "Ghent depot" },
    new MapMarker(new Coordinate(51.2194, 4.4025)) { Title = "Antwerp depot" },
});

await map.EnableClusteringAsync(new MapClusterOptions { Radius = 80 });
await map.AddCircleAsync(50.8466, 4.3528, radiusMetres: 15000);
await map.FitToMarkersAsync();
Beyond the map

Location services, no UI required.

The services are plain .NET classes. Use them next to the map control, or on their own in console apps, background workers and ASP.NET Core back ends. Each one takes a provider and returns a typed result.

Geocoding

Turn addresses into coordinates and coordinates back into addresses, for search boxes, address validation and "what's here?" lookups.

GoogleAzureHEREGeoapify
using var geocoding = new GeocodingService(Providers.Google, "YOUR_API_KEY");

// Address → coordinates
var forward = await geocoding.GetAsync("Grote Markt, Brussels");
if (!forward.IsError(out var places))
    Console.WriteLine(places.First().Coordinate);

// Coordinates → address
var reverse = await geocoding.GetAsync(new Coordinate(50.8467, 4.3525));
if (!reverse.IsError(out var addresses))
    Console.WriteLine(addresses.First().FormattedAddress);

Route calculator

Build and edit multi-stop routes directly on the map, with undo history and a pluggable renderer.

Provider capabilities

Ask GetProvidersByCapability(Directions) which providers can do the job, or check one with SupportsElevation().

Your keys, your accounts

Services call the provider directly with your own API key. Nothing is proxied through TMS.

Providers

Use the provider you want, and change it later.

Start with keyless Leaflet or OpenLayers maps, then switch to a commercial provider when you need its data or terms. The table shows what each provider supports in this beta.

Provider Map control Geocoding Directions Places Elevation Static maps Location API key
Maps and services
Google Maps1111111Required
Azure Maps111111Required
HERE11111Required
Apple MapKit1Token
Leaflet1Not needed
OpenLayers1Not needed
Services only
Mapbox11Required
TomTom111Required
Geoapify111Required
OpenRouteService1Required
ipstack1Required

Leaflet and OpenLayers load OpenStreetMap tiles by default, subject to the OSM tile usage policy. Provider API keys come from your own account with that provider and are billed by them. The privacy & network guide lists every host each provider loads from.

Free open beta key

Get your free beta key.

One key works with all four beta packages, the map controls and every service. It's checked offline, so there's no activation step and no license server.

  1. 1
    Fill in the form

    It takes less than a minute.

  2. 2
    Check your inbox

    Your key arrives by email within a few minutes.

  3. 3
    Paste the key into your app

    Pass it to TMSLicensing.RegisterLicense at startup and the map is ready.

We only use your details to send your key. See our privacy policy.

Get started

A map on screen in four steps.

The open beta is on nuget.org. You don't need a private feed, a nuget.config or a token.

  1. 1

    Get a free beta license key

    The key is a single string. Keep it out of source control, for example in user secrets or an environment variable.

  2. 2

    Install the package for your framework

    Install one package per project. Each one already includes the map control and every service.

    > dotnet add package TMS.Maps.Wpf.Trial --prerelease
  3. 3

    Register the key once at startup

    Do this before creating any map control or service, in App.xaml.cs, Program.cs or MauiProgram.cs. The key is checked offline.

    using TMS.Maps.Core.Licensing;
    
    TMSLicensing.RegisterLicense("YOUR-BETA-LICENSE-KEY");
  4. 4

    Add the map control

    Put a MapControl in your window, form, page or component (see the examples above). With Provider="Leaflet" it runs with no provider key.

FAQ

Questions, answered.

Is the beta free?

Yes. Request a free beta license key and install the .Trial package for your framework. The beta is for evaluation only, not for production use.

Do I need an API key from a map provider?

Not for Leaflet or OpenLayers, which use OpenStreetMap tiles by default. Google Maps, Azure Maps, HERE, Apple MapKit and the service-only providers need your own key from that provider, and they bill you directly.

Does the SDK send data to TMS?

No. The license key is checked locally against a public key in the assembly. The SDK sends no license data, machine data or telemetry. The map only talks to the provider you chose. See the privacy & network guide.

Which platforms are supported?

WinForms, WPF, .NET MAUI (Android, iOS, Mac Catalyst and Windows) and Blazor (Server and WebAssembly), all on .NET 10.

Can I install more than one TMS.Maps package?

Install one .Trial package per project. Each one already includes the map control and all services. Combining packages causes duplicate type conflicts.

What does the beta look like in my app?

With a valid key the map works normally. A small "TMS .NET Maps BETA — expires date" strip along the bottom links to the docs and the feedback forum, and the first map in each app run shows a one-time welcome notice.

What happens when the beta expires?

The map shows a "Map unavailable" panel and service calls throw TMSLicensingException. Update to the latest beta package and key to keep evaluating. TMSLicensing.Status tells you the expiry date in advance.

Where do I report a bug or ask for a feature?

On the TMS.NET Maps forum, or by email to info@tmssoftware.com. See what to include.

Add a map to your .NET app today.

Get a free beta key, install one package, and your map is running.

TMS ALL-ACCESS

key
Your unlimited access to all TMS products
local_offer
One money and time saving bundle