ESRI形状文件/DBF

司机简称

ESRI整形器

Driver built-in by default

This driver is built-in by default

所有类型的ESRI shapefile都应可用于阅读、创建和编辑。驱动程序还可以处理独立的DBF文件,而不处理关联的.shp文件。

通常,OGR Shapefile驱动程序将Shapefile的整个目录视为数据集,将该目录中的单个Shapefile视为层。在这种情况下,目录名应该用作数据集名。但是,也可以将shapefile集中的文件(.shp、.shx或.dbf)之一用作数据集名称,然后将其视为具有一个层的数据集。

请注意,当读取SHPT_ARC类型的形状文件时,相应的图层将报告为wkbLineString类型,但根据每个几何图形的零件数,每个特征的实际几何图形类型可以是OGRLineString或OGRMultiLineString。这同样适用于SHPT_POLYGON shapefile,报告为wkbPolygon类型的层,但根据每个几何体的部分数,实际类型可以是OGRPolygon或OGRMultiPolygon。

支持度量(M坐标)。如果测量了指定的几何图形类型或使用了适当的层创建选项,则会创建具有度量的Shapefile。打开可能具有测量几何图形的shapefile时,将检查第一个形状,如果它使用测量,则相应地设置层的几何图形类型。可以使用“调整几何类型”打开选项更改此行为。

读取多个匹配文件,并将每个面片几何体转换为风扇和网格的三角网表示的三角网或几何体集合。

如果存在旧Arc/Info样式或新ESRI OGC WKT样式的.prj文件,则将读取该文件并将其用于将投影与要素关联。从GDAL 2.3开始,将尝试与EPSG数据库进行匹配,以使用目录中的条目标识.prj的SRS。

read驱动程序假设多部分多边形遵循规范,也就是说外圈的顶点应在X/Y平面上顺时针方向,内圈的顶点应逆时针方向。如果Shapefile违反了该规则,则可以定义配置选项 OGR_ORGANIZE_POLYGONS 默认情况下,根据多边形各部分的拓扑关系进行全面分析,以便在OGC简单特征约定中正确定义生成的多边形。

驱动程序功能

Supports Create()

This driver supports the GDALDriver::Create() operation

Supports Georeferencing

This driver supports georeferencing

Supports VirtualIO

This driver supports virtual I/O operations (/vsimem/, etc.)

编码

试图读取.cpg文件中的代码页设置,或从.dbf文件中读取LDID/code page设置作为回退,并使用它在读取时将字符串字段转换为UTF-8,在写入时将其转换为UTF-8。LDID“87/0x57”被视为ISO-8859-1,这可能不合适。这个 SHAPE_ENCODING 配置选项可用于使用CPLRecode支持的任何编码重写shapefile的编码解释,或使用到“”以避免任何重新编码。

从GDAL 3.1开始,“SHAPEFILE”域中提供以下元数据项:

  • LDID_VALUE =integer:来自DBF头的原始LDID值。仅当此值不为零时才存在。

  • ENCODING_FROM_LDID=string: Encoding name deduced from LDID_VALUE. Only present if LDID_VALUE is present

  • CPG_VALUE =string:.cpg文件的内容。仅当文件存在时才存在。

  • ENCODING_FROM_CPG=string: Encoding name deduced from CPG_VALUE. Only present if CPG_VALUE is present

  • SOURCE_ENCODING=string: Encoding used by GDAL to encode/recode strings. If the user has provided the SHAPE_ENCODING configuration option or ENCODING open option have been provided (included to empty value), then their value is used to fill this metadata item. Otherwise it is equal to ENCODING_FROM_CPG if it is present. Otherwise it is equal to ENCODING_FROM_LDID.

Spatial and attribute indexing

OGR Shapefile驱动程序支持空间索引和有限形式的属性索引。

空间索引使用UMN MapServer使用的.qix四叉树空间索引文件。空间索引可以加速空间过滤通过大数据集,从而显著地挑选出小区域。

它还可以使用ESRI空间索引文件(.sbn/.sbx),但当前不支持写入这些文件。

若要创建空间索引(格式为.qix),请发出以下形式的SQL命令

CREATE SPATIAL INDEX ON tablename [DEPTH N]

其中可选的深度说明符可用于控制生成的索引树级别数。如果省略深度,则根据形状文件中的特征数估计树深度,其值范围为1到12。

要删除空间索引,请发出以下命令

DROP SPATIAL INDEX ON tablename

否则, MapServer 可以使用shptree实用程序:

shptree <shpfile> [<depth>] [<index_format>]

有关此实用程序的详细信息,请访问 MapServer shptree page

目前,OGR Shapefile驱动程序只支持在唯一键列中查找特定值的属性索引。若要为列创建属性索引,请发出“使用fieldname在tablename上创建索引”格式的SQL命令。若要删除属性索引,请发出“drop INDEX ON tablename”格式的命令。属性索引将加速“fieldname=value”形式的WHERE子句搜索。属性索引实际上存储为mapinfo格式索引,与任何其他shapefile应用程序都不兼容。

