PostgreSQL/邮政地理信息系统

司机简称

《PostgreSQL》

生成依赖项

PostgreSQL客户端库(libpq)

这个驱动程序实现了对PostgreSQL中空间表的访问支持,扩展了 PostGIS 空间数据支持。驱动程序中存在一些支持,可用于不带PostGIS但功能较少的PostgreSQL。

此驱动程序需要连接到Postgres数据库。如果您想准备一个SQL转储,以便以后将其注入Postgres数据库,则可以使用 PostgreSQL SQL Dump driver .

您可以在 Advanced OGR PostgreSQL driver Information 页。

驱动程序功能

Supports Create()

This driver supports the GDALDriver::Create() operation

Supports Georeferencing

This driver supports georeferencing

连接到数据库

要连接到Postgres数据源,请使用连接字符串指定数据库名称,并根据需要使用其他参数。PG:前缀用于将名称标记为postgres连接字符串。
PG:dbname=databasename

PG:"dbname='databasename' host='addr' port='5432' user='x' password='y'"

在此语法中,每个参数设置的格式为keyword=value。等号周围的空格是可选的。要写入空值或包含空格的值,请用单引号将其括起来,例如keyword='a value'。值中的单引号和反斜杠必须用反斜杠转义,即'和。

从GDAL 3.1开始,还支持以下语法:

PG:service=servicename

Starting with GDAL 3.4, the URI syntax is also supported

postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
也可以省略数据库名称并连接到 违约 数据库,与用户名相同。
Note :我们使用PQconnectdb()建立连接。详见 PostgreSQL libpq documentation

几何列

如果 geometry_columns 表存在(即对访问的数据库启用PostGIS),然后在 geometry_columns 表将被视为OGR层。否则(对访问的数据库禁用PostGIS),所有常规用户表和命名视图都将被视为层。

驱动程序还支持 geography PostGIS 1.5中引入的列类型。

驱动程序还支持读取和写入以下非线性几何体类型:圆形字符串、复合曲线、曲线多边形、多曲线和多曲面

SQL语句

默认情况下,PostgreSQL驱动程序将SQL语句直接传递给PostgreSQL,而不是在对OGRDataSource使用ExecuteSQL()调用或对ogr2ogr使用-SQL命令选项时在内部对其求值。属性查询表达式也直接传递给PostgreSQL。也可以请求ogr Pg驱动程序使用 OGR SQL 发动机,通过 “OGRSQL” ExecuteSQL()方法的字符串,作为SQL方言的名称。

Note that the PG driver uses PostgreSQL cursors to browse through the result set of a ExecuteSQL() request, and that, at time of writing, PostgreSQL default settings aren't optimized when the result set is small enough to fit in one result page. If you experiment bad performance, specifying the PRELUDE_STATEMENTS=SET cursor_tuple_fraction = 1.0; open option might help.

OGR中的PostgreSQL驱动程序支持普通SQL意义上的OGRDataSource::StartTransaction()、OGRDataSource::CommitTransaction()和OGRDataSource::RollbackTransaction()调用。

创建问题

PostgreSQL驱动程序不支持创建新的数据集(PostgreSQL中的数据库),但允许在现有数据库中创建新层。

如上所述,类型系统是贫乏的,许多OGR类型没有适当地映射到PostgreSQL中。

如果数据库加载了PostGIS类型(即几何类型),则将使用PostGIS几何类型创建新创建的图层。否则他们将使用OID。

默认情况下,假设发送到Postgres的文本采用UTF-8编码。这对于普通的ASCII很好,但是对于扩展字符(ASCII 155+、LATIN1等)可能会导致错误。虽然OGR不提供对此的直接控制,但是可以设置PGCLIENTENCODING环境变量来指示所提供的格式。例如,如果您的文本是LATIN1,则可以在使用OGR之前将环境变量设置为LATIN1,并假定输入为LATIN1而不是UTF-8。设置客户机编码的另一种方法是使用ExecuteSQL()发出以下SQL命令:“将客户机编码设置为编码名称”,其中编码名称为LATIN1,等等。使用cplphusherrorhandler()/CPLPopErrorHandler()对封闭此命令可捕获错误。

