Dynamische vectortegels uit PostGIS.

Plak een database-URL en krijg een dynamische vectortegel-URL die seconden na een rijwijziging bijwerkt. Maak van dezelfde polygonen daarna geofences die je laten weten wanneer mensen aankomen.

Gratis sandbox, geen creditcard nodig. Werkt met RDS, Cloud SQL, Supabase, Neon, Crunchy Bridge of je eigen server.

14/8235/5419 en 14/8236/5419 opnieuw gerenderd in 0,9 s. De andere 22 tegels bleven ongewijzigd.

Van connectiestring naar kaart in drie stappen

  1. Plak je database-URL

    We controleren de verbinding, de PostGIS-versie en de rechten, en waarschuwen je als de URL via een pooler loopt die geen live updates kan doorgeven.

  2. Kies tabellen en kolommen

    Elke tabel met een geometriekolom wordt getoond met SRID, geschat aantal rijen en kolommen. Kies welke eigenschappen in de tegels komen en het zoombereik.

  3. Plak de tegel-URL in je kaart

    Je krijgt een TileJSON-URL en een z/x/y-template met een publishable key, beperkt tot de origins die jij toestaat. Werkt overal waar vectortegels werken.

map.js
import maplibregl from "maplibre-gl";

const map = new maplibregl.Map({
  container: "map",
  style: {
    version: 8,
    sources: {
      parcels: {
        type: "vector",
        url: "https://tiles.mapsocket.com/t/acme/parcels.json?key=pk_live_…",
      },
    },
    layers: [{
      id: "parcels",
      type: "fill",
      source: "parcels",
      "source-layer": "parcels",
      paint: { "fill-color": "#2D6E9E", "fill-opacity": 0.3 },
    }],
  },
});

Wijzigingen bereiken de kaart zonder rebuild

MapSocket luistert naar je database met Postgres LISTEN/NOTIFY. Verandert er een rij, dan worden alleen de tegels herschreven waarin de oude of nieuwe vorm lag. Een bewerking van duizend rijen rendert elke geraakte tegel één keer opnieuw.

  1. Rij gecommit

    INSERT, UPDATE of DELETE op een gepubliceerde tabel

  2. Trigger stuurt NOTIFY

    Laag, rij-id, operatie en de oude begrenzing

  3. Gebundeld

    Pieken worden per tegel gedebounced en ontdubbeld

  4. Tegels opnieuw gecodeerd

    Alleen tegels die de oude of nieuwe geometrie raken, op elk zoomniveau

  5. Je kaart ververst

    update_complete komt binnen via SSE; webhooks worden ook verstuurd

Twee manieren om actueel te blijven

Live
Het dashboard genereert per tabel een trigger, met je echte id- en geometriekolommen. Je voert die één keer uit; updates komen binnen in één tot drie seconden. Vereist een directe verbinding, geen transaction pooler.
Snapshot
Voor read-only rollen, gepoolde URL's of databases waar je geen triggers aan kunt toevoegen. We bouwen opnieuw volgens schema, van elke 5 minuten tot één keer per week. Stap over op live zodra je zover bent.
trigger.sql
-- Generated for public.parcels; run once as the table owner
CREATE TRIGGER mapsocket_parcels
  AFTER INSERT OR UPDATE OR DELETE ON public.parcels
  FOR EACH ROW EXECUTE FUNCTION
    mapsocket_notify_tile_update('parcels', 'id', 'geom');
live-refresh.js
const tiles = "https://tiles.mapsocket.com/t/acme/parcels/{z}/{x}/{y}.pbf?key=pk_live_…";
const events = new EventSource("https://tiles.mapsocket.com/t/acme/parcels/events?key=pk_live_…");

// Sent after tilefeed rewrites the affected tiles
events.addEventListener("update_complete", (e) => {
  const { tiles_updated, affected_zooms } = JSON.parse(e.data);
  map.getSource("parcels").setTiles([`${tiles}&_t=${Date.now()}`]);
});

Geofencing op dezelfde data

Stuur een locatie en krijg terug in welke geofences die ligt en wat er sinds de vorige is veranderd. Enter-, exit- en dwell-events, plaatsbezoeken, land- en provinciewissels en aankomsten van ritten gaan naar je webhooks, ondertekend zodat je ze kunt vertrouwen.

