Skip to main content

Geo Tile Server

The Geo Tile Server (xylem-geo) is a custom Express application that serves raster and vector map tiles for the frontend. It maintains a SQLite database of layer metadata and serves tile files from the local filesystem.

Architecture

┌──────────────────────────────────────────────┐
│ Geo Tile Server │
│ (Express :4830) │
│ │
│ ┌──────────────────────────────────────┐ │
│ │ Routes │ │
│ │ /raster/:layer/:z/:x/:y.png │ │ ← Raster tiles
│ │ /tiles/:layer.pmtiles │ │ ← Vector tiles
│ │ /layers │ │ ← Public layer list
│ │ /admin/layers (CRUD) │ │ ← Admin management
│ └──────────────────────────────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────────────┐ │
│ │ layers.db │ │ Tile Storage │ │
│ │ (SQLite) │ │ raster-tiles/ │ │
│ │ │ │ vector-tiles/ │ │
│ └──────────────┘ └──────────────────────┘ │
└──────────────────────────────────────────────┘

Routes

Public Routes

MethodPathDescription
GET/raster/:layer/:z/:x/:y.pngServe a raster tile
GET/tiles/:layer.pmtilesServe a PMTiles vector tile archive
GET/layersList all enabled layers (public API)

Admin Routes

MethodPathDescription
GET/admin/layersList all layers (including disabled)
POST/admin/layersCreate a new layer
PUT/admin/layers/:idUpdate a layer
DELETE/admin/layers/:idDelete a layer
POST/admin/uploadUpload tile files

Tile Formats

Raster Tiles

  • Standard slippy map tile format: /{z}/{x}/{y}.png
  • Pre-rendered PNG images stored in directory structure
  • Used for satellite imagery, zoning maps, elevation data

Vector Tiles (PMTiles)

  • PMTiles format — single-file tile archives (Protomaps)
  • Contains Mapbox Vector Tiles (MVT) for all zoom levels
  • Efficient range-request access for individual tiles
  • Used for boundary polygons, road networks, building footprints

Layer Database

The SQLite database (layers.db) stores layer metadata:

ColumnTypeDescription
idINTEGERAuto-incrementing primary key
nameTEXTDisplay name
typeTEXTraster or vector
categoryTEXTLayer category for grouping
tileUrlTEXTTile endpoint path
enabledBOOLEANActive/visible flag
isBaseLayerBOOLEANBase map layer flag
sortOrderINTEGERDisplay ordering
boundsJSONGeographic bounding box
minZoomINTEGERMinimum visibility zoom
maxZoomINTEGERMaximum visibility zoom

Configuration

VariableDefaultDescription
PORT4830Server port
BASE_URLhttps://geo.xylem.cityPublic base URL

File Structure

xylem-geo/
├── src/
│ ├── server.ts # Express app setup, CORS, static serving
│ ├── config.ts # Environment configuration
│ ├── db/ # SQLite connection and queries
│ ├── routes/
│ │ ├── tiles.ts # Raster tile serving route
│ │ ├── raster.ts # Alternative raster route
│ │ ├── layers.ts # Public layer listing
│ │ └── admin.ts # Admin CRUD operations
│ ├── services/ # Business logic
│ └── types/ # TypeScript type definitions
├── raster-tiles/ # Raster tile PNG directories
├── vector-tiles/ # PMTiles files
└── layers.db # SQLite metadata database

Development

# Install dependencies
npm install

# Compile TypeScript
npx tsc

# Start server
node dist/server.js
# Or via PM2:
pm2 restart xylem-geo