简介:本资源为 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 扩展的版本、依赖和默认 schema;postgis_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.exe,PostGIS 安装程序靠它定位 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 PGBIN=C:\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类型而不是geography,geometry在 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_CACHE=C:\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,而查询条件里写的是 4326,PostGIS 没法用索引。从那以后我每次建表都强制指定 SRID:
ALTER 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确认命中。希望帮到你。
本文还有配套的精品资源,点击获取