数据集打开选项

  • DBNAME =字符串:数据库名称。

  • PORT =整数:端口。

  • USER =字符串:用户名。

  • PASSWORD =字符串:密码。

  • HOST =字符串:服务器主机名。

  • DBNAME =字符串:数据库名称。

  • SERVICE =string:服务名称(GDAL>=3.1)

  • ACTIVE_SCHEMA =字符串:活动架构。

  • SCHEMAS =string:要探索的模式的限制集(逗号分隔)。

  • TABLES =字符串:要列出的受限表集(逗号分隔)。

  • LIST_ALL_TABLES =是/否:这可以是“是”,以强制列出所有表,包括非空间表。

  • PRELUDE_STATEMENTS =string(GDAL>=2.1)。在PostgreSQL客户端连接上发送的SQL语句先于任何其他语句。如果有多个语句,则必须用半列(;)符号分隔。驱动程序将明确地将BEGIN识别为第一个语句,以避免发出BEGIN/COMMIT本身。当在事务池中使用带pgu bouncer的驱动程序时,此选项可能很有用,例如“BEGIN;SET LOCAL statementu timeout TO”1h“;”

  • CLOSING_STATEMENTS =string(GDAL>=2.1)。在PostgreSQL客户端连接上发送的SQL语句。如果有多个语句,则必须用半列(;)符号分隔。对于前奏语句的上述示例值,适当的结束语句将是“COMMIT”。

数据集创建选项

没有

图层创建选项

  • GEOM_TYPE: The GEOM_TYPE layer creation option can be set to one of "geometry", "geography" (PostGIS >= 1.5), "BYTEA" or "OID" to force the type of geometry used for a table. For a PostGIS database, "geometry" is the default value. PostGIS "geography" assumes a geographic SRS (before PostGIS 2.2, it was even required to be EPSG:4326), but the driver has no built-in reprojection logic so it is safest to use always -t_srs EPSG:4326 (or the canonical geographic CRS corresponding to the projected CRS of interest to avoid datum transformations) with GEOM_TYPE=geography.

  • OVERWRITE :这可能是“是”,以强制在创建请求的层之前销毁所需名称的现有层。

  • LAUNDER :这可能是“是”,以强制在此层上创建的新字段将其字段名“清洗”为与PostgreSQL更兼容的形式。这将转换为小写,并将一些特殊字符,如“-”和“#”转换为“#”。如果“否”,则保留准确的名称。默认值为“是”。如果启用,表(层)名称也将被清除。

  • PRECISION :如果可以使用数字(宽度、精度)或字符(宽度)类型,则此选项可能为“是”,以强制在此层上创建的新字段尝试表示宽度和精度信息。如果“否”,则将使用FLOAT8、INTEGER和VARCHAR类型。默认为“是”。

  • DIM={{2,3,XYM,XYZM}} :控制层的尺寸。对于PostGIS 1.0+的二维图层,设置为2很重要,因为它在加载期间对几何尺寸有限制。

  • GEOMETRY_NAME :在新表中设置几何列的名称。如果省略,则默认为 wkb_geometry 对于GEOM_TYPE=geometry,或 the_geog 对于GEOM_TYPE=地理。

  • SCHEMA :设置新表的架构名称。支持在不同架构中使用相同的层名称,但在公共架构和其他架构中不支持。请注意,同时使用ogr2ogr的-overwrite选项和-lco SCHEMA=选项将不起作用,因为ogr2ogr实用程序无法理解必须在指定的架构中销毁现有层。请改用ogr2ogr的-nln选项,或者更好地使用活动架构连接字符串。请参见下面的示例。

  • SPATIAL_INDEX =NONE/GIST/SPGIST/BRIN(从GDAL 2.4开始)或YES/NO用于早期版本和向后兼容性:默认设置为GIST(GDAL>=2.4,或YES用于早期版本)。在“几何体”列上创建空间索引(GiST)以加快查询速度(仅在PostGIS可用时有效)。设置为“无”(GDAL>=2.4,对于早期版本为FALSE)以禁用。BRIN仅适用于PostgreSQL>=9.4和PostGIS>=2.3。SPGIST仅适用于PostgreSQL>=11和PostGIS>=2.5

  • TEMPORARY :默认设置为关闭。创建临时表而不是永久表。

  • UNLOGGED :默认设置为关闭。是否将表创建为未标记的表。自postgresql9.1以来,仅支持未标记表,自postgresql9.3以来,GiST索引用于空间索引。

  • NONE_AS_UNKNOWN :可以设置为TRUE以强制将非空间层(wkbNone)创建为几何图形(wkbUnknown)类型的空间表。默认为“否”,在这种情况下,将创建一个常规表,而不记录在PostGIS geometryu columns表中。

  • FID :要创建的FID列的名称。默认为“ogcu fid”。

  • 菲德64 :这可能为“TRUE”,以创建可支持64位标识符的FID列。默认值为“FALSE”。

  • EXTRACT_SCHEMA_FROM_LAYER_NAME :可以设置为“否”,以避免将点字符视为架构和表名之间的分隔符。默认为“是”。

  • COLUMN_TYPES :格式为fieldu name=pgu fieldu type(用逗号分隔)的字符串列表,在对这些字符串调用CreateField()时应使用这些字符串。这将覆盖OGR所做的默认选择。例如,这可以用于创建类型为的列 HSTORE .

  • DESCRIPTION (来自GDAL2.1)要放入pg U描述系统表中的描述字符串。读取时,如果找到这样的描述,则它将在描述元数据项中公开。描述也可以用SetMetadataItem(“描述”,描述字符串)来编写。ogr2ogr默认情况下会保留描述,除非使用-nomd选项。