创建问题

Shapefile驱动程序将目录视为数据集,将每个Shapefile集(.shp、.shx和.dbf)视为层。数据集名称将被视为目录名称。如果该目录已经存在,则使用该目录并忽略该目录中的现有文件。如果目录不存在,将创建该目录。

在特殊情况下,尝试创建扩展名为.shp的新数据集将导致创建单个文件集而不是目录。

ESRI shapefile每层只能存储一种几何图形(shapefile)。创建时,可以基于源文件(如果源驱动程序中已知统一的几何图形类型)来设置,也可以由用户使用图层创建选项SHPT(如下所示)直接设置。如果不设置,图层创建将失败。如果将不兼容类型的几何图形写入层,则输出将以错误终止。

注意,这会使使用ogr2ogr将混合几何图层从另一种格式转换为Shapefile格式变得非常困难,因为ogr2ogr不支持从源图层分离几何图形。见 FAQ 为了一个解决方案。

Shapefile功能属性存储在关联的.dbf文件中,因此属性受到许多限制:

  • 属性名称最多只能包含10个字符。OGR Shapefile驱动程序尝试生成唯一的字段名。连续重复的字段名(包括那些通过截断为10个字符创建的字段名)将被截断为8个字符,并附加1到99之间的序列号。

    例如:

    • a→a,a→a 1,a→a 2;

    • efghijk→efghij,efghijkl→efghu1

  • 只支持Integer、Integer64、Real、String和Date(不支持DateTime,仅支持year/month/day)字段类型。无法创建各种列表和二进制字段类型。

  • 字段宽度和精度直接用于在.dbf文件中建立存储大小。这意味着超过字段宽度的字符串或不符合指定字段格式的数字将被截断。

  • 没有显式宽度的整数字段被视为宽度9,如果需要,则扩展到10或11。

  • 不带显式宽度的Integer64字段被视为宽度18,如果需要,则扩展到19或20。

  • 没有显式宽度的实数(浮点)字段被视为宽度24,精度为15位小数。

  • 没有指定宽度的字符串字段被视为80个字符。

此外,.dbf文件至少需要有一个字段。如果应用程序没有创建任何记录,则会自动创建一个“FID”字段并用记录号填充。

OGR shapefile驱动程序支持重写shapefile中的现有形状以及删除形状。已删除的形状在.dbf文件中标记为删除,然后被OGR忽略。要永久删除它们(导致对fid重新编号),请通过datasource ExecuteSQL()方法调用SQL“REPACK<tablename>”。

如果使用SetFeature()修改了特征几何体,并导致.shp文件中几何体二进制编码的大小发生变化,则重新打包还会导致.shp被重写。

从GDAL 2.2开始,重新打包也会在文件关闭时自动完成,或者在FlushCache()/SyncToDisk()时自动完成,因为带有漏洞的shapefile会导致与其他软件的互操作性问题。

字段大小

驱动程序知道如何自动扩展字符串和整数字段(最多可达DBF格式施加的255字节限制),以动态适应要插入的数据长度。

还可以通过datasource ExecuteSQL()方法发出一个SQL“resize<tablename>”,强制将字段的大小调整到最佳宽度。这在默认列宽(字符串字段为80个字符)大于所需值的情况下非常方便。

空间范围

shapefile将图层空间范围存储在.SHP文件中。在形状文件中插入新特征时,图层空间范围将自动更新。但是,更新现有特征时,如果其先前形状接触到图层范围的边界框,但更新的形状未接触到新范围,则计算的范围将不正确。然后有必要通过datasource ExecuteSQL()方法调用SQL“RECOMPUTE EXTENT ON<tablename>”。这同样适用于删除形状。

大小问题

几何学:Shapefile格式显式地使用32位偏移量,因此不能超过8GB(它实际上使用32位偏移量到16位字),但是OGR Shapefile实现的限制是4GB。

属性:dbf格式中没有任何偏移量,因此可以任意大。

但是,为了与其他软件实现兼容,不建议对.SHP和.DBF文件使用超过2GB的文件大小。

可以使用layer=YES来严格限制创建。对于更新模式 SHAPE_2GB_LIMIT 配置选项可以设置为“是”以获得类似效果。如果未设置任何内容,则当达到2GB限制时将发出警告。

压缩文件

从GDAL 3.1开始,驱动程序还可以支持读取、创建和编辑.shz文件(包含单层的.shp、.shx、.dbf和其他侧车文件的ZIP文件)和.shp.ZIP文件(ZIP文件包含一个或多个层)。创建和编辑涉及临时文件的创建。

打开选项

