文章目录
环境
系统平台:Linux x86-64 Red Hat Enterprise Linux 7
版本:14
文档用途
本文介绍pgsql-ogr-fdw的使用。
详细信息
在现代地理信息系统(GIS)和空间数据分析中,PostgreSQL是一个广泛使用的数据库系统,特别是其与PostGIS扩展结合后,成为了处理空间数据的强大工具。然而,在实际应用中,往往需要与各种外部数据源进行交互,如Shapefiles、GeoJSON、KML等,这时候pgsql-ogr-fdw就显得尤为重要。
1、简介
pgsql-ogr-fdw是PostgreSQL的外部数据包装器,基于GDAL/OGR库开发。它允许用户将多种格式的空间数据(如 Shapefile、GeoJSON、KML、CSV 等)直接映射为PostgreSQL数据库中的虚拟表,并通过SQL进行查询和分析,无需预先导入数据。结合PostGIS扩展,用户可以实现复杂的空间运算(如相交、缓冲区分析等),形成完整的地理信息处理流水线。pgsql-ogr-fdw基于PostgreSQL平台扩展性,PostGIS和GDAL/OGR的功能完整性和数据兼容性,具有以下核心优势:
1)广泛的数据格式支持 支持所有GDAL/OGR兼容的矢量数据格式,覆盖超过100种常见空间数据格式,包括:
-
文件格式:ESRI Shapefile、GeoJSON、KML、GPKG、CSV、GML、Excel 等;
-
网络服务:WFS(Web Feature Service)、GeoPackage 等;
2)与 PostGIS 深度集成
-
支持将外部几何数据自动转换为PostGIS的geometry类型,直接调用空间函数(如 ST_Within、ST_Distance)。
-
允许通过视图(View)或 CTE(公共表表达式)将外部数据与本地表联合查询。
3)灵活的数据操作
-
动态筛选:在创建外部表时,通过 SQL 语句预过滤数据。
-
编码处理:支持指定字符编码(如 GBK、UTF-8),解决乱码问题。
-
投影转换:利用 PostGIS 的 ST_Transform 函数动态转换坐标系。
4)轻量级与高性能
-
无需全量导入数据,按需读取,节省存储空间。
-
支持对常用格式(如 GeoJSON、CSV)的索引优化查询。
2、安装
pgsql-ogr-fdw要求PostgreSQL 11及以上版本,依赖PostGIS,此处忽略PostGIS安装,PostGIS安装相对比较困难,并且各依赖之间还有版本匹配关系。ogr_fdw源码包从Git下载,解压后执行make && make install即可安装,但需要:
- 编译安装用户能够访问到pg_config命令;
- 编译安装用户能够访问到gdal-config命令;
- 会缺少各种so文件;
以上解决方案:命令错误则在/usr/bin下创建软链接,so错误在/usr/lib64下创建软链接。 然后执行create extension ogr_fdw,则安装完毕。
3、详细功能
pgsql-ogr-fdw提供了4个关键函数来帮助用户设置和管理外部数据源,包括:ogr_fdw_handler,ogr_fdw_validator,ogr_fdw_version和ogr_fdw_drivers。
ogr_fdw_handler是一个用于创建和管理OGR FDW对象的处理器函数,定义了如何与外部数据源进行交互,包括读取和写入数据的方法;通常在创建外部服务器对象时使用,并且是通过指定FOREIGN DATA WRAPPER参数来关联到 ogr_fdw的。
ogr_fdw_validator函数用于验证传递给ogr_fdw的选项是否合法以及是否正确配置。这对于确保外部数据源能够被正确访问至关重要。当创建或修改外部服务器、外部表等对象时,PostgreSQL将自动调用此验证器函数来检查提供的选项。
ogr_fdw_version提供了一种方法来查询当前安装的ogr_fdw扩展的版本号。这对于调试问题、确保兼容性或了解所使用的功能特性非常有用。
sql
postgres=# SELECT ogr_fdw_version();
ogr_fdw_version
----------------------------
OGR_FDW="1.1" GDAL="3.5.1"
ogr_fdw_drivers函数列出了当前ogr_fdw支持的所有OGR驱动程序。由于OGR支持多种地理空间数据格式,了解这些驱动程序可以帮助确定可以连接到哪些类型的数据源。
sql
postgres=# select ogr_fdw_drivers();
ogr_fdw_drivers
-------------------------------------------------------------------
{ESRIC,PCIDSK,PDS4,VICAR,PDF,MBTiles,EEDA,OGCAPI,"ESRI Shapefile","MapInfo File","UK .NTF",OGR_SDTS,S57,DGN,OGR_VRT,Memory,CS
V,GML,GPX,KML,GeoJSON,GeoJSONSeq,ESRIJSON,TopoJSON,OGR_GMT,GPKG,SQLite,WAsP,OpenFileGDB,DXF,CAD,FlatGeobuf,Geoconcept,GeoRSS,V
FK,PGDUMP,OSM,GPSBabel,OGR_PDS,WFS,OAPIF,EDIGEO,SVG,Idrisi,Elasticsearch,Carto,AmigoCloud,SXF,Selafin,JML,PLSCENES,CSW,VDV,MVT
,NGW,MapML,TIGER,AVCBin,AVCE00,HTTP}
3.1 ogr_fdw对GIS数据文件或服务的支持力度
以下,执行ogr_fdw_info -f可以查看ogr_fdw对GIS数据文件或服务是否可读还是可写。
sql
[pg14@localhost ~]$ ogr_fdw_info -f
Supported Formats:
-> "PCIDSK" (read/write)
-> "PDS4" (read/write)
-> "VICAR" (read/write)
-> "PDF" (read/write)
-> "MBTiles" (read/write)
-> "EEDA" (readonly)
-> "OGCAPI" (readonly)
-> "ESRI Shapefile" (read/write)
-> "MapInfo File" (read/write)
-> "UK .NTF" (readonly)
-> "OGR_SDTS" (readonly)
-> "S57" (read/write)
-> "DGN" (read/write)
-> "OGR_VRT" (readonly)
-> "Memory" (read/write)
-> "CSV" (read/write)
-> "GML" (read/write)
-> "GPX" (read/write)
-> "KML" (read/write)
-> "GeoJSON" (read/write)
-> "GeoJSONSeq" (read/write)
-> "ESRIJSON" (readonly)
-> "TopoJSON" (readonly)
-> "OGR_GMT" (read/write)
-> "GPKG" (read/write)
-> "SQLite" (read/write)
-> "WAsP" (read/write)
-> "OpenFileGDB" (readonly)
-> "DXF" (read/write)
-> "CAD" (readonly)
-> "FlatGeobuf" (read/write)
-> "Geoconcept" (read/write)
-> "GeoRSS" (read/write)
-> "VFK" (readonly)
-> "PGDUMP" (read/write)
-> "OSM" (readonly)
-> "GPSBabel" (read/write)
-> "OGR_PDS" (readonly)
-> "WFS" (readonly)
-> "OAPIF" (readonly)
-> "EDIGEO" (readonly)
-> "SVG" (readonly)
-> "Idrisi" (readonly)
-> "Elasticsearch" (read/write)
-> "Carto" (read/write)
-> "AmigoCloud" (read/write)
-> "SXF" (readonly)
-> "Selafin" (read/write)
-> "JML" (read/write)
-> "PLSCENES" (readonly)
-> "CSW" (readonly)
-> "VDV" (read/write)
-> "MVT" (readonly)
-> "NGW" (read/write)
-> "MapML" (read/write)
-> "TIGER" (readonly)
-> "AVCBin" (readonly)
-> "AVCE00" (readonly)
-> "HTTP" (readonly)
3.2 访问ESRI Shapefile文件
使用ogr_fdw_info命令可以查看ESRI Shapefile文件的信息,可以生成FDW脚本。
sql
#查看ESRI Shapefile文件信息
[pg14 ~]$ ogr_fdw_info -s /opt/package/shp/gadm36_CAN_0.shp
Format: ESRI Shapefile
Layers:
gadm36_CAN_0
#生成ESRI Shapefile FDW脚本
[pg14 ~]$ ogr_fdw_info -s /opt/package/shp/gadm36_CAN_0.shp -l gadm36_CAN_0
CREATE SERVER myserver
FOREIGN DATA WRAPPER ogr_fdw
OPTIONS (
datasource '/opt/package/shp/gadm36_CAN_0.shp',
format 'ESRI Shapefile');
CREATE FOREIGN TABLE gadm36_can_0 (
fid bigint,
geom Geometry(Polygon,4326),
gid_0 varchar(80),
name_0 varchar(80)
) SERVER myserver
OPTIONS (layer 'gadm36_CAN_0');
以上因选择数据不合理,全屏都是16进制数据,不再展示查询。
3.3 访问WFS GIS服务
借用天地图的WFS服务展示功能,先创建SERVER,再创建表。
sql
CREATE SERVER geoserver
FOREIGN DATA WRAPPER ogr_fdw
OPTIONS (
datasource 'WFS:http://gisserver.tianditu.gov.cn/TDTService/wfs',
format 'WFS' );
CREATE FOREIGN TABLE topp_states (
OBJECTID bigint,
GB bigint,
RN text,
NAME text,
TYPE text,
Shape_Leng double precision,
line Geometry(MultiLineString,4326)
)
SERVER "geoserver"
OPTIONS (layer 'TDTService:LRRL');
3.4 访问GDB数据文件
使用ogr_fdw_info命令可以查看GDB文件的信息,可以生成FDW脚本。
sql
[pg14@localhost package]$ ogr_fdw_info -s gdb.gdb
Format: OpenFileGDB
Layers:
湖泊注记
山脉
省界色带
地级市行政中心
县级行政中心
省级行政中心
河流
面状水域
境界线
县级界
山峰
水库注记
海岸线
省级行政区
市级行政区
县级行政区
岛屿注记
港湾注记
群列岛注记
河流注记
说明注记
[pg14@localhost package]$ ogr_fdw_info -s gdb.gdb -l 水库注记
CREATE SERVER my_gdb_server
FOREIGN DATA WRAPPER ogr_fdw
OPTIONS ( datasource '/opt/package/gdb.gdb', format 'OpenFileGDB');
CREATE FOREIGN TABLE fdw_table_water (
fid bigint,
shape Geometry(Point,9001),
name varchar(50),
sname varchar(20),
dj varchar(20),
type varchar(20),
proname varchar(50)
) SERVER my_gdb_server
OPTIONS (layer '水库注记');
--查询表数据如下:
postgres=# select fid,shape,name from fdw_table_water;
fid | shape | name
-----+----------------------------------------------------+-----------
2 | 010100002029230000E0141DA9CCBF224104780BA411E54541 | 街面水库
5 | 01010000202923000040A4DFFE057B1C41506B9A5789E74441 | 棉花滩水库
6 | 01010000202923000048D8F0F4FC35244188855A6B60504641 | 水口水库
7 | 0101000020292300002041F1E38BC32441F8C2647ADF9D4541 | 金钟水库
8 | 01010000202923000020B9FCC7343B254118265335F08C4541 | 东圳水库
9 | 010100002029230000D022DB19A4D3214124DBF95EEBF84441 | 上存水库
10 | 010100002029230000A82C433CD65F2041545227B0D1534441 | 峰头水库
11 | 010100002029230000509621AE7ECB234104121407274F4541 | 山美水库
12 | 010100002029230000C0E3149D3807244138D6C5652F384541 | 惠女水库
13 | 01010000202923000048BF7D9D3B0E26412C8716D124B04541 | 东张水库
14 | 01010000202923000078711BADD18E26415C643BB72C464641 | 山仔水库
15 | 01010000202923000040FAED6BCD2B2641647FD92566B14641 | 洪口水库
16 | 01010000202923000078832F6C6E6426417CF2B0D8A9024741 | 芹山水库
17 | 01010000202923000070A3017CE95B2241705F078E7B7D4741 | 东溪水库
18 | 01010000202923000070D71212B29D22411C7C612AEA6A4641 | 沙溪口水库
19 | 0101000020292300005027A0C9552723418C976EAA74114641 | 水东水库
20 | 01010000202923000078A52C2393052041D812F2494C7F4541 | 白沙水库
23 | 01010000202923000020FDF6B506C51F4124DBF90EBEE44441 | 南一水库
以上测试了ogr_fdw访问常用GIS数据文件和服务的例子,根据例子看使用相对简单,但是由于GIS数据数据量相对较大,使用时需要考虑数据传输和展示问题。
4、最佳实践
pgsql-ogr-fdw基于GDAL/OGR库实现,使得pgsql-ogr-fdw能够访问多种地理空间数据格式,包括但不限于ESRI Shapefile、GeoJSON、GML等,这使得整合来自不同来源的数据变得简单。用户可以使用标准的SQL语句对远程数据执行查询,极大地简化了数据分析和处理流程,无需额外学习新的查询语言或工具。直接从原数据源读取数据,避免了将大量数据导入到PostgreSQL的过程,节省了时间和存储资源。
对于大型数据集或者复杂的查询操作,直接从外部数据源读取数据可能会导致性能问题。因为所有数据处理都发生在原始数据源上,这可能限制了查询效率。pgsql-ogr-fdw依赖于OGR库的支持,这意味着其功能和稳定性受制于OGR库的质量及其对特定数据格式的支持程度,加上还需要PostGIS支持,使其安装相对困难。尽管基本的设置过程较为直观,但针对特定需求进行优化配置(例如调整性能参数、解决兼容性问题)可能需要一定的技术知识和经验。如果应用要求频繁地对数据进行更新或写入操作,pgsql-ogr-fdw可能不是最佳选择,因为它主要用于读取数据,并且对写入的支持有限。
pgsql-ogr-fdw是一个强大的工具,特别适合用于分析和查询多种格式的地理空间数据而无需将其导入到PostgreSQL中。然而,在考虑使用它时,也需要权衡其潜在的性能挑战以及对外部库的依赖性。对于特定的应用场景,特别是那些涉及大量实时数据更新的需求,可能需要探索其他解决方案。
5、卸载
pgsql-ogr-fdw在卸载时,需确定没有任何对象或功能还在引用pgsql-ogr-fdw提供的任何对象后,执行"drop extension xxx;",就可以卸载pgsql-ogr-fdw, 并删除其创建的数据库对象。