
简介postgis-bundle-pg12-3.4.2x64.zip 是面向 PostgreSQL 12 用户的 PostGIS 3.4.2 空间数据库扩展安装包适用于从事地理信息系统开发、空间数据分析与城市规划、交通导航、环境监测等场景的开发者与 GIS 工程师。PostGIS 在对象关系型数据库 PostgreSQL 上增加存储管理空间数据的能力遵循 OGC 简单特征访问等规范兼容 QGIS、GRASS GIS、uDig 等软件支持二至四维空间对象、空间索引、坐标系转换及 shapefile、GeoJSON、KML、GPX 等格式读写。压缩包共 1281 个文件约 129.44MB以 895 个 sql 脚本、78 个 dll 动态库、74 个 csv 数据文件为主另含 tif 栅格、control 扩展控制文件、pl 脚本与 xml、json 配置等覆盖扩展注册、数据装载与示例数据。已有 112 人学习下载可帮助读者在 64 位 PostgreSQL 12 环境快速完成 PostGIS 部署直接获得空间查询、空间分析与服务交互所需的完整组件。1. postgis-bundle-pg12-3.4.2x64.zip 到底是什么一次把 Windows 上装 PostGIS 的坑说透如果你在 Windows 上给 PostgreSQL 12 装 PostGIS大概率搜到过postgis-bundle-pg12-3.4.2x64.zip这个文件名。它不是一个安装程序而是一个已经编译好的二进制包解压后把文件铺到 PostgreSQL 目录里就能用。很多人第一次装 PostGIS 就卡在这里下载完不知道往哪放放完执行CREATE EXTENSION postgis报错或者干脆连postgis-3.dll都找不到。这篇不聊虚的就围绕这个 zip 包把「它是什么、怎么装、参数怎么配、装完怎么验证、翻车了怎么救」一条线讲清楚。适合两类人一是在 Windows 上跑 PostgreSQL 12 做 GIS 开发、被编译环境劝退的工程师二是想快速搭一套本地空间数据库、不想折腾源码编译的从业者。读完你能自己判断这个包值不值得用、怎么用最稳。2. 拆开这个 zip目录结构、版本对应与选型理由2.1 为什么是 pg12 和 3.4.2 这两个数字绑在一起PostGIS 的二进制包和 PostgreSQL 的大版本是强绑定的。pg12表示这个包只面向 PostgreSQL 12 的 ABI应用二进制接口因为 PostGIS 的 C 扩展要链接 PostgreSQL 的服务端头文件和postgres.exe的导出符号。PostgreSQL 13 换了部分内部结构12 编译出来的postgis-3.dll拿到 13 上加载会直接失败。3.4.2是 PostGIS 自身的版本号属于 3.4 系列的一个修订版主要修的是几何运算和栅格相关的边界 bug。x64说明是 64 位32 位 PostgreSQL 用不了。所以这个文件名本身就是一份兼容性声明PostgreSQL 12 PostGIS 3.4.2 64 位 Windows三者缺一不可。选这个包而不是自己编译理由很实际。Windows 上从源码编译 PostGIS 需要 MSVC、GEOS、PROJ、GDAL、JSON-C、LibXML2 一整条依赖链光 GEOS 的版本和 PROJ 的数据目录就能耗掉半天。官方和社区维护的 bundle 包把这些依赖都静态或动态打包好了解压即用。代价是灵活性差你想换 GEOS 版本、想开某个编译选项bundle 包给不了。但对绝大多数做业务开发的人来说稳定跑起来比可定制重要得多。2.2 解压后你会看到什么一份目录对照表把 zip 解压到一个临时目录结构通常是这样不同打包者略有差异但核心目录一致目录/文件作用目标位置bin/shp2pgsql.exe、pgsql2shp.exe、raster2pgsql.exe等命令行工具PostgreSQL 的bin/lib/postgis-3.dll、依赖的 GEOS/PROJ 等 dllPostgreSQL 的lib/share/extension/postgis.control、postgis--3.4.2.sql等扩展定义PostgreSQL 的share/extension/share/contrib/部分辅助脚本视包而定通常合并进 extensiongdal-data/GDAL 的坐标参考数据需要配环境变量指向它proj/PROJ 的坐标转换数据需要配环境变量指向它关键点share/extension/里的.control和.sql文件决定了CREATE EXTENSION postgis能不能被识别。如果只拷了 dll 没拷 extension 文件数据库会告诉你「extension postgis is not available」。反过来只拷了 extension 文件没拷 dll创建时会报「could not load library」。2.3 装之前必须确认的三件事第一确认 PostgreSQL 12 的安装路径。默认在C:\Program Files\PostgreSQL\12但很多人装到了 D 盘或自定义目录。用psql --version和where psql交叉确认。第二确认服务端和客户端位数一致都是 64 位。第三停掉 PostgreSQL 服务再拷文件否则 dll 被占用会拷不进去。这三件事任何一件没做后面都会以各种奇怪的报错形式还回来。3. 手把手落地从解压到 CREATE EXTENSION 成功3.1 拷贝文件的正确顺序与命令先停服务再拷贝顺序不能反。用管理员权限打开 CMD 或 PowerShell# 停掉 PostgreSQL 12 服务服务名通常是 postgresql-x64-12 net stop postgresql-x64-12 # 假设 zip 解压到了 D:\temp\postgis-bundle # PostgreSQL 装在 C:\Program Files\PostgreSQL\12 set PG_HOMEC:\Program Files\PostgreSQL\12 set BUNDLED:\temp\postgis-bundle # 拷贝命令行工具 xcopy /Y /E %BUNDLE%\bin\* %PG_HOME%\bin\ # 拷贝 dll xcopy /Y /E %BUNDLE%\lib\* %PG_HOME%\lib\ # 拷贝扩展定义这一步最关键 xcopy /Y /E %BUNDLE%\share\extension\* %PG_HOME%\share\extension\逻辑说明xcopy /Y覆盖时不提示/E连空目录一起拷。分三步而不是一次性拷整个目录是为了让你清楚每一类文件去了哪出问题时能定位。参数上PG_HOME和BUNDLE用变量存起来避免路径里有空格时命令被截断——Program Files里的空格是新手翻车的经典原因。3.2 配置 GDAL 和 PROJ 的数据路径PostGIS 做坐标转换依赖 PROJ 的数据文件做栅格依赖 GDAL 的数据文件。bundle 包里通常自带但需要告诉系统去哪找。在系统环境变量里加两个# 指向包里的 proj 数据目录注意路径按你实际解压位置改 setx PROJ_LIB D:\temp\postgis-bundle\proj setx GDAL_DATA D:\temp\postgis-bundle\gdal-datasetx写的是用户级环境变量写完要重开终端才生效。如果你把 proj 目录也拷进了 PostgreSQL 安装目录那就指向那个位置。这一步不做ST_Transform会报「Cannot find proj.db」空间参考系转换全部失效。很多人装完 PostGIS 测试SELECT PostGIS_Version()通过就以为万事大吉结果一用坐标转换就崩根子就在这里。3.3 启动服务并创建扩展# 启动服务 net start postgresql-x64-12 # 连到你的业务库注意用超级用户 psql -U postgres -d your_gis_db # 在 psql 里执行 CREATE EXTENSION postgis; CREATE EXTENSION postgis_raster; -- 需要栅格功能再加 CREATE EXTENSION postgis_topology; -- 需要拓扑功能再加CREATE EXTENSION postgis会读取share/extension/postgis.control找到对应版本的 sql 脚本执行把几百个函数、类型、操作符注册进当前数据库。注意扩展是装到「数据库」级别的不是装到 PostgreSQL 实例级别。你在 A 库创建了B 库还得再创建一次。postgis_raster和postgis_topology是可选组件不用栅格和拓扑就别装少一堆函数少一份维护负担。3.4 验证装没装成功的四条命令-- 1. 看版本能返回 3.4.2 说明核心库加载成功 SELECT PostGIS_Version(); -- 2. 看 GEOS 和 PROJ 版本确认依赖链完整 SELECT PostGIS_Full_Version(); -- 3. 做一个真实的几何运算验证 GEOS 能用 SELECT ST_Area(ST_GeomFromText(POLYGON((0 0,1 0,1 1,0 1,0 0)))); -- 4. 做一次坐标转换验证 PROJ 数据路径对 SELECT ST_AsText(ST_Transform(ST_GeomFromText(POINT(116.4 39.9),4326),3857));第 3 条返回 1第 4 条返回一个 Web Mercator 坐标才算真正装好。只跑第 1 条通过就收工是「postgis安装失败」这类搜索词居高不下的主要原因——表面成功一用就废。4. 参数与配置让 PostGIS 在 pg12 上跑得稳4.1 postgresql.conf 里值得改的三个参数PostGIS 本身不需要太多特殊配置但空间数据量大几个通用参数要调参数默认值建议值理由shared_buffers128MB内存的 25%空间索引和几何缓存吃内存work_mem4MB32MB~64MB复杂几何运算排序会溢出到磁盘maintenance_work_mem64MB256MB~512MB建空间索引时加速明显改完postgresql.conf要重启服务。work_mem不要无脑调太大它是「每个排序/哈希操作」的上限并发高时会成倍占用内存设成 64MB 在几十个并发下就可能把内存吃满。4.2 空间索引的建立与生效判断装完 PostGIS 第一件事通常是给几何列建 GiST 索引-- 假设表是 roads几何列是 geom CREATE INDEX idx_roads_geom ON roads USING GIST (geom); -- 让查询规划器收集统计信息 ANALYZE roads; -- 用 EXPLAIN 确认索引被用上 EXPLAIN ANALYZE SELECT * FROM roads WHERE ST_Intersects(geom, ST_MakeEnvelope(116.0,39.5,116.8,40.2,4326));判断索引生效看执行计划里有没有Index Scan using idx_roads_geom。如果显示Seq Scan常见原因是表太小规划器觉得全表扫更快或者几何列的 SRID 和查询条件不一致导致无法用索引。ST_Intersects这类函数要能用索引写法上必须让几何列裸奔在操作符左边别包函数。4.3 栅格扩展的额外配置如果你装了postgis_raster栅格数据默认存在数据库里大栅格会撑爆表空间。常见做法是把栅格文件放磁盘数据库只存路径和元数据用ST_FromGDALRaster或 out-db raster。out-db 需要在postgresql.conf里确认服务账户对栅格目录有读权限Windows 下服务默认以NETWORK SERVICE或本地系统账户运行权限不对会报「could not open raster file」。5. 避坑与排查postgis安装失败的五种真实翻车5.1 报错 could not load library postgis-3.dll现象CREATE EXTENSION postgis时报无法加载 dll或提示缺少某个依赖 dll。 原因lib/目录没拷全或者依赖的 GEOS、PROJ dll 不在 PostgreSQL 的lib/或系统 PATH 里。bundle 包有时把依赖 dll 放在子目录拷贝时漏了。 解决用 Dependency Walker 或dumpbin /dependents postgis-3.dll看它依赖哪些 dll逐个确认在PG_HOME\lib下存在。最省事的做法是把 bundle 的lib整个目录内容平铺拷进去别只挑postgis-3.dll。5.2 报错 extension postgis is not available现象psql 里执行创建扩展提示扩展不可用\dx也看不到。 原因share/extension/下的postgis.control没拷进去或拷到了错误层级比如多套了一层extension目录。 解决确认PG_HOME\share\extension\postgis.control这个文件存在。用SELECT * FROM pg_available_extensions WHERE namepostgis;查如果查不到就是文件位置不对。注意 control 文件里的directory字段和实际 sql 文件路径要匹配。5.3 ST_Transform 报 Cannot find proj.db现象版本查询正常几何运算正常一做坐标转换就报找不到 proj.db。 原因PROJ_LIB环境变量没设或设了但 PostgreSQL 服务没读到。Windows 服务启动时读的是系统级环境变量你在当前终端set的只对当前会话有效。 解决用setx写用户级或系统级变量然后重启 PostgreSQL 服务。验证方法是在 psql 里执行SHOW看不到环境变量得直接跑一次ST_Transform试。实在不行把 proj 数据目录拷到 PostgreSQL 安装目录下用相对路径兜底。5.4 装完 PostGIS 后原有查询变慢现象装之前某些查询挺快装完 PostGIS 反而慢了。 原因多半是建了空间索引但没ANALYZE规划器统计信息过期选错了执行计划或者work_mem太小导致几何排序落盘。 解决对涉及几何列的表执行ANALYZE必要时VACUUM ANALYZE。用EXPLAIN (ANALYZE, BUFFERS)看实际耗时花在哪别凭感觉调参数。5.5 升级或卸载时残留旧版本现象想从 3.4.2 换到别的版本直接覆盖文件后创建扩展报版本冲突。 原因数据库里已经注册了 3.4.2 的扩展postgis.control换了但数据库元数据没更新。 解决先在每个用过的库里ALTER EXTENSION postgis UPDATE;或DROP EXTENSION postgis CASCADE;再重装。覆盖文件前备份share/extension目录出问题能回滚。血泪经验别在生产的业务库上直接覆盖 dll先在测试库走一遍升级路径。6. 进阶技巧把 bundle 包用成可复现的部署单元装一次成功不算本事能在多台机器、多个环境稳定复现才算。我一般会把 bundle 包和一套脚本打包成一个部署单元脚本里做三件事校验 PostgreSQL 版本、按顺序拷贝、跑验证 SQL。校验版本这步很多人省结果在 pg13 上装 pg12 的包报一堆看不懂的错。# 校验 PostgreSQL 大版本是否为 12 for /f tokens2 delims %%v in (psql --version) do set PGVER%%v echo %PGVER% | findstr /B 12. nul if errorlevel 1 ( echo PostgreSQL 版本不是 12停止安装 exit /b 1 )这段批处理取psql --version输出的版本号判断是不是以12.开头。不是就退出避免在错误版本上瞎折腾。参数上tokens2 delims是按空格切分取第二段psql --version的输出格式是psql (PostgreSQL) 12.x第二段就是版本号。验证 SQL 我习惯写成一个.sql文件装完直接psql -f verify.sql里面就是第 3.4 节那四条命令任何一条失败就退出非零码方便接进 CI 或批处理。这样一套下来换台机器只要改两个路径变量五分钟能复现一套可用的空间数据库。一个具体技巧把PROJ_LIB和GDAL_DATA不写死在系统环境变量里而是在启动 PostgreSQL 服务的包装脚本里临时设置。Windows 下可以用pg_ctl配合一个.bat在start之前set好变量。这样多个 PostgreSQL 实例共存时各自的 PROJ 数据目录不会互相污染。我吃过这个亏一台机器上跑着 pg12 和 pg14 两套 PostGIS系统级PROJ_LIB只能指向一个结果另一套的坐标转换时好时坏排查了大半天才定位到是环境变量打架。后来改成每个实例独立设置再没出过玄学问题。装 PostGIS 这件事难点从来不在技术本身而在版本、路径、环境变量这些琐碎细节的排列组合。postgis-bundle-pg12-3.4.2x64.zip这个包把最难的编译环节省了剩下的就是按顺序、按版本、按路径老老实实做。我现在装任何环境第一件事是确认版本号第二件事是停服务第三件事是拷完立刻验证坐标转换。这三步养成习惯能省掉后面百分之八十的排查时间。希望帮到你。本文还有配套的精品资源点击获取