Waar geofences vandaan komen

  • Gesynchroniseerd uit een PostGIS-tabel. Wijs naar public.delivery_zones, kies de id- en tagkolommen, en de polygonen blijven gelijk met de tabel. Punten en lijnen kunnen met een buffer tot zones worden gemaakt.
  • Getekend in het dashboard. Cirkels en polygonen op de kaart, met een dwell-tijd per geofence.
  • Aangemaakt via de API. Upsert op tag en externalId, of importeer GeoJSON of een CSV in Radar-formaat.
POST /v1/track
Locatie erin, geofence-events eruit
GET /v1/context
Welke geofences een punt bevatten, zonder opgeslagen state
GET /v1/search/geofences
Dichtstbijzijnde geofences op afstand en tag
POST /v1/trips
ETA's, nadering en aankomst voor leveringen en ophaalmomenten

Elke track benoemt ook de plaats (uit OpenStreetMap), het land en de provincie, en controleert op fraude zoals onmogelijke sprongen en nagebootste locaties. Met publishable keys kun je tracken vanuit browsers en telefoons; met secret keys beheer je geofences en lees je events. Onnauwkeurige fixes worden opgeslagen maar triggeren geen events.

Request
curl https://api.mapsocket.com/v1/track \
  -H "Authorization: pk_live_…" \
  -H "Content-Type: application/json" \
  -d '{"userId":"driver-118","latitude":40.7411,"longitude":-73.9897,"accuracy":12}'
Response
{
  "user": {
    "userId": "driver-118",
    "geofenceIds": ["9c1e5a40-…"],
    "lastSeenAt": "2026-11-04T14:02:11Z"
  },
  "events": [{
    "type": "user.entered_geofence",
    "userId": "driver-118",
    "geofence": {
      "tag": "loading-bay",
      "externalId": "flatiron-02",
      "description": "Flatiron loading bay"
    },
    "confidence": 3,
    "createdAt": "2026-11-04T14:02:11Z"
  }]
}

Elk event gaat ook naar je webhooks met een MapSocket-Signature-header (HMAC-SHA256). Een handtekening verifiëren

Hoe het zich verhoudt

Heb je tegels nodig die per request worden gegenereerd uit geparametriseerde SQL-functies, dan passen pg_tileserv of Martin beter. MapSocket is voor tabellen die gedurende de dag veranderen en kaarten die moeten bijblijven.

Aanpak Hoe tegels worden gemaakt Als een rij verandert Wat je zelf beheert
pg_tileserv Een SQL-query per tegelrequest, on the fly Zichtbaar bij het volgende request, maar elk request raakt je database Een server naast je database
Martin On the fly uit PostGIS, of uit MBTiles- en PMTiles-bestanden Live als het dynamisch is, tegen querykosten; bestanden moeten opnieuw worden gebouwd Een server, plus je eigen cache ervoor
Tippecanoe via een cronjob Een volledige rebuild naar MBTiles of PMTiles Wachten op de volgende run, die alles opnieuw bouwt Een scheduler, opslag en een CDN
MapSocket Vooraf gebouwde MBTiles, geserveerd vanuit cache Alleen de geraakte tegels renderen opnieuw, binnen seconden Niets. Plak een URL.

Jouw database, jouw regels

Je geeft ons een connectiestring, dus dit is precies wat we ermee doen.

Welke toegang tot mijn database heeft MapSocket nodig?

Een rol die SELECT mag uitvoeren op de tabellen die je publiceert. We raden een aparte read-only rol aan; het dashboard geeft je de exacte CREATE ROLE- en GRANT-statements. Voor live updates voer jij (niet wij) per tabel een kleine triggerfunctie uit, waarvoor je één keer tabeleigenaarsrechten nodig hebt.

Hoe wordt mijn connectiestring opgeslagen?

Versleuteld met AES-256-GCM voordat hij onze database raakt, met de sleutel daarbuiten bewaard. Hij wordt alleen ontsleuteld in de worker die je tegels bouwt, en wordt nooit meer getoond in het dashboard of de API, alleen host, database en gebruiker.

Kan ik jullie IP's op een allowlist zetten?

Ja. Alle verbindingen met je database komen van een vaste set egress-IP's per regio, die in het dashboard naast elke verbinding staan. Voeg ze toe aan je security group of pg_hba.conf en verder hoeft er niets open te staan.

Is de verbinding versleuteld?

We verbinden standaard met sslmode=require en weigeren onversleutelde verbindingen, tenzij je dat expliciet uitzet voor een privénetwerk.

Kopiëren jullie mijn tabellen?

