简介这是一份面向 PostgreSQL 开发者和 GIS 技术人员的 PostGIS 3.5.0 安装包对应 64 位 PostgreSQL 15 环境。它让普通关系型数据库具备存储、查询与分析地理空间数据的能力解决在业务系统中集成空间数据管理、空间索引计算与拓扑分析等需求。压缩包共 1335 个文件整体约 130.74MB核心内容以 SQL 扩展脚本、DLL 动态库、CSV 示例数据、TIF 栅格文件以及 control 控制文件为主分别承担创建空间扩展、提供底层计算能力、导入测试数据集、支持栅格数据与管理扩展版本等任务。压缩包内还包含地理编码工具、加载器、字体配置与安装初始化脚本安装后可通过预置脚本快速完成空间数据库初始化无需自行逐项配置。已有 190 人学习下载适合需要在自己数据库环境中快速启用 PostGIS、开展空间数据建模或构建轻量级 GIS 后端服务的初中级用户省去手动搜集多个组件的步骤并可直接获得可运行的组件组合与样例数据。1. 这是一个能直接解压使用的 PostGIS 工具包但别急着双击postgis-bundle-pg15-3.5.0x64.zip 这个文件名把重点都写在脸上了PostGIS 3.5.0 配 PostgreSQL 15面向 Windows x64 的 zip 免安装发行版。它的价值在于不需要跑安装向导不写注册表解压后一条 initdb 就能得到一个带 PostGIS 的数据库实例。适合离线服务器、临时测试环境、想自己掌控文件布局的工程场景。但很多人在这个 zip 上翻过车——解压后缺 DLL、initdb 闪退、CREATE EXTENSION postgis 找不到控制文件、服务起不来。下面直接进入操作从解压开始一步步把 PostgreSQL 15 PostGIS 3.5.0 跑起来再讲清 5 个最常见的失败原因最后给你一套升级备份和验证的工作习惯。2. 解压与初始化把 zip 里的 PostgreSQL 15 先跑起来2.1 准备运行库和路径x64 版不是解压就能跑先从根上讲清楚这个 zip 是 x64 的预编译二进制依赖 Microsoft Visual C 运行库。PostGIS 3.5.0 的 DLL 用的是 2015-2022 工具集编译的所以机器上必须装 Microsoft Visual C 2015-2022 Redistributable (x64)。注意不是 2013虽然 2013 的库有时也一起装上但真正缺的是 vcruntime140.dll 和 vcruntime140_1.dll。我一般直接用 winget 装# 用 winget 安装最新 VC 运行库x64 架构 winget install Microsoft.VCRedist.2015.x64装完之后先把 zip 解压出来。我习惯用 7-Zip因为它对 zip 格式的兼容性好遇到伪加密、分卷也不容易卡死。解压目标路径务必是纯英文、无空格的目录比如C:\PostgreSQL\pg15。如果你解压到C:\Program Files\...或者带中文的路径后面 initdb 和 pg_ctl 会有一堆稀奇古怪的权限问题和控制文件路径错乱这些属于可以提前规避的坑。解压后确认目录结构。这个 bundle 解压出来通常会有一个包含bin、lib、share、doc的目录后面命令都假设你的根目录是C:\PostgreSQL\pg15。重点看share\extension\postgis.control是否存在这个文件存在PostGIS 扩展才有被创建的基础。顺带提醒如果你用的是 arm64 的 Windows这个 x64 的 zip 不能直接跑别想着兼容层通用x64 和 arm64 的运行库和驱动路径完全不同老老实实找 arm64 版本。提示如果你的机器上已经装有 PostgreSQL 14 或其他版本建议把 zip 版解压到独立目录并用显式路径调用避免 PATH 串扰。2.2 用 initdb 初始化数据目录参数一次设对PostgreSQL 的 zip 包不像安装版那样自带数据目录必须先用 initdb 生成。切到 bin 目录执行下面的命令# 切换到解压后的 bin 目录 cd C:\PostgreSQL\pg15\bin # 初始化数据目录 .\initdb.exe -D C:\PostgreSQL\pg15\data -E UTF8 --localeC -U postgres -A scram-sha-256参数说明-D指定数据目录必须是一个不存在的空目录initdb 会创建它。-E UTF8把数据库集群的默认编码设为 UTF-8。地理位置数据经常包含多语言属性UTF8 是必须的。--localeC采用 C 排序规则避免 Windows 中文 locale 下字符串排序出现诡异行为比如muni和münchen被当成同一字符。如果你确实需要本地化排序再改用--localezh-CN但一般空间数据库用 C 最稳。-U postgres设置超级用户名。默认会和你当前登录的 Windows 用户名一致所以显式指定更可控。-A scram-sha-256设置默认认证方式为 SCRAM-SHA-256比 md5 安全新版客户端也支持。这一步如果报无法定位程序输入点或者找不到 libiconv-2.dll多半是 VC 运行库没装好回 2.1 补装。initdb 成功后末尾会显示Success. You can now start the database server没有这行就是失败。2.3 用 pg_ctl 启动并验证基础连接数据目录初始化后先手动启动验证没有问题再考虑注册服务。用 pg_ctl 的好处是日志写在文件里方便回溯# 启动数据库后台运行日志写到 data 目录下的 pg.log .\pg_ctl.exe -D C:\PostgreSQL\pg15\data -l C:\PostgreSQL\pg15\pg.log start启动后用 psql 连上去# 连接本机 5432 端口用户 postgres .\psql.exe -U postgres -h localhost -p 5432 -d postgres如果认证失败确认 2.2 里的-A scram-sha-256是否生效如果端口不通先用netstat -ano | findstr 5432看有没有被占用。连上后执行SELECT version();你会看到 PostgreSQL 15.x 的版本信息。注意此刻还没有 PostGIS必须到下一章创建扩展。3. 创建 PostGIS 3.5.0 扩展从空库到空间数据库3.1 先建业务数据库别直接污染 postgres 库很多人图省事直接在默认的postgres库上CREATE EXTENSION postgis;这样也能跑但不推荐。空间扩展的元数据、函数、类型会把一个纯管理库变得很重后面备份、迁移、删库都麻烦。我一般先建一个专门的空间库名字叫gistest也行、gisdb也行按业务来-- 连接到 postgres 库后执行 CREATE DATABASE gistest ENCODING UTF8 TEMPLATE template0;注意TEMPLATE template0template1 里可能有你不想继承的对象或编码设置template0 是纯净的而且允许 UTF8 编码。建完后用psql -d gistest连入或者执行\c gistest。3.2 按依赖顺序创建扩展postgis、postgis_raster、postgis_topologyPostGIS 3.5.0 把功能拆成了多个扩展最核心的是postgis必装栅格功能在postgis_raster里拓扑在postgis_topology里3D 高级算法在postgis_sfcgal里。先装核心扩展-- 创建 postgis 核心扩展 CREATE EXTENSION postgis; -- 需要栅格支持时创建 raster 扩展 CREATE EXTENSION postgis_raster; -- 需要拓扑计算时创建 topology 扩展 CREATE EXTENSION postgis_topology; -- 模糊字符串匹配地理编码常用 CREATE EXTENSION fuzzystrmatch;逻辑说明postgis扩展会创建 geometry/geography 类型、空间索引支持、几百个 ST_ 函数。postgis_raster在 PostGIS 3.x 里是独立扩展如果你从 2.x 升级过来会发现以前CREATE EXTENSION postgis会自动带 raster现在必须手动建这是 PostGIS 3 的一次模块化拆分。postgis_topology需要单独建和 topology 相关的函数才会出现。fuzzystrmatch不是 PostGIS 自带但tiger_geocoder地址标准化会用它顺手建上比较省事。创建完成后可以用\dx在 psql 里列出已安装扩展。如果报错could not open extension control file先检查share\extension\postgis.control是否存在别急着重装。3.3 验证组件和函数别只看版本号PostGIS 的版本信息是个信息金矿一条 SQL 就能看到底层 C 库的编译版本-- 查看完整 PostGIS 版本信息 SELECT PostGIS_full_version();输出类似下面不同编译配置会有差异POSTGIS3.5.0 [EXTENSION] PGSQL150 GEOS3.12.0 PROJ9.1 GDAL3.6.0 LIBXML2.11 LIBJSON0.16 LIBPROTOBUF1.4.1 WAGYU0.5.0说明PGSQL150表示是针对 PostgreSQL 15 编译的和你的 pg15 匹配。GEOS是空间拓扑运算的核心库版本过老会影响ST_Intersects、ST_Buffer等函数的算法和性能。PROJ负责坐标系转换处理ST_Transform时关键看它。GDAL负责栅格读写如果你要加载 GeoTIFFGDAL 必须可用。后续如果遇到某些 PostGIS 函数报extension postgis has no member或者function does not exist回来看这行输出能定位是不是底层库编译没带。再做一个向量层面的冒烟测试-- 计算一个多边形的面积验证 geometry 类型是否可用 SELECT ST_Area( ST_GeomFromText(POLYGON((0 0, 0 1, 1 1, 1 0, 0 0)), 4326) ) AS area;正常会返回1。如果你写的 SRID 无效或者几何非法这里会直接报错。这个测试跑通说明从类型、函数到空间运算符链路全部打通PostGIS 3.5.0 已经可以在你的 pg15 上正常干活了。4. 把临时进程变成 Windows 服务注册与连接配置4.1 用 pg_ctl register 注册一个 PostgreSQL 服务手动启动的 psql 进程会随着你关掉命令行窗口一起结束测试环境无所谓生产或长期挂机就得注册成 Windows 服务。这和你把一个 MQTT 服务 zip 包手动设成本地服务是一个思路让程序脱离会话常驻后台开机自启崩溃后由服务管理器拉起。注册前先停掉手动启动的实例避免端口冲突# 停止当前手动启动的 PostgreSQL .\pg_ctl.exe -D C:\PostgreSQL\pg15\data stop # 注册服务服务名 PostgreSQL15开机自动启动 .\pg_ctl.exe register -N PostgreSQL15 -D C:\PostgreSQL\pg15\data -S auto -w参数说明register是 pg_ctl 的子命令专门用于注册 Windows 服务。-N PostgreSQL15给服务起名建议带版本号方便以后和 pg14、pg16 区分。-D指向数据目录。-S auto设置服务启动类型为自动等价于服务管理面板里的「自动」。-w让注册命令等待服务初始化完成没加的话注册后立即启动可能因为数据目录还没就绪而失败。执行之后到服务管理器services.msc里能看到PostgreSQL15。这一步必须在管理员权限的终端下执行普通用户没有CreateService权限。注册成功后用net start PostgreSQL15或者直接pg_ctl start都行。如果不想要这个服务了反注册命令是pg_ctl unregister -N PostgreSQL15。4.2 调整 postgresql.conf 和 pg_hba.conf两个文件决定谁能连、能存多少zip 包的默认配置是保守的需要按业务调整。postgresql.conf在数据目录根下pg_hba.conf也在同一位置。先看监听与连接数# postgresql.conf 关键参数 listen_addresses * # 允许所有网卡监听只本机就改 localhost port 5432 # 端口和客户端保持一致 max_connections 100 # 并发连接上限根据内存调 shared_buffers 256MB # 共享内存物理内存的 1/4 左右即可 work_mem 8MB # 单个排序/哈希操作的内存不要设太大参数说明listen_addresses *表示监听所有地址。如果只在局域网暴露建议写成具体 IP别裸奔。shared_buffers是 PostgreSQL 的共享内存池4GB 的机器给 256MB 起步16GB 内存机器给 2GB 也行但要结合 Windows 的虚拟内存设置。work_mem不是越大越好因为它是每条 SQL 都可能消耗的ORDER BY或ST_Intersects连接都可能吃这个内存8MB 起步遇到复杂空间分析再单独调。PostGIS 相关配置也在postgresql.conf# PostGIS 3.5.0 栅格驱动白名单 postgis.gdal_enabled_drivers GTiff # 允许读取外部栅格文件 postgis.enable_outdb_rasters falsepostgis.gdal_enabled_drivers默认是空意味着不能用 ST_FromGDALRaster 等读取外部栅格按需填GTiff或PNG、JPEG。enable_outdb_rasters控制是否允许引用库外栅格涉及安全默认关闭需要时再开。改完配置必须重启服务。用pg_ctl reload只能重载部分参数类似listen_addresses和shared_buffers需要重启。pg_hba.conf是客户端认证的白名单。默认只允许本地用户用scram-sha-256。如果希望局域网内的其他机器能连追加一行# 允许 192.168.1.0/24 网段用密码连接 host gistest all 192.168.1.0/24 scram-sha-256注意gistest指的是数据库名all是用户要严格按需求缩小范围。改完 pg_hba 后执行pg_ctl reload即可生效不需要重启。4.3 客户端连接验证与端口防火墙服务起来后在另一台机器上用 psql 或者 pgAdmin 连接。先用命令行验证# 从客户端机器连接远程 PG 服务需要输入密码 psql.exe -U postgres -h 192.168.1.10 -p 5432 -d gistest如果卡住或者报Connection timed out先检查 Windows 防火墙。开放 5432 入站端口# 管理员 PowerShell 执行放行 5432 端口 New-NetFirewallRule -DisplayName PostgreSQL 5432 -Direction Inbound -LocalPort 5432 -Protocol TCP -Action Allow三个常见连接失败原因按顺序排查pg_hba.conf没匹配到你客户端的 IP 段报no pg_hba.conf entry for host。postgresql.conf的listen_addresses没改成*, 报Connection refused。防火墙拦截报timeout或者10060错误。日志是最终裁判-l参数指定的日志文件里每次连接失败都会留原因。5. 避坑PostGIS bundle 安装最常见的 5 个翻车现场PostGIS 安装失败的原因往往集中在这五个地方。这一章整理的是我在 Windows 上部署 postgis-bundle-pg15-3.5.0x64.zip 时的高频失败和身边同事的血泪经验每条按「现象 → 原因 → 解决」写遇到问题可以直接对着查。5.1 现象initdb 一闪而过或提示无法定位程序输入点这是一个最经典的起步失败。刚解压完打开 cmd 运行initdb.exe -D ...窗口闪掉或者弹窗提示无法定位程序输入点/VCRUNTIME140.dll not found。原因系统缺少 Microsoft Visual C 2015-2022 Redistributable (x64)。PostGIS 3.5.0 的二进制是用 VS2015 以上工具链编译的运行依赖vcruntime140.dll和vcruntime140_1.dll。很多精简版 Windows 或服务器系统没有预装。解决去微软官网装vc_redist.x64.exe或者用前面的 winget 命令装。装完重启终端再试。这里有两点要确认一是确认自己装的是 x64 而不是 arm64Windows on ARM 上跑 x64 模拟的话VC 库也要装 x64 版本二是服务器场景如果之前装过 2013、2015 等旧版建议把 2015-2022 最新版也装上它们可以并行共存不会冲突。5.2 现象psql 执行 CREATE EXTENSION postgis 报 could not open extension control file用psql -U postgres -d gistest执行扩展创建回报ERROR: could not open extension control file C:/PostgreSQL/pg15/share/extension/postgis.control: No such file or directory。原因三类。第一zip 解压不完整share\extension下的文件被杀毒软件隔离或解压时被跳过第二解压路径里有中文或空格psql 读取控制文件时路径解析出问题这种情况更常见于不规范的 zip 工具第三你之前装过其他版本的 PostgreSQLPATH 里的 psql 是别的实例导致连到了另一个share目录。解决先确认C:\PostgreSQL\pg15\share\extension目录下有没有postgis.control没有就重新解压并暂时关闭杀毒软件实时防护或把解压目录加入白名单有的话看psql到底用的哪个目录执行SHOW data_directory;和SELECT * FROM pg_available_extensions;如果扩展列表是空的说明你连接的数据库实例不是这个 zip 包启动的检查 PATH 环境变量用cd C:\PostgreSQL\pg15\bin显式调用。5.3 现象服务启动后马上停止事件日志里没有明确错误pg_ctl start或者net start PostgreSQL15显示服务已启动但三秒后进程消失Windows 事件查看器里只有一句「服务意外终止」。原因最常见的是端口被占用。Windows 下另一个 PostgreSQL 实例、或者其他服务占了 5432新实例必然起不来。其次是数据目录权限不对尤其你用管理员初始化数据目录然后以普通用户启动服务数据目录里的文件对普通用户不可读。第三种是postgresql.conf里写了无效参数值比如shared_buffers超过实际内存导致进程启动时分配失败。解决先停掉占用端口的进程用netstat -ano | findstr 5432找到 PID 再在任务管理器里确认。权限问题在 initdb 时就不要用管理员跑注册服务时用普通用户启动如果已经初始化了用icacls C:\PostgreSQL\pg15\data /grant NT AUTHORITY\NetworkService:(F)这类命令给服务账户授权。配置问题去日志里看启动时指定-l指向日志文件里面会记录加载配置的具体失败行号。5.4 现象创建 postgis 扩展成功但 ST_AsRaster / ST_Transform 函数不存在CREATE EXTENSION postgis;执行顺利但跑栅格相关 SQL 时报function st_asraster(geometry, ...) does not exist或者PostGIS_full_version()里看不到 GDAL 信息。原因PostGIS 3.x 的模块化拆分。raster 支持从核心扩展中剥离成了postgis_raster如果你按 2.x 的习惯只建了postgis栅格函数自然不在。同样ST_Transform如果底层 PROJ 没编译函数可能也不可用但通常postgis扩展已包含它更常见的是 GDAL 栅格驱动白名单为空导致读取外部栅格失败。解决按 3.2 里的方式补建postgis_raster扩展并在postgresql.conf里设置postgis.gdal_enabled_drivers。注意顺序先建postgis再建postgis_raster不要反过来。如果函数仍缺失检查PostGIS_full_version()里GDAL段如果是GDAL(no support)说明这个 bundle 编译时没带 GDAL就需要下载完整的 bundle标题里的 3.5.0 通常带或者考虑改用安装版。5.5 现象解压后整个 zip 被防病毒软件悄悄清理zip 解压到一半或完整解压后bin 目录里的libgcc_s-1.dll、libiconv-2.dll被删了initdb 一运行就报缺少某个 DLL。你在资源管理器里看文件还在但就是报错这种属于典型的「黑匣子」问题。原因部分杀毒软件对 PostgreSQL 的 DLL 存在误报尤其是 PostgreSQL 附带的libiconv-2.dll这类国际化库和某些破解工具同签名。另外如果你用非官方渠道下载的 zip文件可能真的被篡改过。解决优先从官方或可信镜像下载这个文件名下载后校验 SHA256如果提供的话然后解压时把目标目录加入杀毒软件白名单解压后再扫描一次。如果 DLL 已经被隔离到杀毒软件的隔离区恢复文件。不要图省事直接关闭杀毒软件否则之后连怎么丢的文件都不知道。6. 把 zip 版用成生产级升级预案、备份与日常验证习惯zip 免安装的好处是环境可复制坏处是没有自带服务管理升级和备份全靠自己。我现在的做法是所有关键路径和参数写进一个部署脚本每次搭环境都跑同一套避免记忆漂移。首先是版本升级。PostGIS 3.5.0 如果有小版本更新比如从 3.5.0 升到 3.5.1官方会发布新的 bundle zip。常见做法是解压新包到新目录用新包的pg_upgrade.exe来升级而不是直接覆盖旧文件。命令大致是这样的# 停掉服务准备升级 .\pg_ctl.exe -D C:\PostgreSQL\pg15\data stop # 运行新版本 bin 下的 pg_upgrade旧数据目录与新数据目录结对 cd C:\PostgreSQL\pg15_new\bin .\pg_upgrade.exe -b C:\PostgreSQL\pg15\bin -B C:\PostgreSQL\pg15_new\bin -d C:\PostgreSQL\pg15\data -D C:\PostgreSQL\pg15_new\data -U postgres-b是旧 bin-B是新 bin-d旧数据目录-D新数据目录。注意 pg_upgrade 要求新旧版本的 PG 主版本一致小版本差异没问题如果 PG 主版本变了比如从 14 升到 15那必须走 dump/restore。PostGIS 扩展在 pg_upgrade 之后要重新跑一次CREATE EXTENSION postgis;不是扩展本身数据还在但可能需要更新扩展脚本所以升级后执行ALTER EXTENSION postgis UPDATE;是必要的。备份是任何空间数据库的底线。我不建议用文件拷贝的方式备份数据目录因为 Windows 下进程可能还在写。正确做法是pg_dump# 备份整个 gistest 库包含所有对象和数据 .\pg_dump.exe -U postgres -p 5432 -F c -b -f C:\PostgreSQL\backup\gistest_20250601.dmp gistest-F c是自定义压缩格式-b包含大对象-f指定输出文件。恢复时对应pg_restore --create -d postgres C:\PostgreSQL\backup\gistest_20250601.dmp。恢复后记得执行VACUUM ANALYZE;更新统计信息。最后是一分钟的日常验证习惯。我每到一个新环境会用一个脚本把核心指标跑一遍先看扩展版本再看一个空间函数最后确认服务状态。这样能快速区分是部署问题还是业务问题。命令行三连# 检查服务状态 .\pg_ctl.exe -D C:\PostgreSQL\pg15\data status # 检查 PostGIS 版本 .\psql.exe -U postgres -d gistest -c SELECT PostGIS_full_version(); # 跑一个空间查询冒烟 .\psql.exe -U postgres -d gistest -c SELECT ST_AsText(ST_Buffer(ST_Point(0,0), 1));这三个命令跑完如果服务在线、版本里有3.5.0、ST_Buffer 能返回一个圆的 WKT说明这套 zip 环境是健康的。之后再去排查业务层面的数据问题就省得把时间浪费在「PostGIS 到底装好没有」的怀疑上。做这个 ZIP 版部署这几年最大的教训是别把 zip 版当成「解压即用」的黑匣子它的自由是有代价的——你要自己管理运行库、环境变量、服务权限和升级路径。但只要把 2、3 章的初始化步骤和这一章的习惯固定下来它在 Windows 上的稳定性其实不比安装版差。希望帮到你。本文还有配套的精品资源点击获取
