空间数据导入与导出
Posted: Thu May 29, 2025 3:50 am
在空间数据库中,将地理空间数据导入和导出是日常操作的关键环节。无论是从外部文件加载地理信息到数据库,还是将数据库中的空间数据发布到其他GIS 软件或Web 服务,都需要高效且正确的方法。PostGIS 提供了多种工具和功能来支持这些操作。
1. 常见的空间数据格式
在导入导出之前,了解常见的空间数据格式至关重要。
Shapefile (.shp, .shx, .dbf, .prj 等): 最流行和广泛使用的矢量数据格式,由 Esri 开发。虽然是一个文件集,但通常被称为 Shapefile。
GeoJSON (.geojson): 一种基于 JavaScript Object Notation (JSON) 的开放标准格式,用于表示地理空间数据结构。轻量级,易于在 Web 应用中传输和解析。
KML (Keyhole Markup Language) / KMZ (.kml, .kmz): 基于 XML 的格式,主要用于 Google Earth 和其他三维地球浏览器。KMZ 是 KML 文件的压缩包。
GPX (GPS Exchange Format) (.gpx): 用于交换 GPS 数据(航点、轨迹、路线)。
WKT (Well-Known Text) / WKB (Well-Known Binary): OGC 定义的用于表示几何对象的文本和二进制 特殊数据库 标准。它们不是文件格式,而是几何对象在数据库或内存中表示的方式。
CSV (.csv) / Text File: 可以包含经纬度坐标或WKT 字符串,通过解析转换为空间数据。
2. PostGIS 空间数据导入方法
PostGIS 提供了多种灵活的导入方式。
使用 shp2pgsql 命令行工具 (推荐用于 Shapefile):
这是 PostGIS 官方提供的用于导入 Shapefile 的强大工具,它将 Shapefile 转换为 SQL INSERT 语句。
语法示例:
Bash
# 将Shapefile导入到数据库中名为 'roads' 的表
# -I: 创建空间索引
# -s <SRID>: 指定或转换SRID
# -D: 使用标准SQL INSERT语句
# -c: 创建新表
# -a: 追加数据到现有表
shp2pgsql -I -s 4326 roads.shp public.roads | psql -d your_database_name -U your_username
使用 ogr2ogr (GDAL/OGR 工具包,通用性强):
GDAL/OGR 是一个强大的地理空间数据转换库,ogr2ogr 是其命令行工具,支持几乎所有常见的空间数据格式到 PostGIS 的导入,功能非常强大。
语法示例:
Bash
# 导入GeoJSON到PostGIS,并进行SRID转换
ogr2ogr -f "PostgreSQL" PG:"dbname=your_database_name host=localhost user=your_username password=your_password" your_data.geojson -nln target_table_name -t_srs EPSG:4326
通过 SQL INSERT 语句:
对于包含 WKT 或经纬度的 CSV 或文本文件,可以先将数据导入普通表,然后使用 PostGIS 函数将其转换为几何对象。
示例:
SQL
-- 假设有一个包含 id, name, wkt_geom 的临时表
CREATE TABLE temp_data (id INT, name VARCHAR(100), wkt_geom TEXT);
COPY temp_data FROM '/path/to/your_data.csv' WITH (FORMAT CSV, HEADER TRUE);
-- 从临时表创建正式的空间表
CREATE TABLE your_spatial_table AS
SELECT id, name, ST_GeomFromText(wkt_geom, 4326) AS geom
FROM temp_data;
CREATE INDEX your_spatial_table_geom_idx ON your_spatial_table USING GIST (geom);
3. PostGIS 空间数据导出方法
PostGIS 同样提供了多种导出机制。
使用 pgsql2shp 命令行工具 (推荐用于导出到 Shapefile):
将 PostGIS 表导出为 Shapefile。
语法示例:
Bash
# 将名为 'roads' 的表导出为Shapefile
pgsql2shp -f roads.shp -h localhost -u your_username -P your_password your_database_name "public.roads"
使用 ogr2ogr (GDAL/OGR 工具包,通用性强):
ogr2ogr 也可以将 PostGIS 数据导出到各种空间数据格式。
语法示例:
Bash
# 将PostGIS表导出为GeoJSON
ogr2ogr -f "GeoJSON" output.geojson PG:"dbname=your_database_name host=localhost user=your_username password=your_password" "public.your_table_name"
# 将PostGIS表导出为KML
ogr2ogr -f "KML" output.kml PG:"dbname=your_database_name" "SELECT ST_Transform(geom, 4326) AS geom, name FROM your_table_name WHERE ...;"
注意: 导出到 KML 通常需要将几何对象转换为 WGS84 (4326)。
通过 SQL 查询导出 WKT/GeoJSON 字符串:
可以在 SQL 查询中直接将几何对象转换为 WKT 或 GeoJSON 字符串,然后将查询结果导出为文本文件。
示例 (导出 WKT):
SQL
COPY (SELECT id, name, ST_AsText(geom) FROM your_spatial_table WHERE ...) TO '/path/to/output_wkt.csv' WITH (FORMAT CSV, HEADER TRUE);
示例 (导出 GeoJSON):
SQL
-- 导出单个几何的GeoJSON
SELECT ST_AsGeoJSON(geom) FROM your_spatial_table WHERE id = 1;
-- 导出整个FeatureCollection (需要PostGIS 2.1+)
SELECT json_build_object(
'type', 'FeatureCollection',
'features', json_agg(ST_AsGeoJSON(t.*)::json)
)
FROM your_spatial_table AS t;
PostGIS 提供了灵活多样的工具和函数,以适应各种空间数据的导入和导出需求,是构建和管理地理空间应用的强大后端。
1. 常见的空间数据格式
在导入导出之前,了解常见的空间数据格式至关重要。
Shapefile (.shp, .shx, .dbf, .prj 等): 最流行和广泛使用的矢量数据格式,由 Esri 开发。虽然是一个文件集,但通常被称为 Shapefile。
GeoJSON (.geojson): 一种基于 JavaScript Object Notation (JSON) 的开放标准格式,用于表示地理空间数据结构。轻量级,易于在 Web 应用中传输和解析。
KML (Keyhole Markup Language) / KMZ (.kml, .kmz): 基于 XML 的格式,主要用于 Google Earth 和其他三维地球浏览器。KMZ 是 KML 文件的压缩包。
GPX (GPS Exchange Format) (.gpx): 用于交换 GPS 数据(航点、轨迹、路线)。
WKT (Well-Known Text) / WKB (Well-Known Binary): OGC 定义的用于表示几何对象的文本和二进制 特殊数据库 标准。它们不是文件格式,而是几何对象在数据库或内存中表示的方式。
CSV (.csv) / Text File: 可以包含经纬度坐标或WKT 字符串,通过解析转换为空间数据。
2. PostGIS 空间数据导入方法
PostGIS 提供了多种灵活的导入方式。
使用 shp2pgsql 命令行工具 (推荐用于 Shapefile):
这是 PostGIS 官方提供的用于导入 Shapefile 的强大工具,它将 Shapefile 转换为 SQL INSERT 语句。
语法示例:
Bash
# 将Shapefile导入到数据库中名为 'roads' 的表
# -I: 创建空间索引
# -s <SRID>: 指定或转换SRID
# -D: 使用标准SQL INSERT语句
# -c: 创建新表
# -a: 追加数据到现有表
shp2pgsql -I -s 4326 roads.shp public.roads | psql -d your_database_name -U your_username
使用 ogr2ogr (GDAL/OGR 工具包,通用性强):
GDAL/OGR 是一个强大的地理空间数据转换库,ogr2ogr 是其命令行工具,支持几乎所有常见的空间数据格式到 PostGIS 的导入,功能非常强大。
语法示例:
Bash
# 导入GeoJSON到PostGIS,并进行SRID转换
ogr2ogr -f "PostgreSQL" PG:"dbname=your_database_name host=localhost user=your_username password=your_password" your_data.geojson -nln target_table_name -t_srs EPSG:4326
通过 SQL INSERT 语句:
对于包含 WKT 或经纬度的 CSV 或文本文件,可以先将数据导入普通表,然后使用 PostGIS 函数将其转换为几何对象。
示例:
SQL
-- 假设有一个包含 id, name, wkt_geom 的临时表
CREATE TABLE temp_data (id INT, name VARCHAR(100), wkt_geom TEXT);
COPY temp_data FROM '/path/to/your_data.csv' WITH (FORMAT CSV, HEADER TRUE);
-- 从临时表创建正式的空间表
CREATE TABLE your_spatial_table AS
SELECT id, name, ST_GeomFromText(wkt_geom, 4326) AS geom
FROM temp_data;
CREATE INDEX your_spatial_table_geom_idx ON your_spatial_table USING GIST (geom);
3. PostGIS 空间数据导出方法
PostGIS 同样提供了多种导出机制。
使用 pgsql2shp 命令行工具 (推荐用于导出到 Shapefile):
将 PostGIS 表导出为 Shapefile。
语法示例:
Bash
# 将名为 'roads' 的表导出为Shapefile
pgsql2shp -f roads.shp -h localhost -u your_username -P your_password your_database_name "public.roads"
使用 ogr2ogr (GDAL/OGR 工具包,通用性强):
ogr2ogr 也可以将 PostGIS 数据导出到各种空间数据格式。
语法示例:
Bash
# 将PostGIS表导出为GeoJSON
ogr2ogr -f "GeoJSON" output.geojson PG:"dbname=your_database_name host=localhost user=your_username password=your_password" "public.your_table_name"
# 将PostGIS表导出为KML
ogr2ogr -f "KML" output.kml PG:"dbname=your_database_name" "SELECT ST_Transform(geom, 4326) AS geom, name FROM your_table_name WHERE ...;"
注意: 导出到 KML 通常需要将几何对象转换为 WGS84 (4326)。
通过 SQL 查询导出 WKT/GeoJSON 字符串:
可以在 SQL 查询中直接将几何对象转换为 WKT 或 GeoJSON 字符串,然后将查询结果导出为文本文件。
示例 (导出 WKT):
SQL
COPY (SELECT id, name, ST_AsText(geom) FROM your_spatial_table WHERE ...) TO '/path/to/output_wkt.csv' WITH (FORMAT CSV, HEADER TRUE);
示例 (导出 GeoJSON):
SQL
-- 导出单个几何的GeoJSON
SELECT ST_AsGeoJSON(geom) FROM your_spatial_table WHERE id = 1;
-- 导出整个FeatureCollection (需要PostGIS 2.1+)
SELECT json_build_object(
'type', 'FeatureCollection',
'features', json_agg(ST_AsGeoJSON(t.*)::json)
)
FROM your_spatial_table AS t;
PostGIS 提供了灵活多样的工具和函数,以适应各种空间数据的导入和导出需求,是构建和管理地理空间应用的强大后端。