Nee. Rijen worden gelezen en direct gecodeerd tot vectortegels; het tegelarchief (MBTiles) is de enige kopie die we bewaren. Verwijder je een bron, dan worden de tegels mee verwijderd. Geofences die je uit een tabel synchroniseert worden opgeslagen als geometrieën plus de kolommen die je kiest.

Kan ik mijn account beveiligen met tweestapsverificatie?

Ja. Zet het aan onder Instellingen en beveiliging: scan een QR-code met een authenticator-app (Google Authenticator, 1Password, Authy, Microsoft Authenticator) en daarna heb je bij het inloggen naast je wachtwoord ook een 6-cijferige code nodig. Je krijgt tien eenmalige herstelcodes voor het geval je je telefoon kwijtraakt.

Prijzen

Je betaalt voor de bronnen die je draait en de requests die je serveert. Je database blijft van jou; we rekenen nooit per rij.

Sandbox

Probeer het op een zijproject

$0 / maand

  • 1 database, 1 tegelbron
  • Rebuild elke 24 uur
  • 50.000 tegelrequests / maand
  • 100 geofences, 100 gevolgde gebruikers
Gratis starten

Starter

Voor een product met een kaart erin

$29 / maand

  • Live updates via LISTEN/NOTIFY
  • 5 tegelbronnen, 2 databases
  • 1 mln. tegelrequests / maand
  • 5.000 geofences, 5.000 gevolgde gebruikers
  • Webhooks
  • MBTiles-download
Kies Starter

Pro

Voor teams waarvan de data de hele dag beweegt

$149 / maand

  • Alles uit Starter
  • 25 bronnen, 10 databases
  • 10 mln. tegelrequests / maand
  • Geofences gesynchroniseerd uit PostGIS
  • Eigen tegeldomein
  • PMTiles-export voor statische hosting
Kies Pro

Enterprise

Dedicated workers, in jouw cloud of de onze

Neem contact op

  • Dedicated tilefeed-workers
  • VPC-peering / PrivateLink
  • SSO en auditlog
  • 99,95% uptime-SLA
Contact opnemen
Limieten per abonnement vergeleken
Limiet SandboxStarterProEnterprise
Tegelbronnen 1525Onbeperkt
Databases 1210Onbeperkt
Tegelrequests 50k / mnd1M / mnd10M / mndOp maat
Geofences 1005.000100.000Onbeperkt
Gevolgde gebruikers 100 / mnd5k / mnd50k / mndOp maat
Gegeorefereerde kaarten 110100Op maat
Updates Rebuild elke 24 uurLive, seconden na een writeLive, seconden na een writeLive, seconden na een write
Eigen tegeldomein NeeNeeJaJa

Ga je op een betaald abonnement over je tegellimiet, dan blijven de tegels gewoon geserveerd; we mailen je voordat er iets verandert. De Sandbox pauzeert bij de limiet.

Vragen

Werkt het met Supabase, Neon, RDS of Cloud SQL?

Ja, met één kanttekening: live updates gebruiken Postgres LISTEN, en dat werkt niet via poolers in transaction-modus. Gebruik de directe connectiestring (poort 5432 bij Supabase, de niet-gepoolde host bij Neon). Kun je alleen een gepoolde URL gebruiken, kies dan snapshotmodus en we bouwen opnieuw volgens schema.

Hoe snel zijn live updates?

Meestal één tot drie seconden van COMMIT tot een verse tegel. Notificaties worden gedebounced in kleine batches, dus een bulkbewerking van 10.000 rijen rendert elke geraakte tegel één keer opnieuw in plaats van 10.000 keer.

Welke kaartbibliotheken kunnen de tegels gebruiken?

Alles wat Mapbox Vector Tiles en TileJSON leest: MapLibre GL, Mapbox GL, OpenLayers, Leaflet met een vector-tile-plugin, deck.gl, QGIS.

Kan ik vertrekken en het zelf draaien?

Ja. MapSocket draait tilefeed, dat een MIT-licentie heeft. Elke bron heeft een knop Export config die je de tilefeed-TOML geeft, en je kunt de MBTiles of een PMTiles-archief op elk moment downloaden.

Wat telt als gevolgde gebruiker?

Een unieke userId die in de maand minstens één /v1/track-call heeft gedaan. Calls naar /v1/context en geofence-zoekopdrachten tellen niet mee.

Richt het op een tabel die je al hebt.

De meeste mensen hebben binnen vijf minuten na aanmelden een live tegel-URL.