配置选项

The following configuration options are available:

  • PG_USE_COPY: This may be "YES" for using COPY for inserting data to Postgresql. COPY is significantly faster than INSERT. COPY is used by default when inserting from a table that has just been created.

  • PGSQL_OGR_FID: Set name of primary key instead of 'ogc_fid'. Only used when opening a layer whose primary key cannot be autodetected. Ignored by CreateLayer() that uses the FID creation option.

  • PG_USE_BASE64: If set to "YES", geometries will be fetched as BASE64 encoded EWKB instead of canonical HEX encoded EWKB. This reduces the amount of data to be transferred from 2 N to 1.333 N, where N is the size of EWKB data. However, it might be a bit slower than fetching in canonical form when the client and the server are on the same machine, so the default is NO.

  • OGR_TRUNCATE: If set to "YES", the content of the table will be first erased with the SQL TRUNCATE command before inserting the first feature. This is an alternative to using the -overwrite flag of ogr2ogr, that avoids views based on the table to be destroyed. Typical use case: ogr2ogr -append PG:dbname=foo abc.shp --config OGR_TRUNCATE YES.

实例

  • 将shapefile简单转换为PostgreSQL。将使用abc.shp中的功能和abc.dbf中的属性创建表“abc”。数据库实例(warmerda)必须已存在,而表abc必须不存在。

    ogr2ogr -f PostgreSQL PG:dbname=warmerda abc.shp
    
  • 第二个例子从VPF加载一个政治边界层(通过 OGDI driver ),并将层从神秘的OGDI层名称重命名为更合理的名称。如果存在所需名称的现有表,则该表将被覆盖。

    ogr2ogr -f PostgreSQL PG:dbname=warmerda \
            gltp:/vrf/usr4/mpp1/v0eur/vmaplv0/eurnasia \
            -lco OVERWRITE=yes -nln polbndl_bnd 'polbndl@bnd(*)_line'
    
  • 将单个Postgres表导出到GeoPackage:

    ogr2ogr \
      -f GPKG output.gpkg \
      PG:"dbname='my_database'" "my_table"
    
  • 将许多Postgres表导出到GeoPackage:

    ogr2ogr \
      -f GPKG output.gpkg \
      PG:"dbname='my_database' tables='table_1,table_3'"
    
  • 将整个Postgres数据库导出到GeoPackage:

    ogr2ogr \
      -f GPKG output.gpkg \
      PG:dbname=my_database
    
  • 将单层地质包加载到Postgres中:

    ogr2ogr \
      -f "PostgreSQL" PG:"dbname='my_database'" \
      input.gpkg \
      -nln "name_of_new_table"
    
  • 在本例中,我们将tiger文件的两个不同目录中的tiger行数据合并到一个表中。注意,第二次调用使用-append和no OVERWRITE=yes。

    ogr2ogr -f PostgreSQL PG:dbname=warmerda tiger_michigan \
         -lco OVERWRITE=yes CompleteChain
    ogr2ogr -update -append -f PostgreSQL PG:dbname=warmerda tiger_ohio \
         CompleteChain
    
  • 此示例显示如何使用ogrinfo在PostgreSQL中计算SQL查询语句。更复杂的PostGIS特定查询也可以通过-sql命令行切换到ogrinfo来使用。

    ogrinfo -ro PG:dbname=warmerda -sql "SELECT pop_1994 from canada where province_name = 'Alberta'"
    
  • 此示例显示如何使用ogrinfo列出不同主机上的PostgreSQL/PostGIS层。

    ogrinfo -ro PG:"host='myserver.velocet.ca' user='postgres' dbname='warmerda'"
    
  • 这个例子展示了使用PRELUDE_语句和CLOSING_语句作为ogr2ogr的目标打开选项。

    ogrinfo PG:"dbname='mydb'" poly -doo "PRELUDE_STATEMENTS=BEGIN; SET LOCAL statement_timeout TO '1h';" -doo CLOSING_STATEMENTS=COMMIT
    

FAQs

  • Why can't I see my tables? PostGIS is installed and I have data You must have permissions on all tables you want to read and geometry_columns and spatial_ref_sys. Misleading behavior may follow without an error message if you do not have permissions to these tables. Permission issues on geometry_columns and/or spatial_ref_sys tables can be generally confirmed if you can see the tables by setting the configuration option PG_LIST_ALL_TABLES to YES. (e.g. ogrinfo --config PG_LIST_ALL_TABLES YES PG:xxxxx)

也见