Dynamiczne kafelki wektorowe z PostGIS.

Wklej URL bazy danych i dostań URL dynamicznych kafelków wektorowych, który aktualizuje się kilka sekund po zmianie wiersza. Potem zamień te same poligony w geofence, które powiedzą Ci, kiedy ktoś dotarł na miejsce.

Darmowy sandbox, bez karty. Działa z RDS, Cloud SQL, Supabase, Neon, Crunchy Bridge lub Twoim własnym serwerem.

14/8235/5419 i 14/8236/5419 przerenderowane w 0,9 s. Pozostałe 22 kafelki się nie zmieniły.

Od connection stringa do mapy w trzech krokach

  1. Wklej URL bazy danych

    Sprawdzamy połączenie, wersję PostGIS i uprawnienia, a także informujemy, jeśli URL prowadzi przez pooler, który nie przeniesie aktualizacji na żywo.

  2. Wybierz tabele i kolumny

    Każda tabela z kolumną geometrii jest wyświetlana z SRID, szacowaną liczbą wierszy i kolumnami. Wybierz właściwości, które mają trafić do kafelków, oraz zakres zoomu.

  3. Wklej URL kafelków do mapy

    Dostajesz URL TileJSON i szablon z/x/y z kluczem publicznym, ograniczony do dozwolonych przez Ciebie originów. Działa wszędzie tam, gdzie działają kafelki wektorowe.

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 },
    }],
  },
});

Zmiany trafiają na mapę bez przebudowy

MapSocket nasłuchuje Twojej bazy przez Postgres LISTEN/NOTIFY. Gdy wiersz się zmienia, przepisywane są tylko kafelki, które zawierały jego stary lub nowy kształt. Edycja tysiąca wierszy renderuje każdy dotknięty kafelek tylko raz.

  1. Wiersz zatwierdzony

    INSERT, UPDATE lub DELETE w opublikowanej tabeli

  2. Trigger wysyła NOTIFY

    Warstwa, id wiersza, operacja i stare granice

  3. Grupowanie

    Serie zmian są debounce'owane i deduplikowane per kafelek

  4. Kafelki przekodowane

    Tylko kafelki dotykające starej lub nowej geometrii, na każdym zoomie

  5. Mapa się odświeża

    update_complete przychodzi przez SSE; webhooki też są wysyłane

Dwa sposoby na aktualność

Na żywo
Dashboard generuje trigger dla każdej tabeli, z Twoimi prawdziwymi kolumnami id i geometrii. Uruchamiasz go raz; aktualizacje docierają w ciągu jednej do trzech sekund. Wymaga bezpośredniego połączenia, nie transaction poolera.
Snapshot
Dla ról tylko do odczytu, URL-i przez pooler lub baz, do których nie możesz dodać triggerów. Przebudowujemy według harmonogramu, od co 5 minut do raz w tygodniu. Przełącz się na tryb na żywo, kiedy tylko zechcesz.
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 na tych samych danych

Wyślij lokalizację i dostań listę geofence'ów, w których się znajduje, oraz to, co zmieniło się od poprzedniej. Zdarzenia wejścia, wyjścia i przebywania, wizyty w miejscach, zmiany kraju i regionu oraz przyjazdy w ramach przejazdów trafiają do Twoich webhooków, podpisane, żebyś mógł im ufać.

Skąd biorą się geofence

  • Synchronizowane z tabeli PostGIS. Wskaż public.delivery_zones, wybierz kolumny id i tagu, a poligony pozostaną zgodne z tabelą. Punkty i linie można zbuforować do stref.
  • Narysowane w dashboardzie. Okręgi i poligony na mapie, z czasem przebywania ustawianym dla każdego geofence'a.
  • Utworzone przez API. Upsert po tag i externalId albo import GeoJSON lub CSV w formacie Radar.
POST /v1/track
Lokalizacja na wejściu, zdarzenia geofence na wyjściu
GET /v1/context
Które geofence zawierają punkt, bez przechowywania stanu
GET /v1/search/geofences
Najbliższe geofence według odległości i tagu
POST /v1/trips
ETA, zbliżanie się i przyjazd dla dostaw i odbiorów