以下打开选项可用。

  • ENCODING =encoding_name:使用CPLRecode支持的任何编码重写shapefile的编码解释,或使用“”以避免任何重新编码

  • DBF_DATE_LAST_UPDATE= YYYY-MM-DD :以年-月-日格式写入DBF头的修改日期。如果未指定,则使用当前日期。

  • ADJUST_TYPE =YES/NO:设置为YES(默认为NO)读取整个.dbf,以便在可能的情况下调整Real->Integer/Integer64或Integer64->Integer字段类型。当字段宽度不明确,并且默认情况下OGR将选择较大的数据类型时,可以使用此选项。例如,小数位数为0、宽度为10/11个字符的数字列可以包含整数或整数64,宽度为19/20的数字列可以包含整数64或更大的整数(保留为实数)

  • ADJUST_GEOM_TYPE =无/第一个形状/所有形状。(从GDAL 2.1开始)定义如何计算图层几何类型,特别是区分具有M维有效值的形状的形状文件和M值设置为nodata值的形状文件。默认情况下(第一个形状),驱动程序将查看第一个形状,如果它有M个值,则会将图层显示为M维。通过指定所有的形状,驱动程序将遍历特征,直到找到一个具有有效M值的形状来决定适当的图层类型。

  • AUTO_REPACK= YES/NO :(OGR>=2.2)在GDAL 2.2中默认为YES。是否应在需要时自动重新打包shapefile,在数据集关闭时还是在FlushCache()/SyncToDisk()时。

  • DBF_EOF_CHAR= YES/NO :(OGR>=2.2)在GDAL 2.2中默认为YES。.DBF是否应该像DBF规范中那样由0x1A文件结尾字符终止,并由其他软件供应商完成。以前的GDAL版本没有写一个。

数据集创建选项

没有

图层创建选项

  • SHPT=type :重写创建的shapefile的类型。对于没有.shp文件、点、弧、多边形或多点的简单.dbf文件,2D可以为空;对于3D,POINTZ、ARCZ、POLYGONZ、MULTIPOINTZ或MULTIPATCH;对于测量的几何图形,POINTM、ARCM、POLYGONM或MULTIPOINTM;对于3D测量的几何图形,POINTZM、ARCZM、POLYGONZM或MULTIPOINTZM。在GDAL 2.1中添加了度量支持。自GDAL 2.2以来,支持多路径文件。

  • ENCODING= 价值 :在DBF文件中设置编码值。默认值为“LDID/87”。目前尚不清楚其他的价值观是否合适。

  • RESIZE= YES/NO :设置“是”可将字段调整为其最佳大小。请参阅上面的“字段大小”部分。默认为“否”。

  • 2GB_LIMIT= YES/NO :设置“是”以强制.SHP或.DBF文件的2GB文件大小。默认为“否”。

  • SPATIAL_INDEX= YES/NO :设置“是”以创建空间索引(.qix)。默认为“否”。

  • DBF_DATE_LAST_UPDATE= YYYY-MM-DD :修改日期以年-月-日格式写入DBF标题。如果未指定,则使用当前日期。注:过去GDAL版本的行为是写1995-07-26

  • AUTO_REPACK= YES/NO :(OGR>=2.2)在GDAL 2.2中默认为YES。是否应在需要时自动重新打包shapefile,在数据集关闭时还是在FlushCache()/SyncToDisk()时。

  • DBF_EOF_CHAR= YES/NO :(OGR>=2.2)在GDAL 2.2中默认为YES。.DBF是否应该像DBF规范中那样由0x1A文件结尾字符终止,并由其他软件供应商完成。以前的GDAL版本没有写一个。

配置选项

The following configuration options are available:

  • SHAPE_REWIND_ON_WRITE can be set to NO to prevent the shapefile writer to correct the winding order of exterior/interior rings to be conformant with the one mandated by the Shapefile specification. This can be useful in some situations where a MultiPolygon passed to the shapefile writer is not really a compliant Single Feature polygon, but originates from example from a MultiPatch object (from a Shapefile/FileGDB/PGeo datasource).

  • SHAPE_RESTORE_SHX (GDAL >= 2.1): can be set to YES (default NO) to restore broken or absent .shx file from associated .shp file during opening.

  • SHAPE_2GB_LIMIT can be set to YES to strictly enforce the 2 GB file size limit when updating a shapefile. If nothing is set, a warning will be emitted when the 2 GB limit is reached.

  • OGR_ORGANIZE_POLYGONS can be set to DEFAULT to activate a full analysis based on topological relationships of the parts of the polygons to make sure that the ring ordering of all polygons are correct according to the OGC Simple Feature convention.

  • SHAPE_ENCODING may be used to override the encoding interpretation of the shapefile with any encoding supported by CPLRecode or to "" to avoid any recoding.

实例

  • 将两个shapefile“file1.shp”和“file2.shp”合并到新文件“file_merged.shp”中的操作如下:

    ogr2ogr file_merged.shp file1.shp
    ogr2ogr -update -append file_merged.shp file2.shp -nln file_merged
    

    第二个命令是以更新模式打开file_merged.shp,并尝试查找现有图层并附加要复制的要素。

    -nln选项设置要复制到的层的名称。

  • 建立空间索引:

    ogrinfo file1.shp -sql "CREATE SPATIAL INDEX ON file1"
    
  • 将DBF文件的列调整为最佳大小:

    ogrinfo file1.dbf -sql "RESIZE file1"
    

也见