Yashveer Singh
Connect
<- All posts
Backend, APIs, and System Design11 min read

Geospatial Data Done Right: PostGIS and Beyond

PostGIS is the Postgres extension that adds geometric and geographic types, spatial indexes, and spatial functions. The extension turns Postgres into a real geospatial database. The setup is one command. The performance is excellent on the queries most products need. Distance, contains, nearest, and routing all work. Most products that need location queries should use PostGIS rather than a specialized store.

Written by Yashveer Singh, founder of Yashveer Labs.

What you actually need to know

  • PostGIS turns Postgres into a real geospatial database.
  • Geography for spherical accuracy. Geometry for planar speed.
  • KNN operator with GiST index for nearest neighbor.
  • ST_DWithin for radius queries.
  • pgRouting for graph algorithms when needed.
CapabilityFunction
Nearest itemsKNN with <-> operator
Within radiusST_DWithin
ContainsST_Contains
DistanceST_Distance
IntersectsST_Intersects
Vector tilesST_AsMVT
RoutingpgRouting extension
Area calculationST_Area

The core argument

PostGIS is the kind of extension that founders do not know about until they need spatial queries. The default response when a product needs location features is to reach for a specialized service or store. The right response in most cases is to add PostGIS to the Postgres that is already there.

The setup is one command. CREATE EXTENSION postgis. The database now has geometric types, spatial indexes, and hundreds of spatial functions. The capability is comparable to dedicated spatial databases for most product workloads.

The discipline is in picking the right type and the right index. Geography for long distances where accuracy matters. Geometry for planar approximations where speed matters. The GiST index supports both spatial filtering and nearest neighbor queries. The right index makes the difference between sub millisecond and seconds long queries.

The patterns that fit most products are simple. Nearest items via the KNN operator. Within radius via ST_DWithin. Intersection and containment for region based queries. Each is a few lines of SQL. The performance is good into millions of rows for most workloads.

The temptation to reach for specialized services is real. Mapbox, Google Maps, and similar have excellent capabilities. For the operations that PostGIS handles natively, the local query is often faster and cheaper than the API call. The specialized services are right for tile serving and routing at scale. PostGIS is right for most application level spatial logic.

The patterns that work

Use caseQuery pattern
Find five nearest storesORDER BY location <-> point LIMIT 5 with KNN
Stores within 5 kmST_DWithin(location, point, 5000) with geography
Drivers within delivery zoneST_Contains(zone, driver_location)
Total area coveredSUM(ST_Area(coverage_polygon))
Distance between two pointsST_Distance with geography for accuracy
Generate vector tilesST_AsMVT for Mapbox compatible tiles
Cluster nearby pointsST_ClusterDBSCAN for density clustering

How much does this cost

The cost of PostGIS is zero. The extension is included with most managed Postgres providers. The cost is engineering time to learn the patterns. A senior engineer can be productive with PostGIS in a few days. The investment is small. The savings versus a specialized service is meaningful at scale.

Features the spatial setup must have

  • PostGIS extension enabled.
  • GiST indexes on spatial columns.
  • Correct type (geometry or geography) for the use case.
  • Stored as the right SRID. 4326 is standard for lat lon.
  • Validation that input coordinates are correct.
  • A query plan check to confirm the index is used.
  • Backup includes spatial data.
  • A path to specialized services if you outgrow PostGIS.

Expert opinion

PostGIS is the kind of capability that most teams underestimate. The setup is one command. The patterns are mechanical. The performance is excellent. The teams that adopt PostGIS handle their spatial needs without adding new services. The teams that reach for Mapbox APIs for every operation pay for capability the local query would have delivered for free.

>

Yashveer Singh, founder of Yashveer Labs

How this played out on a real project

A client building a marketplace app needed to find nearby providers for a customer search. The team's first instinct was to use the Google Places API. The cost projection at scale was meaningful.

We added PostGIS instead. Storing the provider locations as geography. Indexing with GiST. The query for nearest providers was a single SQL statement with the KNN operator. The performance was sub ten milliseconds at the scale the team was projecting.

The team kept Google for map display and routing. The application level spatial queries ran in Postgres. The cost difference was meaningful. The capability was equivalent for the operations that mattered.

For more on the related work, see PostgreSQL performance at scale the tweaks that move the needle and database indexes a practical primer for SaaS engineers.

Common mistakes teams make

  1. Using lat lon as separate columns instead of a spatial type.
  2. No GiST index on spatial columns.
  3. Wrong type (geometry vs geography).
  4. Wrong SRID.
  5. Calling external APIs for operations PostGIS handles natively.
  6. No query plan check.
  7. Treating PostGIS as exotic when it is mature.
  8. No backup verification for spatial data.

A one week adoption plan

  1. Day one. Enable PostGIS. Convert the spatial columns.
  2. Day two. Create GiST indexes. Verify with EXPLAIN.
  3. Days three to five. Migrate the application code to use PostGIS functions.
  4. Days six and seven. Measure performance. Document the patterns.

For more on the related work, read PostgreSQL performance at scale the tweaks that move the needle and database indexes a practical primer for SaaS engineers. On the broader Postgres side, full text search in PostgreSQL practical patterns is the natural next read.

FAQ

Frequently asked

Author

Why Yashveer Singh is the call for this work

I have spent the last four years writing software that runs in production. Three live client sites. A Roblox game with real players. Nexli, a school management system about to launch into private testing. Nyxera, a fully local AI assistant. Most people writing about this topic are summarizing other people's blog posts. I am writing from the codebase. If you want this kind of work done right, I am the person you call. Yashveer Singh, founder of Yashveer Labs.

Related reading