{"slug": "postgis", "name": "PostGIS", "category": "databases", "category_name": "Databases", "description": "", "recommenders": 9, "commenters": 25, "warners": 1, "score": 11.21, "rising": 1.04, "first": "2025-11-13", "latest": "2026-10-01", "why": "PostGIS is also another very useful addition for storing, indexing, and querying geospatial data.", "why_is_quote": true, "has_verdict": false, "sentiment": {"recommend": 9, "neutral": 14, "compare": 1, "warn": 1}, "spark": [0, 1, 1, 1, 1, 0, 1, 0, 1, 3, 0, 0], "listed": true, "loved": [], "caveat": "", "short_quote": "PostGIS is also another very useful addition for storing, indexing, and querying geospatial data.", "kind": "", "icon": true, "domain": "postgis.net", "github_repo": null, "official_url": "https://postgis.net", "pricing": "", "aliases": ["PostGIS"], "verdict": null, "praise": [{"label": "", "summary": "", "quotes": [{"id": 789851874, "item_id": 49365742, "url": "https://news.ycombinator.com/item?id=49365742", "by": "KronisLV", "date": "2026-08-19", "version": null, "stance": "recommend", "quote": "excellent plugins like pgvector and PostGIS", "excerpt": "> PostgreSQL allowed us to use a fulltext search plugin to do everything in one system. No need to sync any data. No need to maintain and run two systems. It just worked and made us smile (after some tweaks of course). Simplicity. I found MariaDB to be wonderfully simple to use for somewhat casual use cases: https://mariadb.com/docs/server/ha-and-performance/optimization-and-tuning/optimization-and-indexes/full-text-", "context": "", "use_case": "", "switched_from": "", "story": "PostgreSQL for Everything"}, {"id": 789800128, "item_id": 49362508, "url": "https://news.ycombinator.com/item?id=49362508", "by": "silvestrov", "date": "2026-08-19", "version": null, "stance": "recommend", "quote": "PostGIS is also another very useful addition for storing, indexing, and querying geospatial data.", "excerpt": "PostGIS is also another very useful addition for storing, indexing, and querying geospatial data. http://www.postgis.net", "context": "", "use_case": "geospatial data in Postgres", "switched_from": "", "story": "PostgreSQL for Everything"}, {"id": 789788560, "item_id": 49361785, "url": "https://news.ycombinator.com/item?id=49361785", "by": "_joel", "date": "2026-08-19", "version": null, "stance": "recommend", "quote": "No mention of https://postgis.net/ - shameful", "excerpt": "No mention of https://postgis.net/ - shameful", "context": "", "use_case": "", "switched_from": "", "story": "PostgreSQL for Everything"}, {"id": 784779456, "item_id": 49048716, "url": "https://news.ycombinator.com/item?id=49048716", "by": "eudamoniac", "date": "2026-07-25", "version": null, "stance": "recommend", "quote": "postgres PostGIS index for location finding scaled well enough for Uber", "excerpt": "Something interesting is that postgres PostGIS index for location finding scaled well enough for Uber. They eventually switched to something else but I don't think it was due to scaling problems.", "context": "", "use_case": "location finding", "switched_from": "", "story": "Postgres LISTEN/NOTIFY actually scales"}, {"id": 768992848, "item_id": 48062053, "url": "https://news.ycombinator.com/item?id=48062053", "by": "michaeljhg", "date": "2026-05-08", "version": null, "stance": "recommend", "quote": "Also https://postgis.net/", "excerpt": "Also https://postgis.net/", "context": "", "use_case": "", "switched_from": "", "story": "GeoJSON"}]}], "caveats": [{"label": "", "summary": "", "quotes": [{"id": 746814306, "item_id": 46675894, "url": "https://news.ycombinator.com/item?id=46675894", "by": "willtemperley", "date": "2026-01-18", "version": null, "stance": "warn", "quote": "PostGIS took multiple days to process the million-vertex Norwegian national parks", "excerpt": "That's a good point. Hadoop may not be the most efficient way, but when a deliverable is required, Hadoop is a known quantity and really works. I did some interesting work ten years ago, building pipelines to create global raster images of the entire Open Street Map road network [1]. I was able to process the planet in 25 minutes on a $50k cluster. I think I had the opposite problem: Hadoop wasn't shiny enough and Ja", "context": "", "use_case": "vector dataset processing", "switched_from": "", "story": "Command-line Tools can be 235x Faster than your Hadoop Cluster (2014)"}]}], "who": [{"by": "madanosliw", "context": "runs a small consultancy, open to contracting", "url": "https://news.ycombinator.com/item?id=49927009", "date": "2026-10-01"}, {"by": "basil", "context": "built a territory game for cyclists", "url": "https://news.ycombinator.com/item?id=49482452", "date": "2026-08-28"}, {"by": "chofmann", "context": "Mapbox Boundaries team", "url": "https://news.ycombinator.com/item?id=48371094", "date": "2026-06-02"}], "tags": [], "use_cases": ["geospatial database extension", "spatial queries", "processing osm data", "geospatial data in postgres", "storing census population data", "location finding"], "compared": [{"slug": "postgresql", "name": "PostgreSQL", "co": 7, "switched_from": 0, "switched_to": 0}, {"slug": "pglite", "name": "PGlite", "co": 3, "switched_from": 0, "switched_to": 0}, {"slug": "react", "name": "React", "co": 3, "switched_from": 0, "switched_to": 0}, {"slug": "pgvector", "name": "pgvector", "co": 2, "switched_from": 0, "switched_to": 0}, {"slug": "mysql", "name": "MySQL", "co": 2, "switched_from": 0, "switched_to": 0}, {"slug": "redis", "name": "Redis", "co": 2, "switched_from": 0, "switched_to": 0}, {"slug": "next-js", "name": "Next.js", "co": 2, "switched_from": 0, "switched_to": 0}, {"slug": "express", "name": "Express", "co": 2, "switched_from": 0, "switched_to": 0}], "makers": [], "threads": [{"url": "https://news.ycombinator.com/item?id=49361279", "title": "PostgreSQL for Everything", "mentions": 3}, {"url": "https://news.ycombinator.com/item?id=48060918", "title": "GeoJSON", "mentions": 3}, {"url": "https://news.ycombinator.com/item?id=49922568", "title": "Ask HN: Who wants to be hired? (October 2026)", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49922569", "title": "Ask HN: Who is hiring? (October 2026)", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49522896", "title": "Ask HN: Who wants to be hired? (September 2026)", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49478401", "title": "State of the Map 2026", "mentions": 1}], "sentiment_by_month": {"2025-11": {"neutral": 1}, "2025-12": {"recommend": 1}, "2026-01": {"recommend": 1, "warn": 1, "neutral": 1}, "2026-02": {"recommend": 1}, "2026-03": {"neutral": 2, "recommend": 1}, "2026-04": {"neutral": 1}, "2026-05": {"recommend": 1, "neutral": 2}, "2026-06": {"neutral": 2}, "2026-07": {"compare": 1, "recommend": 1}, "2026-08": {"neutral": 2, "recommend": 3}, "2026-09": {"neutral": 1}, "2026-10": {"neutral": 2}}, "versions": [], "version_unnamed": 0, "quotes": [{"id": 798832151, "item_id": 49927009, "url": "https://news.ycombinator.com/item?id=49927009", "by": "madanosliw", "date": "2026-10-01", "version": null, "stance": "neutral", "quote": "PostGIS", "excerpt": "Location: Atlanta, GA, USA Remote: Absolutely Willing to relocate: Probably not Technologies: LLMs (because of course), Ruby/Rails, JavaScript (Node.js, React, Express, Next.js, TypeScript), Python, SQL, Java, PHP, HTML, CSS, PostgreSQL, MySQL, PostGIS, Redis, DHIS2, Metabase, ODK, CommCare, Mapbox, Leaflet, Amazon Web Services (EC2, ECS/Fargate, RDS, S3, Lambda, SES, CloudFormation, ElastiCache), Google Cloud (Compu", "context": "runs a small consultancy, open to contracting", "use_case": "", "switched_from": "", "story": "Ask HN: Who wants to be hired? (October 2026)"}, {"id": 798784260, "item_id": 49924016, "url": "https://news.ycombinator.com/item?id=49924016", "by": "tilecache", "date": "2026-10-01", "version": null, "stance": "neutral", "quote": "Stack: React/TypeScript, Python/FastAPI on AWS Lambda, Aurora PostgreSQL + PostGIS.", "excerpt": "City Detect | Full Stack Product Engineer (Design & Geospatial) | Tuscaloosa, AL | REMOTE (US) | Full-time | $110k\u2013$159k + equity City Detect uses AI and computer vision to map the physical world for cities. Sensors capture street-level conditions so local governments can find and respond to issues like blight and track how neighborhoods change over time. Founded in 2021, Series A, working with municipalities across ", "context": "", "use_case": "Geospatial database extension", "switched_from": "", "story": "Ask HN: Who is hiring? (October 2026)"}, {"id": 792377684, "item_id": 49523605, "url": "https://news.ycombinator.com/item?id=49523605", "by": "juansm", "date": "2026-09-01", "version": null, "stance": "neutral", "quote": "Flask/PostGIS backend serving spatial queries", "excerpt": "Location: Seville, Spain (UTC+1/+2) Remote: Yes Willing to relocate: Yes, for the right role Technologies: Java, Spring Boot, Spring Security, Hibernate/JPA, PostgreSQL, Oracle, Flyway, Docker, Keycloak/OAuth2/OIDC, JUnit, GitLab CI. Also Python/Flask, React, TypeScript. R\u00e9sum\u00e9/CV: https://juanschezmor.github.io Email: juanschezmor@gmail.com Backend developer, 2.5 years, currently at a consultancy in Spain and lookin", "context": "", "use_case": "Spatial queries", "switched_from": "", "story": "Ask HN: Who wants to be hired? (September 2026)"}, {"id": 791719233, "item_id": 49482452, "url": "https://news.ycombinator.com/item?id=49482452", "by": "basil", "date": "2026-08-28", "version": null, "stance": "neutral", "quote": "It's heavily processed OSM data with PostGIS.", "excerpt": "Gamifying the map definitely helps to pull in contributors. StreetComplete got me editing more than anything else. I went a bit sideways with it: I used OSM data to build a territory game for cyclists, where you claim roads by riding them. It's heavily processed OSM data with PostGIS. The fun part was figuring out how to decide what counts as a claimable road in the first place. https://remap.earth", "context": "built a territory game for cyclists", "use_case": "processing OSM data", "switched_from": "", "story": "State of the Map 2026"}, {"id": 789851874, "item_id": 49365742, "url": "https://news.ycombinator.com/item?id=49365742", "by": "KronisLV", "date": "2026-08-19", "version": null, "stance": "recommend", "quote": "excellent plugins like pgvector and PostGIS", "excerpt": "> PostgreSQL allowed us to use a fulltext search plugin to do everything in one system. No need to sync any data. No need to maintain and run two systems. It just worked and made us smile (after some tweaks of course). Simplicity. I found MariaDB to be wonderfully simple to use for somewhat casual use cases: https://mariadb.com/docs/server/ha-and-performance/optimization-and-tuning/optimization-and-indexes/full-text-", "context": "", "use_case": "", "switched_from": "", "story": "PostgreSQL for Everything"}, {"id": 789800128, "item_id": 49362508, "url": "https://news.ycombinator.com/item?id=49362508", "by": "silvestrov", "date": "2026-08-19", "version": null, "stance": "recommend", "quote": "PostGIS is also another very useful addition for storing, indexing, and querying geospatial data.", "excerpt": "PostGIS is also another very useful addition for storing, indexing, and querying geospatial data. http://www.postgis.net", "context": "", "use_case": "geospatial data in Postgres", "switched_from": "", "story": "PostgreSQL for Everything"}, {"id": 789788560, "item_id": 49361785, "url": "https://news.ycombinator.com/item?id=49361785", "by": "_joel", "date": "2026-08-19", "version": null, "stance": "recommend", "quote": "No mention of https://postgis.net/ - shameful", "excerpt": "No mention of https://postgis.net/ - shameful", "context": "", "use_case": "", "switched_from": "", "story": "PostgreSQL for Everything"}, {"id": 789756752, "item_id": 49359797, "url": "https://news.ycombinator.com/item?id=49359797", "by": "NameError", "date": "2026-08-19", "version": null, "stance": "neutral", "quote": "stored in a PostGIS database", "excerpt": "Thanks! The population/demographic data is all freely available from the US Census and stored in a PostGIS database (hence the site being US-only for now- if I wanted to make it global, there are global gridded population data sets but they aren't as detailed). The geography data is all pulled in w/ some long-running background tasks into a rails app (that hosts both draw.city and another site I've shared here in the", "context": "", "use_case": "storing census population data", "switched_from": "", "story": "Show HN: Draw.city \u2013 geography game where you circle the target population [US]"}, {"id": 784779456, "item_id": 49048716, "url": "https://news.ycombinator.com/item?id=49048716", "by": "eudamoniac", "date": "2026-07-25", "version": null, "stance": "recommend", "quote": "postgres PostGIS index for location finding scaled well enough for Uber", "excerpt": "Something interesting is that postgres PostGIS index for location finding scaled well enough for Uber. They eventually switched to something else but I don't think it was due to scaling problems.", "context": "", "use_case": "location finding", "switched_from": "", "story": "Postgres LISTEN/NOTIFY actually scales"}, {"id": 783093873, "item_id": 48943367, "url": "https://news.ycombinator.com/item?id=48943367", "by": "mrtimo", "date": "2026-07-16", "version": null, "stance": "compare", "quote": "Is PostGIS king in this area?", "excerpt": "Thanks for sharing, and thanks for making the video you shared. A couple thoughts. Is PostGIS king in this area? I've been liking duckDB as it does not require a server. Is there a good alternative to PostGIS in the duckDB world? Maybe just plain GeoParquet files read in through duckDB? In the example in your video are any special GEOMETRY functions being used in the underlying SQL? Or, could your data just have been", "context": "", "use_case": "geospatial data", "switched_from": "", "story": "Geosql: A Claude/Codex skill for geospatial data"}, {"id": 778335154, "item_id": 48645947, "url": "https://news.ycombinator.com/item?id=48645947", "by": "ilbert", "date": "2026-06-23", "version": null, "stance": "neutral", "quote": "PGLite extensions: https://pglite.dev/extensions/#postgis", "excerpt": "The cli config supports specifying the PGLite extensions (the codegen uses PGLite as an in-memory light postgres), see this example: https://github.com/ilbertt/bun-sqlgen/tree/main/examples/with-config. You'll still probably have to manually override some column types using PG comments like: https://github.com/ilbertt/bun-sqlgen/blob/dee757ebc9c38aec7e9f1b71c5b2154d033b2689/examples/simple/src/db/migrations/0005_type", "context": "", "use_case": "", "switched_from": "", "story": "Show HN: Bun-sqlgen \u2013 Type-safe raw SQL for Bun, no ORM"}, {"id": 773937504, "item_id": 48371094, "url": "https://news.ycombinator.com/item?id=48371094", "by": "chofmann", "date": "2026-06-02", "version": null, "stance": "neutral", "quote": "We use postgis, trino and iceberg to build and validate topologically accurate geodata.", "excerpt": "Mapbox is hiring a Geospatial Data Engineer on our Boundaries team. We use postgis, trino and iceberg to build and validate topologically accurate geodata. We are remote-first and hire in many countries globally. Please apply! Full job description is here: https://jobs.ashbyhq.com/Mapbox/2fc1e9b6-8d13-4cb6-8271-a2f6322ec4ab?utm_source=1laq2agZyg", "context": "Mapbox Boundaries team", "use_case": "building and validating geodata", "switched_from": "", "story": "Ask HN: Who is hiring? (June 2026)"}, {"id": 769067953, "item_id": 48066747, "url": "https://news.ycombinator.com/item?id=48066747", "by": "steve-chavez", "date": "2026-05-08", "version": null, "stance": "neutral", "quote": "We use that exact function [1]", "excerpt": "Many thanks for your work pramsey. We use that exact function [1], do you have any plans for a similar function for TopoJSON? One that also has a record parameter? [2]. [1]: https://github.com/PostgREST/postgrest/blob/f1d0e8ea2266077d2b57144927dea08bd8f74579/src/PostgREST/Query/SqlFragment.hs#L224 [2]: PostGIS has https://postgis.net/docs/AsTopoJSON.html but it doesn't take a record.", "context": "", "use_case": "geospatial SQL functions", "switched_from": "", "story": "GeoJSON"}, {"id": 768999873, "item_id": 48062492, "url": "https://news.ycombinator.com/item?id=48062492", "by": "thibautg", "date": "2026-05-08", "version": null, "stance": "neutral", "quote": "you can automatically convert any PostGIS table (with geometry or geography column) to GeoJSON", "excerpt": "And with PostgREST [0], you can automatically convert any PostGIS table (with geometry or geography column) to GeoJSON by using an \"Accept: application/geo+json\" header in the request. [0] https://docs.postgrest.org/en/v14/how-tos/working-with-postgresql-data-types.html#postgis", "context": "", "use_case": "", "switched_from": "", "story": "GeoJSON"}, {"id": 768992848, "item_id": 48062053, "url": "https://news.ycombinator.com/item?id=48062053", "by": "michaeljhg", "date": "2026-05-08", "version": null, "stance": "recommend", "quote": "Also https://postgis.net/", "excerpt": "Also https://postgis.net/", "context": "", "use_case": "", "switched_from": "", "story": "GeoJSON"}, {"id": 763899361, "item_id": 47743710, "url": "https://news.ycombinator.com/item?id=47743710", "by": "tdrz", "date": "2026-04-12", "version": null, "stance": "neutral", "quote": "PostGIS has been one of the most requested extensions for PGlite and we've recently ported it.", "excerpt": "Hi HN, PostGIS has been one of the most requested extensions for PGlite and we've recently ported it. For now, it doesn't contain some optional libraries like json-c and GDAL, but we see a path in adding those as well. You can try it directly in our REPL https://pglite.dev/repl We're very interested in seeing what people build with it.", "context": "", "use_case": "geospatial database extension", "switched_from": "", "story": "PostGIS for PGlite"}, {"id": 757166820, "item_id": 47322926, "url": "https://news.ycombinator.com/item?id=47322926", "by": "al00sh", "date": "2026-03-10", "version": null, "stance": "neutral", "quote": "PostgreSQL with PostGIS for spatial queries", "excerpt": "So I've been following the Iran situation pretty closely and realized I was spending half my time just trying to figure out what actually happened where. The closest thing out there is Liveuamap, but it's turned into more of a general news aggregator \u2014 it dumps everything onto the map (protests, political statements, weather, car accidents) with intrusive ads layered on top, and the sourcing is mostly just reposted t", "context": "", "use_case": "", "switched_from": "", "story": null}, {"id": 756614354, "item_id": 47288397, "url": "https://news.ycombinator.com/item?id=47288397", "by": "pahbloo", "date": "2026-03-07", "version": null, "stance": "recommend", "quote": "Together with PostGIS, it's a powerful tool.", "excerpt": "I work with and contribute to a QGIS plugin that manage water and sewage network data. Together with PostGIS, it's a powerful tool. https://github.com/giswater", "context": "", "use_case": "spatial database", "switched_from": "", "story": "QGIS 4.0"}, {"id": 756234135, "item_id": 47264633, "url": "https://news.ycombinator.com/item?id=47264633", "by": "raduvul", "date": "2026-03-05", "version": null, "stance": "neutral", "quote": "PostgreSQL/PostGIS for geo queries", "excerpt": "I've been commuting on the Paris RER for years and got frustrated with the official apps \u2014 they tell you \"traffic disrupted\" but not where, how bad, or for how long. So I built o'RER: https://o-rer.com What it does: Live map with actual train positions, updated every 10 seconds via WebSocket Line status with delay severity levels (normal / disrupted / major / critical) Stop-level timetables \u2014 next 3 departures, with ", "context": "", "use_case": "", "switched_from": "", "story": "I built a real-time RER/train tracker for Paris commuters (PWA, no app store)"}, {"id": 750774720, "item_id": 46923420, "url": "https://news.ycombinator.com/item?id=46923420", "by": "hiddew", "date": "2026-02-07", "version": null, "stance": "recommend", "quote": "Also see PostGIS for Postgres systems", "excerpt": "Also see PostGIS for Postgres systems: https://postgis.net/docs/.", "context": "", "use_case": "geospatial queries in Postgres", "switched_from": "", "story": "How we made geo joins 400\u00d7 faster with H3 indexes"}, {"id": 748349856, "item_id": 46771866, "url": "https://news.ycombinator.com/item?id=46771866", "by": "davidkwast", "date": "2026-01-26", "version": null, "stance": "neutral", "quote": "I use PostGis to storage and serve vector tiles.", "excerpt": "I do. The pros are hosting own data and have total control over stack and cloud hosting. The cons are having to code your own stack and do cloud management. I use PostGis to storage and serve vector tiles. And I use a simple backend with AWS S3 to store and serve raster data (GeoTiff COG).", "context": "", "use_case": "Serving vector tiles", "switched_from": "", "story": "MapLibre Tile: a modern and efficient vector tile format"}, {"id": 746814306, "item_id": 46675894, "url": "https://news.ycombinator.com/item?id=46675894", "by": "willtemperley", "date": "2026-01-18", "version": null, "stance": "warn", "quote": "PostGIS took multiple days to process the million-vertex Norwegian national parks", "excerpt": "That's a good point. Hadoop may not be the most efficient way, but when a deliverable is required, Hadoop is a known quantity and really works. I did some interesting work ten years ago, building pipelines to create global raster images of the entire Open Street Map road network [1]. I was able to process the planet in 25 minutes on a $50k cluster. I think I had the opposite problem: Hadoop wasn't shiny enough and Ja", "context": "", "use_case": "vector dataset processing", "switched_from": "", "story": "Command-line Tools can be 235x Faster than your Hadoop Cluster (2014)"}, {"id": 745927283, "item_id": 46620455, "url": "https://news.ycombinator.com/item?id=46620455", "by": "mips_avatar", "date": "2026-01-14", "version": null, "stance": "recommend", "quote": "postgis is so good", "excerpt": "Mostly usearch since pgvector had some perf problems, though I use postgres during my ingestion stage since postgis is so good. I segment my hnsw indexes by multipe h3 levels.", "context": "", "use_case": "", "switched_from": "", "story": "I built a geocoder for AI agents because I couldn't afford Google Maps"}, {"id": 738384577, "item_id": 46149036, "url": "https://news.ycombinator.com/item?id=46149036", "by": "DonnyV", "date": "2025-12-04", "version": null, "stance": "recommend", "quote": "The gis community would be all over this.", "excerpt": "I see you guys are working on supporting the postgis extension. This would be HUGE!!! The gis community would be all over this. If anyone wants to help out who has compiled the postgis extension and is familiar with WASM. You can help out here. https://github.com/electric-sql/pglite/pull/807", "context": "", "use_case": "", "switched_from": "", "story": "PGlite \u2013 Embeddable Postgres"}, {"id": 734785729, "item_id": 45924108, "url": "https://news.ycombinator.com/item?id=45924108", "by": "layoric", "date": "2025-11-13", "version": null, "stance": "neutral", "quote": "hosted in a timescaledb PostGIS database", "excerpt": "Totally true. I have a trusty old (like 2016 era) X99 setup that I use for 1.2TB of time series data hosted in a timescaledb PostGIS database. I can fetch all the data I need quickly to crunch on another local machine, and max out my aging network gear to experiment with different model training scenarios. It cost me ~$500 to build the machine, and it stays off when I'm not using it. Much easier obviously dealing wit", "context": "", "use_case": "geospatial data storage", "switched_from": "", "story": "650GB of Data (Delta Lake on S3). Polars vs. DuckDB vs. Daft vs. Spark"}]}