Każdy track podaje też miejsce (z OpenStreetMap), kraj i region oraz sprawdza oszustwa: niemożliwe skoki i podrobione lokalizacje. Kluczami publicznymi możesz śledzić z przeglądarek i telefonów; klucze tajne służą do zarządzania geofence'ami i odczytu zdarzeń. Odczyty o niskiej dokładności są zapisywane, ale nie wywołują zdarzeń.

Żądanie
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}'
Odpowiedź
{
  "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"
  }]
}

Każde zdarzenie jest też wysyłane do Twoich webhooków z nagłówkiem MapSocket-Signature (HMAC-SHA256). Weryfikacja podpisu

Porównanie

Jeśli potrzebujesz kafelków generowanych na każde żądanie z parametryzowanych funkcji SQL, lepiej sprawdzi się pg_tileserv lub Martin. MapSocket jest dla tabel, które zmieniają się w ciągu dnia, i map, które mają nadążać.

Podejście Jak powstają kafelki Gdy wiersz się zmienia Czym zarządzasz
pg_tileserv Zapytanie SQL na każde żądanie kafelka, w locie Widoczne przy następnym żądaniu, ale każde żądanie obciąża Twoją bazę Serwer obok Twojej bazy
Martin W locie z PostGIS albo z plików MBTiles i PMTiles Na żywo w trybie dynamicznym, kosztem zapytań; pliki wymagają przebudowy Serwer plus Twój własny cache przed nim
Tippecanoe uruchamiany z crona Pełna przebudowa do MBTiles lub PMTiles Czekasz na następne uruchomienie, które przebudowuje wszystko Scheduler, storage i CDN
MapSocket Gotowe MBTiles serwowane z cache Przerenderowują się tylko dotknięte kafelki, w kilka sekund Nic. Wklej URL.

Twoja baza, Twoje zasady

Przekazujesz nam connection string, więc oto dokładnie, co z nim robimy.

Jakiego dostępu do mojej bazy potrzebuje MapSocket?

Roli, która może wykonywać SELECT na publikowanych tabelach. Zalecamy osobną rolę tylko do odczytu; dashboard poda Ci dokładne polecenia CREATE ROLE i GRANT. Do aktualizacji na żywo Ty (nie my) uruchamiasz na każdej tabeli małą funkcję triggera, co jednorazowo wymaga uprawnień właściciela tabeli.

Jak przechowywany jest mój connection string?

Jest szyfrowany AES-256-GCM, zanim trafi do naszej bazy, a klucz jest przechowywany poza nią. Odszyfrowujemy go tylko wewnątrz workera, który buduje Twoje kafelki, i nigdy więcej nie jest pokazywany w dashboardzie ani w API, tylko host, baza i użytkownik.

Czy mogę dodać Wasze IP do allowlisty?

Tak. Wszystkie połączenia z Twoją bazą pochodzą ze stałej puli adresów IP wyjściowych dla każdego regionu, wymienionych w dashboardzie przy każdym połączeniu. Dodaj je do security group lub pg_hba.conf i nic więcej nie musi być otwarte.

Czy połączenie jest szyfrowane?

Domyślnie łączymy się z sslmode=require i odrzucamy połączenia niezaszyfrowane, chyba że wyraźnie to wyłączysz dla sieci prywatnej.

Czy kopiujecie moje tabele?

Nie. Wiersze są odczytywane i kodowane bezpośrednio do kafelków wektorowych; archiwum kafelków (MBTiles) to jedyna kopia, jaką przechowujemy. Usuń źródło, a jego kafelki zostaną usunięte razem z nim. Geofence synchronizowane z tabeli są przechowywane jako geometrie plus wybrane przez Ciebie kolumny.

Czy mogę zabezpieczyć konto uwierzytelnianiem dwuskładnikowym?

Tak. Włącz je w Ustawieniach i bezpieczeństwie: zeskanuj kod QR dowolną aplikacją uwierzytelniającą (Google Authenticator, 1Password, Authy, Microsoft Authenticator), a logowanie będzie wymagać oprócz hasła także 6-cyfrowego kodu. Dostajesz dziesięć jednorazowych kodów odzyskiwania na wypadek utraty telefonu.

Cennik

