Learn PolyMapper
Everything you need to know to capture precise polygons, organise layers, and export production-ready GeoJSON files.
- Create an account, confirm your email, then review Premium checkout. Eligible new subscribers can start a 7-day trial with a payment method.
- Visit the map workspace and create your first layer from the sidebar.
- Click the map to add polygon vertices, then press Enter to finish.
- Name the polygon, review the summary in the layer panel, and save.
- Use the export menu to generate GeoJSON when your layer is ready.
Guides & Tutorials
Getting started with PolyMapper
PolyMapper pairs a Supabase back end with a high-performance Mapbox canvas. After signing in, your workspace opens with a blank layer list and map focused on your last known position. Use the layer manager to add a new layer, then give it a descriptive name so you can find it quickly.
Drawing and editing polygons
Choose Create polygon in the toolbar or press C. In Freehand mode, click to add vertices, then press Enter to complete the polygon. To edit an existing polygon, select it, move its vertex handles, and choose Save changes. Cancel discards the current edit.
- Click an edge midpoint to add a vertex.
- Right-click a vertex, or focus its handle and press Delete, to remove it. A polygon needs at least three vertices.
- Use the polygon name field while editing. Imported properties are preserved; there is no general properties editor.
✅ No self-intersections or overlapping edges.
✅ Polygon named clearly (e.g. “District 3 – draft”).
✅ Imported properties checked in the source GeoJSON.
Keyboard shortcuts at a glance
Shortcuts are inactive while you type in a form. Undo/redo currently covers polygon creation in this session, not edits, deletion, split, or merge. Keep an export before making large changes.
C
Enter create polygon mode
⌘ / Ctrl + Z
Undo polygon creation in this session
⌘ / Ctrl + Y
Redo polygon creation in this session
⌘ / Ctrl + S
Save the active polygon
Delete
Remove the selected polygon
Esc
Cancel drawing or close the active dialog
Importing and exporting data
PolyMapper accepts valid GeoJSON Polygon and MultiPolygon features. Use the import dialog in the layer panel to upload files, then review the preview table before committing changes. Exports respect your current layer selection and include polygon metadata.
- Open the layer actions menu and choose Import GeoJSON.
- Drag in a file or paste raw JSON; validation highlights geometry issues instantly.
- Confirm mappings, then click Import to create polygons in the active layer.
- When finished, click Export to download a GeoJSON bundle with metadata.
/api/layers/[layerId]/geojson with an authenticated request to fetch the same export payload programmatically.API Usage
Premium users can create API keys in Account → API Keys. Send your key using the Authorization: Bearer header to call versioned endpoints under /api/v1.
GET https://www.polymapper.com/api/v1/polygons Authorization: Bearer pmk_live_<prefix>_<secret>
limit— max rows (default 500, max 5000)offset— zero-based offset for paginationincludeCount— includetotalandnext_offsetwhen trueincludeGeometry— include heavy geometry column when true (default false)
GET https://www.polymapper.com/api/v1/polygons?limit=1000&offset=0&includeCount=true Authorization: Bearer pmk_live_<prefix>_<secret>
GET https://www.polymapper.com/api/v1/polygons?limit=1000&offset=1000 Authorization: Bearer pmk_live_<prefix>_<secret>
GET https://www.polymapper.com/api/v1/polygons?limit=500&includeGeometry=true Authorization: Bearer pmk_live_<prefix>_<secret>
{
"polygons": [
{
"id": "69541fc9-3df1-4b71-b338-678e923e240f",
"layer_id": "d896f16d-d3ac-4816-92e6-803b02239be8",
"layer_name": "Lake Example",
"name": "Albania",
"polygon_name": "Albania",
"properties": { "source": "geoBoundaries", "iso3": "ALB", "level": 0 },
"geometry": {
"type": "Polygon",
"coordinates": [
[ [20.12345, 41.23456], [20.23456, 41.23489], [20.34567, 41.14567], [20.12345, 41.23456] ]
]
},
"created_at": "2025-10-24T10:02:41.586438+00:00",
"updated_at": "2025-10-24T10:02:41.586438+00:00"
}
],
"limit": 1,
"offset": 0,
"has_more": true,
"total": 1,
"next_offset": null
}layer_name: the human-readable name of the layer the polygon belongs to.name/polygon_name: optional per‑polygon label (auto‑filled on boundary imports; editable in the UI).geometry: GeoJSON geometry object, included only whenincludeGeometry=true.properties: free‑form JSON metadata (e.g., source, boundary_id, iso3, level).
const BASE = 'https://www.polymapper.com'
const KEY = 'pmk_live_<prefix>_<secret>'
async function fetchAll(limit = 1000) {
let offset = 0
const all = []
while (true) {
const url = BASE + '/api/v1/polygons?limit=' + limit + '&offset=' + offset
const res = await fetch(url, { headers: { Authorization: 'Bearer ' + KEY } })
if (!res.ok) throw new Error('Request failed: ' + res.status)
const json = await res.json()
all.push(...json.polygons)
if (!json.has_more) break
offset += json.polygons.length
}
return all
}const BASE = 'https://www.polymapper.com'
const KEY = 'pmk_live_<prefix>_<secret>'
async function fetchAll(limit = 1000) {
let offset = 0
const all = []
while (true) {
const url = BASE + '/api/v1/polygons?limit=' + limit + '&offset=' + offset
const res = await fetch(url, { headers: { Authorization: 'Bearer ' + KEY } })
const json = await res.json()
all.push(...json.polygons)
if (!json.has_more) break
offset += json.polygons.length
}
return all
}?includeGeometry=true and a smallerlimit like 500. Prefer paging over single large responses.- Keys are shown once; rotate by creating a new key and revoking the old.
- On downgrade to Free, all keys are revoked automatically.
- Prefer server-to-server calls. Browser calls require CORS and careful secret handling.