
简介本资源为 PostGIS 3.5.0 的 Windows 64 位安装包专为 PostgreSQL 17 环境打造面向 GIS 开发人员、空间数据库运维者及地理信息相关专业师生。它解决的是 PostgreSQL 原生缺乏空间数据类型与空间分析能力的问题安装后即可在库内直接存储、检索与运算点线面等几何对象并支持空间索引、空间连接、距离与面积计算等操作。压缩包共 1317 个文件约 130.69MB以 933 个 sql 脚本、79 个 dll 动态库、75 个 csv 数据文件及 50 个 tif 栅格文件为主另含 control 扩展定义、json 配置、xsd 与 xml 模式文件、exe 工具及多种坐标系参数文件覆盖扩展注册、数据导入与坐标转换等环节。目前已有 192 人学习下载。借助该包可快速完成 PostGIS 与 PostgreSQL 17 的集成获得符合 OpenGIS 规范的空间数据管理能力适用于城市规划、交通管理、环境监测等需要地理空间查询与分析的场景。1. 为什么我建议你手头常备一份 postgis-bundle-pg17-3.5.0x64.zip上周帮同事排查一个空间查询慢到离谱的问题ST_DWithin跑 200 万条点数据要 40 多秒最后发现是数据库里压根没装 PostGIS他用earthdistance硬凑的。这种翻车现场我见过太多次根源往往不是 SQL 写得烂而是环境没搭对。postgis-bundle-pg17-3.5.0x64.zip就是解决这个问题的——它是 PostgreSQL 17 在 64 位 Windows 下的 PostGIS 3.5.0 一体化安装包把空间扩展、栅格支持、地理编码、路网分析这些组件打包好了省得你一个个去编译。适合谁做 GIS 后端、搞位置服务、需要在地图项目里跑空间分析的工程师。如果你正在搜「postgis安装失败」大概率是版本没对齐或者扩展没注册这份包能让你少走两小时弯路。2. 拆开压缩包这些 control 文件和 bat 脚本到底管什么2.1 从文件清单反推 PostGIS 的模块化设计拿到压缩包先别急着双击解压后你会看到一堆.control文件和几个看起来像配置的东西。postgis.control是核心定义了 PostGIS 扩展的版本、依赖和默认 schemapostgis_raster.control管栅格数据类型postgis_topology.control管拓扑关系address_standardizer.control和postgis_tiger_geocoder.control是美国地址标准化和地理编码用的pointcloud.control和pointcloud_postgis.control处理点云数据pgrouting.control是路网分析扩展。每个.control文件相当于一个扩展的身份证PostgreSQL 靠它识别扩展能不能装、装哪个版本。loaders.cache是给shp2pgsql这类命令行工具用的缓存了数据加载器的路径映射少了它你导入 Shapefile 时会报找不到驱动。makepostgisdb_using_extensions.bat是个批处理脚本作用是在指定数据库里批量创建扩展省得你手动敲CREATE EXTENSION。CH、fonts.conf、im-multipress.conf这几个跟字符编码和字体渲染有关做地图切片或者输出带标注的图片时会用到。理解这个结构你就明白 PostGIS 不是铁板一块而是按需加载的插件集合。2.2 安装前必须确认的三件事第一PostgreSQL 17 的安装路径。默认在C:\Program Files\PostgreSQL\17如果你改过盘符后面所有命令都要跟着换。第二确认bin目录下有pg_config.exePostGIS 安装程序靠它定位 PostgreSQL 的库和头文件。第三关掉所有连到该实例的客户端包括 pgAdmin 和正在跑的连接池否则文件被占用会直接导致安装中断。我一般会先跑一条命令验证环境C:\Program Files\PostgreSQL\17\bin\pg_config.exe --version输出应该是PostgreSQL 17.x如果报「不是内部或外部命令」说明路径不对或者 PostgreSQL 没装好。这一步花 10 秒能省掉后面 80% 的玄学报错。2.3 安装过程中的选项怎么选运行安装包后向导会问你 PostgreSQL 的安装目录、数据目录、超级用户密码。数据目录默认是C:\Program Files\PostgreSQL\17\data别乱改除非你当初装 PostgreSQL 时特意挪过。接着会让你勾选要安装的组件核心的 PostGIS、PostGIS Raster、PostGIS Topology 必选Address Standardizer 和 Tiger Geocoder 如果你不做美国地址解析可以不勾Pointcloud 和 pgRouting 看项目需求用不到就不装减少后期维护面。安装程序最后会问要不要自动创建扩展我建议选「否」等装完手动来。因为自动创建有时候会连到错误的数据库或者因为权限问题静默失败你根本不知道。手动执行虽然多两步但每一步都有反馈。3. 装完之后在 PostgreSQL 17 里激活 PostGIS 的完整流程3.1 用 psql 连接并创建扩展安装完成不等于数据库能用空间功能必须进到具体的数据库里执行CREATE EXTENSION。先连上psql -U postgres -h localhost -p 5432 -d gisdb-U是用户名-h是主机-p是端口-d是目标数据库。如果你还没有专门存空间数据的库先建一个CREATE DATABASE gisdb WITH ENCODING UTF8;然后切到该库逐个激活扩展CREATE EXTENSION postgis; CREATE EXTENSION postgis_raster; CREATE EXTENSION postgis_topology; CREATE EXTENSION pgrouting;每执行一条成功会返回CREATE EXTENSION失败会告诉你缺什么。常见的是could not open extension control file说明 PostGIS 的share\extension目录下没有对应的.control文件回去检查安装路径是不是选错了。3.2 验证空间功能是否真正可用别只看扩展列表里有postgis就以为万事大吉跑几条查询确认SELECT PostGIS_Version(); SELECT ST_AsText(ST_GeomFromText(POINT(116.397 39.908), 4326)); SELECT ST_Distance( ST_GeomFromText(POINT(116.397 39.908), 4326)::geography, ST_GeomFromText(POINT(121.473 31.230), 4326)::geography );第一条返回版本号比如3.5.0第二条把 WKT 文本转成几何对象并输出第三条计算北京到上海的球面距离单位是米。如果第三条报function st_distance(geography, geography) does not exist说明postgis扩展没装全或者 schema 搜索路径不对。3.3 用 makepostgisdb_using_extensions.bat 批量建库如果你需要频繁创建带 PostGIS 的数据库压缩包里的makepostgisdb_using_extensions.bat能省事。用之前先看一眼内容通常长这样echo off set PGBINC:\Program Files\PostgreSQL\17\bin set DBNAME%1 %PGBIN%\createdb -U postgres %DBNAME% %PGBIN%\psql -U postgres -d %DBNAME% -c CREATE EXTENSION postgis; %PGBIN%\psql -U postgres -d %DBNAME% -c CREATE EXTENSION postgis_raster; %PGBIN%\psql -U postgres -d %DBNAME% -c CREATE EXTENSION pgrouting; echo Database %DBNAME% is ready.调用时传数据库名makepostgisdb_using_extensions.bat gis_test。注意脚本里的PGBIN要和你实际安装路径一致密码如果没配.pgpass会提示输入。这个脚本适合开发环境快速起库生产环境还是走迁移工具更稳妥。4. 避坑与排查postgis安装失败到底卡在哪4.1 现象安装程序走到一半报「无法写入文件」原因PostgreSQL 服务正在运行postgis-3.dll被postgres.exe占用。解决以管理员身份打开命令提示符执行net stop postgresql-x64-17装完再net start postgresql-x64-17。如果还有 pgAdmin 开着也一并关掉。4.2 现象CREATE EXTENSION 报「could not load library postgis-3.dll」原因PostGIS 的bin目录没加到系统 PATH或者安装时选错了 PostgreSQL 版本。解决检查C:\Program Files\PostgreSQL\17\bin下有没有postgis-3.dll没有就重新安装有的话把该目录加到 PATH 最前面重启 psql 会话。4.3 现象ST_Distance 结果单位不对算出来是度不是米原因几何字段用的是geometry类型而不是geographygeometry在 4326 下直接算欧氏距离单位是度。解决要么把字段改成geography要么在查询里显式转换geom::geography或者用ST_Transform投影到米制坐标系再算。4.4 现象导入 Shapefile 时 shp2pgsql 报「Unable to open loaders.cache」原因loaders.cache文件不在当前工作目录或者POSTGIS_LOADER_CACHE环境变量没设。解决把loaders.cache复制到执行命令的目录或者设置set POSTGIS_LOADER_CACHEC:\path\to\loaders.cache。这个坑在自动化脚本里特别常见。4.5 现象pgRouting 扩展创建成功但函数调用报「function pgr_dijkstra does not exist」原因pgRouting 的函数装在publicschema 下但当前会话的search_path不包含public。解决执行SET search_path TO public, postgis;或者调用时写全public.pgr_dijkstra(...)。别小看这个我见过有人排查了一下午以为是版本不兼容。5. 进阶技巧用 PostGIS 3.5 做路网分析和栅格裁剪5.1 用 pgRouting 跑最短路径的完整示例假设你有一张路网表ways字段source、target、cost已经建好拓扑。跑一条从节点 1 到节点 50 的最短路径SELECT seq, node, edge, cost FROM pgr_dijkstra( SELECT id, source, target, cost FROM ways, 1, 50, directed : true ) ORDER BY seq;pgr_dijkstra第一个参数是 SQL 字符串返回边 ID、起点、终点、权重第二个和第三个是起止节点directed : true表示有向图。结果里edge为 -1 表示最后到达节点的虚拟边忽略即可。想拿路径几何再 join 回ways表用ST_Union拼起来。5.2 栅格数据裁剪与统计PostGIS Raster 能直接在数据库里做栅格运算。比如裁一块区域并算平均高程WITH clipped AS ( SELECT ST_Clip(rast, ST_MakeEnvelope(116.0, 39.5, 116.8, 40.2, 4326)) AS rast FROM dem_tiles WHERE ST_Intersects(rast, ST_MakeEnvelope(116.0, 39.5, 116.8, 40.2, 4326)) ) SELECT (ST_SummaryStats(rast)).mean FROM clipped;ST_Clip按多边形裁栅格ST_SummaryStats返回统计值。注意ST_Clip的第二个参数要和栅格的 SRID 一致否则裁出来是空值。这个操作比导出到桌面 GIS 再处理快得多尤其当栅格分块存储在库里的时候。5.3 一个我踩过的索引坑有次给geometry字段建了 GiST 索引查询还是全表扫。后来发现字段的 SRID 是 0而查询条件里写的是 4326PostGIS 没法用索引。从那以后我每次建表都强制指定 SRIDALTER TABLE poi ALTER COLUMN geom TYPE geometry(Point, 4326) USING ST_SetSRID(geom, 4326); CREATE INDEX idx_poi_geom ON poi USING GIST (geom);改完再ANALYZE poi;查询计划立刻从 Seq Scan 变成 Index Scan。这个习惯我保持到现在建完空间索引必跑EXPLAIN ANALYZE确认命中。希望帮到你。本文还有配套的精品资源点击获取