Płacisz za uruchomione źródła i obsłużone żądania. Twoja baza pozostaje Twoja; nigdy nie naliczamy opłat za wiersze.

Sandbox

Wypróbuj na projekcie pobocznym

$0 / miesiąc

  • 1 baza danych, 1 źródło kafelków
  • Przebudowa co 24 godziny
  • 50 tys. żądań kafelków / miesiąc
  • 100 geofence'ów, 100 śledzonych użytkowników
Zacznij za darmo

Starter

Dla produktu, w którym jest mapa

$29 / miesiąc

  • Aktualizacje na żywo przez LISTEN/NOTIFY
  • 5 źródeł kafelków, 2 bazy danych
  • 1 mln żądań kafelków / miesiąc
  • 5 000 geofence'ów, 5 000 śledzonych użytkowników
  • Webhooki
  • Pobieranie MBTiles
Wybierz Starter

Pro

Dla zespołów, których dane zmieniają się przez cały dzień

$149 / miesiąc

  • Wszystko z planu Starter
  • 25 źródeł, 10 baz danych
  • 10 mln żądań kafelków / miesiąc
  • Geofence synchronizowane z PostGIS
  • Własna domena kafelków
  • Eksport PMTiles do hostingu statycznego
Wybierz Pro

Enterprise

Dedykowane workery, w Twojej chmurze lub naszej

Porozmawiajmy

  • Dedykowane workery tilefeed
  • VPC peering / PrivateLink
  • SSO i dziennik audytu
  • SLA z dostępnością 99,95%
Skontaktuj się
Porównanie limitów planów
Limit SandboxStarterProEnterprise
Źródła kafelków 1525Bez limitu
Bazy danych 1210Bez limitu
Żądania kafelków 50k / mies.1M / mies.10M / mies.Indywidualnie
Geofence 1005000100 000Bez limitu
Śledzeni użytkownicy 100 / mies.5k / mies.50k / mies.Indywidualnie
Mapy georeferencjonowane 110100Indywidualnie
Aktualizacje Przebudowa co 24 godzinyNa żywo, kilka sekund po zapisieNa żywo, kilka sekund po zapisieNa żywo, kilka sekund po zapisie
Własna domena kafelków NieNieTakTak

Jeśli na płatnym planie przekroczysz limit kafelków, kafelki nadal będą serwowane; napiszemy do Ciebie, zanim cokolwiek się zmieni. Sandbox wstrzymuje się po osiągnięciu limitu.

Pytania

Czy działa z Supabase, Neon, RDS lub Cloud SQL?

Tak, z jednym zastrzeżeniem: aktualizacje na żywo korzystają z Postgres LISTEN, które nie działa przez poolery w trybie transakcyjnym. Użyj bezpośredniego connection stringa (port 5432 w Supabase, host bez poolera w Neon). Jeśli możesz użyć tylko URL-a przez pooler, wybierz tryb snapshot, a będziemy przebudowywać według harmonogramu.

Jak szybkie są aktualizacje na żywo?

Zwykle od jednej do trzech sekund od COMMIT do świeżego kafelka. Powiadomienia są grupowane w małe paczki, więc masowa edycja 10 000 wierszy renderuje każdy dotknięty kafelek raz, a nie 10 000 razy.

Które biblioteki map mogą korzystać z kafelków?

Wszystko, co czyta Mapbox Vector Tiles i TileJSON: MapLibre GL, Mapbox GL, OpenLayers, Leaflet z wtyczką vector-tile, deck.gl, QGIS.

Czy mogę odejść i uruchamiać to sam?

Tak. MapSocket działa na tilefeed, który jest na licencji MIT. Każde źródło ma przycisk Export config, który daje Ci plik TOML dla tilefeed, a MBTiles lub archiwum PMTiles możesz pobrać w dowolnym momencie.

Kto liczy się jako śledzony użytkownik?

Unikalny userId, który w danym miesiącu wysłał co najmniej jedno wywołanie /v1/track. Wywołania /v1/context i wyszukiwanie geofence'ów się nie liczą.

Podłącz tabelę, którą już masz.

Większość osób ma działający URL kafelków na żywo w ciągu pięciu minut od rejestracji.