
1. PostGIS 数据导入导出实战指南作为一名长期从事地理信息系统开发的工程师我经常需要在不同数据格式和数据库之间转换空间数据。PostGIS 作为 PostgreSQL 的空间数据扩展提供了强大的空间数据处理能力。今天我将分享几个实用的 PostGIS 数据导入导出技巧这些都是在实际项目中验证过的可靠方法。1.1 使用 ogr2ogr 导入 ShapefileShapefile 是 GIS 领域最常用的矢量数据格式之一。将 Shapefile 导入 PostGIS 最便捷的方式就是使用 GDAL 的 ogr2ogr 工具ogr2ogr -f PostgreSQL PG:dbnamepostgis_cookbook userme passwordmypassword \ input.shp -nln chp01.countries -lco GEOMETRY_NAMEgeom这个命令有几个关键参数需要注意-f PostgreSQL指定输出格式为 PostgreSQLPG:...是连接字符串包含数据库名、用户名和密码-nln指定导入后的表名-lco GEOMETRY_NAME设置几何字段名称提示如果 Shapefile 使用非标准坐标系记得用-a_srs参数指定正确的 SRID否则导入后可能出现坐标错乱的问题。1.2 使用 pgsql2shp 导出数据PostGIS 自带的 pgsql2shp 工具可以将数据导出为 Shapefilepgsql2shp -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 jitoff2.3 数据验证导入后务必检查几何有效性ST_IsValid(geom)坐标系SELECT ST_SRID(geom) FROM table LIMIT 1数据完整性比较源数据和导入数据的记录数3. 高级技巧3.1 使用GDAL直接读写PostGISGDAL支持直接读写PostGIS中的数据无需中间文件# 导出 gdal_translate -of GTiff PG:dbnamepostgis_cookbook userme tablene1_hr_lc_sr_w_dr output.tif # 导入 gdalwarp -of PostgreSQL PG:dbnamepostgis_cookbook userme input.tif3.2 自动化脚本我通常会编写Shell脚本自动化这些流程包含数据校验坐标系转换批量导入/导出日志记录错误处理3.3 数据更新策略对于需要定期更新的数据源建议使用临时表导入新数据用事务处理数据替换维护数据版本信息建立数据变更日志这些技巧都是我在实际项目中积累的经验希望能帮助大家更高效地使用PostGIS处理空间数据。如果遇到特殊问题PostGIS的官方文档和邮件列表都是很好的资源。