安装 pgsql 将gis数据入库
一、根据您提供的系统信息(CentOS 7,内核版本 3.10.0-957.el7.x86_64),以下是 PostgreSQL 的安装指南:
一、安装步骤
-
添加 PostgreSQL YUM 源
安装官方仓库 RPM 包
sudo yum install -y
https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
-
安装 PostgreSQL 服务端与客户端
sudo yum install -y postgresql12-server
2.初始化数据库
使用 PostgreSQL 12 的初始化命令
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
3.启动服务并设置开机自启
sudo systemctl enable postgresql-12 sudo systemctl start postgresql-12
二、配置远程访问
-
修改监听地址
编辑配置文件:sudo vim /var/lib/pgsql/12/data/postgresql.conf
修改以下参数:
注意!!去掉 #
listen_addresses = '*'
# 允许所有IP连接
port = 5432
# 默认端口
1.配置客户端认证
编辑 pg_hba.conf
:
添加规则允许远程访问(IPv4):
TYPE DATABASE USER ADDRESS METHOD
"local" is for Unix domain socket connections only
local all all peer
IPv4 local connections:
#host all all 127.0.0.1/32 ident
IPv6 local connections:
#host all all ::1/128 ident
原内容(IPv4本地连接):
#host all all 127.0.0.1/32 ident
修改后:
host all all 127.0.0.1/32 md5
原内容(IPv6本地连接):
#host all all ::1/128 ident
修改后:
host all all ::1/128 md5
Allow replication connections from localhost, by a user with the
replication privilege.
local replication all peer
host replication all 127.0.0.1/32 ident
host replication all ::1/128 ident
host all all 0.0.0.0/0 md5 # 允许所有IPv4远程连接
host all all ::/0 md5 # 允许所有IPv6远程连接
2.重启服务生效配置
sudo systemctl restart postgresql-15
3.防火墙放行端口
sudo firewall-cmd --permanent --add-port=5432/tcp
sudo firewall-cmd --reload
三、数据库初始化与用户管理
-
设置 postgres 用户密码
切换到 postgres
用户:
sudo su - postgres psql
执行 SQL 命令:
ALTER USER postgres WITH PASSWORD 'your_password'; \q # 退出
2.创建新数据库和用户(可选)
CREATE DATABASE testdb; CREATE USER testuser WITH PASSWORD 'test123'; GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;
四、验证安装
-
本地连接测试
psql -U postgres -h 127.0.0.1 -d postgres
SELECT version()
sudo netstat -tulnp | grep 5432
如果没有netstat 请执行该命令安装组件
sudo yum install -y net-tools
远程连接测试 从其他机器执行:
psql -h 192.168.200.146 -U postgres -d postgres -W
以下是安装PostGIS扩展并导入GIS数据的完整流程及操作指南,基于最佳实践和官方文档整合:
二、安装PostGIS扩展
1. 确认PostgreSQL版本兼容性
-
PostGIS版本必须与PostgreSQL主版本一致(例如PostgreSQL 12对应PostGIS 3.0_12)。通过命令检查PostgreSQL版本:
-
psql --version
2. 安装PostGIS扩展
添加PostgreSQL官方YUM源
sudo yum install -y
https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 安装PostGIS
sudo yum install postgis30_12
-
Windows:
-
使用PostgreSQL安装时的Stack Builder工具,勾选对应版本的PostGIS组件
-
3. 启用PostGIS扩展
-
连接到目标数据库,执行以下SQL启用扩展:
-
CREATE EXTENSION postgis;
CREATE EXTENSION postgis_topology;
-- 可选,用于拓扑功能
CREATE EXTENSION fuzzystrmatch;
-- 可选,用于地理编码
-
验证安装:
-
SELECT PostGIS_Full_Version();
-- 查看完整版本信息
三、准备GIS数据导入
1. 数据格式要求
-
支持格式:Shapefile(
.shp
)、GeoJSON、KML等。确保文件路径无中文或空格,文件名仅含英文
2. 设置空间参考标识(SRID)
-
常用SRID:
-
4326
:WGS84地理坐标系(经纬度) -
3857
:Web Mercator投影坐标系(地图服务常用)
-
-
通过
SELECT ST_SRID(geom) FROM table;
检查现有数据的SRID。
四、导入GIS数据
方法一:使用PostGIS Shapefile导入工具
-
启动工具:
-
Windows:开始菜单搜索 PostGIS Shapefile Import/Export Manager。
-
Linux:命令行运行
shp2pgsql-gui
(需安装postgis-gui
包)
-
-
操作步骤:
-
连接数据库:输入主机、端口、数据库名、用户名、密码。
-
添加Shapefile:点击 Add File 选择
.shp
文件。 -
配置选项:
-
SRID:设为数据的坐标系代码(如4326)。
-
表名:自定义目标表名。
-
编码:选择
GBK
或UTF-8
(中文数据需选GBK)
-
-
执行导入:点击 Import,日志显示成功即完成。
-
方法二:命令行工具(shp2pgsql
)
生成SQL文件并导入
shp2pgsql -s 4326 -W GBK /path/to/data.shp public.table_name | psql -h localhost -U postgres -d your_database
-
参数说明:
-
-s 4326
:设置SRID。 -
-W GBK
:指定文件编码(中文必选)。 -
-I
:自动创建空间索引
-
方法三:GDAL ogr2ogr
工具
ogr2ogr -f PostgreSQL PG:"host=localhost dbname=your_db user=postgres password=your_pwd" input.geojson -nln target_table -lco GEOMETRY_NAME=geom
-
支持GeoJSON、KML等格式,需提前安装GDAL
五、验证数据导入
1.查看数据表结构:
\d+ table_name
-- 显示表结构,确认包含几何字段(如geom)
2.空间查询示例:
-- 查询所有点的坐标
SELECT name, ST_AsText(geom) FROM table_name;
-- 查找半径1公里内的点
SELECT * FROM table_name
WHERE ST_DWithin(geom, ST_GeomFromText('POINT(经度 纬度)', 4326), 1000);
3.可视化检查:
使用 pgAdmin 的几何查看器,执行
SELECT geom FROM table_name LIMIT 1;
查看图形
六、性能优化
1. 创建空间索引
CREATE INDEX idx_table_geom ON table_name USING GIST (geom);
2. 更新统计信息
VACUUM ANALYZE table_name;
-- 优化查询计划
七、常见问题解决
-
导入失败:缺少扩展
-
错误:
ERROR: type "geometry" does not exist
-
解决:确保执行了
CREATE EXTENSION postgis;
-
-
中文乱码
-
解决:导入时添加
-W GBK
参数,或修改数据库编码为UTF8
-
-
SRID不匹配
-
错误:
ERROR: Operation on mixed SRID geometries
-
解决:统一数据SRID,或使用
ST_Transform
转换坐标系
-
八、高级操作
1. 批量导入多个Shapefile
Bash
for shp in *.shp; do
shp2pgsql -s 4326 -I $shp public.${shp%.*} | psql -d your_db
done
2. 导出数据为GeoJSON
SQL
COPY (
SELECT jsonb_build_object(
'type', 'FeatureCollection',
'features', jsonb_agg(feature)
)
FROM (
SELECT jsonb_build_object(
'type', 'Feature',
'geometry', ST_AsGeoJSON(geom)::jsonb,
'properties', to_jsonb(row) - 'geom'
) AS feature
FROM table_name
) AS features
) TO '/path/to/output.geojson';
通过以上步骤,将GIS数据导入PostgreSQL数据库,并可通过空间查询实现高效分析。如需进一步优化或处理复杂空间操作,可参考PostGIS官方文档或结合QGIS等GIS工具进行可视化操作
报错解决
root@localhost data]# psql --version psql (PostgreSQL) 12.22
[root@localhost data]# sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
已加载插件:fastestmirror pgdg-redhat-repo-latest.noarch.rpm | 10 kB 00:00:00
正在检查 /var/tmp/yum-root-MQ1XQJ/pgdg-redhat-repo-latest.noarch.rpm: pgdg-redhat-repo-42.0-38PGDG.noarch
/var/tmp/yum-root-MQ1XQJ/pgdg-redhat-repo-latest.noarch.rpm:不更新已安装的软件包。
在 CentOS/RHEL 7 上安装 PostGIS 3.0 for PostgreSQL 12 时,您遇到的依赖问题通常是由于缺少基础库或未启用必要的软件仓库导致的。以下是分步解决方案:
-
启用 EPEL 和 PowerTools 仓库
PostGIS 的依赖项(如 hdf5
、libfreexl
等)通常位于 EPEL 和 PowerTools 仓库中:
安装 EPEL 仓库
sudo yum install -y epel-release
# 启用 PowerTools 仓库
sudo yum-config-manager --enable powertools
-
安装基础依赖库
手动安装缺失的依赖项:
sudo yum install -y \
hdf5 \
libfreexl \
libdap \
libgta \
zstd \
netcdf \
cfitsio \
gpsbabel \
CharLS
-
安装 PostGIS 3.0 for PostgreSQL 12
确保已正确配置 PostgreSQL 12 的官方仓库(pgdg-redhat-repo
),然后安装 PostGIS:
sudo yum install -y postgis30_12
-
验证安装
在 PostgreSQL 中启用 PostGIS 扩展:
sudo -u postgres psql -c "CREATE EXTENSION postgis;"
sudo -u postgres psql -c "SELECT PostGIS_Version();"
如果输出显示版本信息(如 3.0.7
),则表示安装成功。
常见问题处理
问题1:仍然提示依赖错误
如果步骤 2 中的依赖项无法通过 yum
安装,尝试从源码编译安装:
示例:手动编译 libfreexl
wget
https://www.gaia-gis.it/gaia-sins/freexl-sources/libfreexl-1.0.6.tar.gz
tar xvf libfreexl-1.0.6.tar.gz
cd libfreexl-1.0.6
./configure && make && sudo make install
问题2:GPSBabel 未找到
如果 gpsbabel
无法通过仓库安装,可以直接从 GPSBabel 官网 下载 RPM 包手动安装。
最终安装命令(整合版)
1. 启用仓库
sudo yum install -y epel-release
sudo yum-config-manager --enable powertools
# 2. 安装基础依赖
sudo yum install -y hdf5 libfreexl libdap libgta zstd netcdf cfitsio gpsbabel CharLS
# 3. 安装 PostGIS
sudo yum install -y postgis30_12
# 4. 重启 PostgreSQL
sudo systemctl restart postgresql-12
验证 PostGIS 功能
在 PostgreSQL 中执行以下命令:
CREATE EXTENSION postgis;
SELECT ST_AsText(ST_Point(1, 2));
-- 应输出 POINT(1 2)
如果成功返回地理信息数据,说明 PostGIS 已正常工作。
根据你的操作记录,PostGIS 3.0 扩展已成功在 PostgreSQL 12 中安装并启用。以下是关键信息总结及后续建议:
安装结果验证
-
扩展创建成功
CREATE EXTENSION
表示 postgis
扩展已正确加载到数据库中
-
版本信息确认 执行
-
SELECT PostGIS_Version()
-
显示版本为 3.0,且依赖项(GEOS、PROJ)已启用,表明核心功能正常
postgis_version: 3.0 USE_GEOS=1 USE_PROJ=1 USE_STATS=1