1. PostGIS 数据导入导出实战指南
作为一名长期从事地理信息系统开发的工程师,我经常需要在不同数据格式和数据库之间转换空间数据。PostGIS 作为 PostgreSQL 的空间数据扩展,提供了强大的空间数据处理能力。今天我将分享几个实用的 PostGIS 数据导入导出技巧,这些都是在实际项目中验证过的可靠方法。
1.1 使用 ogr2ogr 导入 Shapefile
Shapefile 是 GIS 领域最常用的矢量数据格式之一。将 Shapefile 导入 PostGIS 最便捷的方式就是使用 GDAL 的 ogr2ogr 工具:
ogr2ogr -f PostgreSQL PG:"dbname=postgis_cookbook user=me password=mypassword" \ input.shp -nln chp01.countries -lco GEOMETRY_NAME=geom这个命令有几个关键参数需要注意:
-f PostgreSQL指定输出格式为 PostgreSQLPG:"..."是连接字符串,包含数据库名、用户名和密码-nln指定导入后的表名-lco GEOMETRY_NAME设置几何字段名称
提示:如果 Shapefile 使用非标准坐标系,记得用
-a_srs参数指定正确的 SRID,否则导入后可能出现坐标错乱的问题。
1.2 使用 pgsql2shp 导出数据
PostGIS 自带的 pgsql2shp 工具可以将数据导出为 Shapefile:
pgsql2shp -f countries -h localhost -u me -P mypassword \ postgis_cookbook "SELECT * FROM chp01.countries"我经常用这个命令来与只支持 Shapefile 的第三方系统交换数据。几个实用技巧:
- 通过 WHERE 条件可以只导出部分数据
- 导出时添加
-g参数可以指定要导出的几何字段(当表中有多个几何字段时) - 对大表导出时加上
-b参数能显著提高性能
1.3 处理 OpenStreetMap 数据
OpenStreetMap 数据导入需要使用专门的 osm2pgsql 工具:
osm2pgsql -c -d postgis_cookbook -U me -W -H localhost -P 5432 map.osm这个命令会创建四张表:
planet_osm_point点要素planet_osm_line线要素planet_osm_polygon面要素planet_osm_roads道路要素
在实际项目中,我通常会加上--slim参数让工具在数据库中存储中间数据,这样后续更新数据时效率更高。
1.4 栅格数据处理技巧
PostGIS 也支持栅格数据存储和分析。使用 raster2pgsql 导入栅格数据:
raster2pgsql -s 4326 -I -C -M NE1_HR_LC_SR_W_DR.tif -F -t 100x100 \ chp01.ne1_hr_lc_sr_w_dr | psql -d postgis_cookbook -U me关键参数说明:
-t 100x100将大栅格分块存储,提升查询性能-I创建空间索引-C添加栅格约束-F添加文件名字段
对于批量导入多个栅格文件,可以使用通配符:
raster2pgsql -s 4326 -I -C -M *.tif -F -t 100x100 \ chp01.raster_data | psql -d postgis_cookbook -U me2. 常见问题与解决方案
2.1 坐标系问题
导入数据后最常见的错误就是坐标系不匹配。我通常的做法是:
- 先用
ogrinfo -so input.shp查看原始数据的坐标系 - 导入时用
-a_srs EPSG:xxxx明确指定 - 导入后用
ST_SetSRID()修正错误的坐标系
2.2 性能优化
处理大数据量时,这些技巧很有效:
- 导入前先创建好索引
- 使用事务批量提交(默认就是)
- 对大栅格进行分块(-t 参数)
- 关闭JIT编译(SET jit=off)
2.3 数据验证
导入后务必检查:
- 几何有效性:
ST_IsValid(geom) - 坐标系:
SELECT ST_SRID(geom) FROM table LIMIT 1 - 数据完整性:比较源数据和导入数据的记录数
3. 高级技巧
3.1 使用GDAL直接读写PostGIS
GDAL支持直接读写PostGIS中的数据,无需中间文件:
# 导出 gdal_translate -of GTiff "PG:dbname='postgis_cookbook' user='me' table='ne1_hr_lc_sr_w_dr'" output.tif # 导入 gdalwarp -of PostgreSQL "PG:dbname='postgis_cookbook' user='me'" input.tif3.2 自动化脚本
我通常会编写Shell脚本自动化这些流程,包含:
- 数据校验
- 坐标系转换
- 批量导入/导出
- 日志记录
- 错误处理
3.3 数据更新策略
对于需要定期更新的数据源,建议:
- 使用临时表导入新数据
- 用事务处理数据替换
- 维护数据版本信息
- 建立数据变更日志
这些技巧都是我在实际项目中积累的经验,希望能帮助大家更高效地使用PostGIS处理空间数据。如果遇到特殊问题,PostGIS的官方文档和邮件列表都是很好的资源。