VRT—虚拟格式
司机简称
VRT
Driver built-in by default
This driver is built-in by default
OGR虚拟格式是一个驱动程序,它根据XML控制文件中指定的条件转换从其他驱动程序读取的功能。它主要用于从属性列中包含空间信息的平面表派生空间层。它还可以用于将坐标系信息与数据源关联、将来自不同数据源的层合并到单个数据源中,甚至只是为访问非面向文件的数据源提供定位文件。
虚拟文件目前通常是手工准备的。
驱动程序功能
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.)
创建问题
如果满足以下条件,则在VRT数据集的某一层上支持CreateFeature()、SetFeature()和DeleteFeature()操作:
VRT数据集以更新模式打开
底层源层支持这些操作
这个 SrcLayer 使用元素(与 SrcSQL语言 元素)
VRT特征的FID与源特征的FID相同,即 FID 未指定元素
虚拟文件格式
XML控制文件的根元素是 OGRVRTDataSource . 它有一个 OGRVRTLayer (或) OGRVRTWarpedLayer 或 OGRVRTUnionLayer )虚拟数据源中每个层的子级,以及 元数据 元素。
A XML schema of the OGR VRT
format is
available. When GDAL is configured with libXML2
support, that schema will be used to validate the VRT documents.
Non-conformities will be reported only as warnings. That validation can
be disabled by setting the GDAL_XML_VALIDATION
configuration option to "NO".
元数据元素
元数据 (可选):此元素包含与整个数据集关联的元数据名称/值对的列表。它有<MDI>(metadata item)子元素,这些子元素具有“key”属性和作为元素数据的值。元数据元素可以重复多次,在这种情况下,它必须附带一个“domain”属性来指示元数据域的名称。
OGRVRTLayer元素
A OGRVRTLayer 元素应具有 name 具有层名称的属性,并且可以具有以下子元素:
SrcDataSource (必需):该值是将从中派生此层的数据源的名称。元素可以有一个可选的 相对于VRT 属性,默认为“0”,但如果“1”指示源数据源应解释为相对于虚拟文件。这可以是任何OGR支持的数据集,包括ODBC、CSV等 共享 属性来控制是否应在共享模式下打开数据源。SrcLayer使用默认为OFF,SrcSQL使用默认为ON。
OpenOptions (可选):此元素可以列出许多打开的选项作为表单<OOI key=“keyu name”>valueu name</OOI>
元数据 (可选):此元素包含与整个层关联的元数据名称/值对的列表。它有<MDI>(metadata item)子元素,这些子元素具有“key”属性和作为元素数据的值。元数据元素可以重复多次,在这种情况下,它必须附带一个“domain”属性来指示元数据域的名称。
SrcLayer (可选):该值是源数据源上应派生此虚拟层的层的名称。如果未提供此元素,则必须提供SrcSQL元素。
SrcSQL语言 (可选):要执行的SQL语句,以生成所需的层结果。对于语句派生的结果,应该提供该层而不是SrcLayer。一些限制可能适用于SQL派生层。可选的 方言 可以在SrcSQL元素上指定属性以指定应使用哪个SQL“方言” : possible values are currently OGR SQL 或 SQLITE .如果 方言 未指定,将使用数据源的默认方言。
FID (可选):应从中派生要素的FID的源属性列的名称。如果没有提供,则直接使用源特征的FID。
GDAL>=2.4的逻辑:可能有不同的情况:
<FID>source_field_name</FID>
FID列将报告为source_field_name,其内容为source field_name。
<FID name="dest_field_name">source_field_name</FID>
FID列将报告为dest_field_name,内容为source field source_field_name。dest_field_name可能设置为空字符串。
<FID />
没有报告FID列。VRT特征的FID值是源特征的FID值。
<FID name="dest_field_name"/>
FID列将报告为dest_field_name,其中包含隐式源FID列的内容。VRT特征的FID值是源特征的FID值。
GDAL<2.4的逻辑:只有当FID列名也作为常规字段报告时,层才会报告它。可以在FID元素上指定“name”属性,以便始终报告FID列名。
风格 (可选):从中派生要素样式的属性列的名称。如果未提供,则将直接使用源要素的样式。
GeometryType (可选):要指定给图层的几何图形类型。如果不提供,则从源层获取。该值应为“wkbNone”、“wkbUnknown”、“wkbPoint”、“wkbLineString”、“wkbPolygon”、“wkbMultiPoint”、“wkbMultiLineString”、“wkbMultiPolygon”或“wkbGeometryCollection”之一。可选地,可以附加“25D”以将其标记为包括Z坐标。默认为“wkbUnknown”,表示允许任何几何类型。
分层器 (可选):此元素的值是用于图层的空间参照。如果未提供,则从源层继承。该值可以是WKT或OGRSpatialReference::SetUserInput()方法接受的任何其他输入。如果该值为空,则不会对层使用SRS。
GeometryField (可选):此元素用于定义应如何导出特征的几何图形。
如果未提供,则直接复制源要素的几何图形。几何编码的类型用 编码 属性,该属性的值可以是“WKT”、“WKB”或“PointFromColumns”。
如果编码是“WKT”或“WKB”,则 领域 属性将具有包含WKT或WKB几何体的字段的名称。
如果编码是“PointFromColumns”,则 x , y , z 和 m 属性将具有用于X、Y、Z和M坐标的列的名称。这个 z 和 m 属性是可选的(自OGR 2.1.1以来仅支持m)。
可选的 报表列 属性可用于指定源几何体字段(在 领域 , x , y , z , m 属性)应报告为VRT层的字段。默认为TRUE。如果设置为FALSE,则源几何图形字段将仅用于构建VRT层特征的几何图形。
GeometryField元素可以根据需要重复多次以创建多个几何体字段。它接受 name 用于定义VRT几何体字段名的属性(推荐)。什么时候? 编码 未指定,则 领域 属性将用于确定源层中相应的几何体字段名。如果两者都不是 编码 也不 领域 如果已指定,则假定源几何体字段的名称为 name 属性。
可选的 可空的 属性可用于指定几何体字段是否可为空。默认为“真”。
当使用多个几何字段时,以下子元素 GeometryField 可以定义为显式设置几何体类型、SRS、源区域或范围。
GeometryType (可选):与OGRVRTLayer级别的语法相同 GeometryType .
SRS (可选):与OGRVRTLayer级别的语法相同 分层器 (注意SRS与图层)
SrcRegion (可选):与OGRVRTLayer级别的语法相同 SrcRegion
ExtentXMin , ExtentYMin , ExtentXMax 和 ExtentXMax (可选):与同名的OGRVRTLayer级元素的语法相同
如果没有 GeometryField 元素,则源层的所有几何字段都将由VRT层公开。为了不公开源层的任何几何体字段,需要指定OGRVRTLayer级别 GeometryType 元素到wkbNone。
SrcRegion (可选):此元素用于为源要素定义初始空间过滤器。此空间过滤器将与使用SetSpatialFilter()方法在VRT层上显式设置的任何空间过滤器组合。元素的值必须是定义多边形的有效WKT字符串。可选的 clip 属性可以设置为“TRUE”以将几何图形剪裁到源区域,否则不会修改源几何图形。
场 (可选):可以使用字段元素定义一个或多个属性字段。如果未定义字段元素,则源层/sql的字段将在VRT层上定义。该字段可能具有以下属性:
name (必需):字段的名称。
type :字段类型,“Integer”、“IntegerList”、“Real”、“RealList”、“String”、“StringList”、“Binary”、“Date”、“Time”或“DateTime”之一。默认为“字符串”。
亚型 :字段子类型,“None”、“Boolean”、“Int16”、“Float32”之一。默认为“无”。
宽度 :字段宽度。默认为未知。
精度 :字段宽度。默认为零。
src :要复制到此字段的源字段的名称。默认值为“name”。
可空的 字段是否可用于指定是否可以为null。它默认为“true”。
独特的 可用于指定字段是否具有唯一约束。默认为“false”。(GDAL>=3.2)
FeatureCount (可选):此元素用于定义图层的要素计数(当未设置空间或属性过滤器时)。当从源层获取要素计数很慢时,这对静态数据很有用。
ExtentXMin , ExtentYMin , ExtentXMax 和 ExtentXMax (可选):这些元素用于定义层的范围。当从源层获取数据块很慢时,这对静态数据很有用。
OGRVRTWarpedLayer元素
A OGRVRTWarpedLayer 元素用于对源层进行动态重投影。它可能有以下子元素:
OGRVRTLayer , OGRVRTWarpedLayer 或 OGRVRTUnionLayer (必需):要重新投影的源层。
SRCSR公司 (可选):此元素的值是在重新投影之前用于层的空间引用。如果未指定,则从源层导出。
目标SRS (必需):此元素的值是重新投影后用于层的空间引用。
ExtentXMin , ExtentYMin , ExtentXMax 和 ExtentXMax (可选):这些元素用于定义层的范围。当从源层获取数据块很慢时,这对静态数据很有用。
WarpedGeomFieldName (可选):此元素的值是要换行的源层的几何体字段名称。如果未指定,将使用第一个几何体字段。如果有多个几何体字段,则只有与WarpedGeomFieldName匹配的一个字段将被扭曲;其他字段将保持不变。
OGRVRTUnionLayer元素
A OGRVRTUnionLayer 元素用于连接源层的内容。它应该有一个 name 并且可以具有以下子元素:
OGRVRTLayer , OGRVRTWarpedLayer 或 OGRVRTUnionLayer (必需的,可以重复):要在联合中添加的源层。
保留基准 (可选):可以打开或关闭。如果设置为“开”,将使用来自源层的FID,否则将使用计数器。默认为关闭。
SourceLayerFieldName (可选):如果指定,则将在层字段定义中添加一个附加字段(使用SourceLayerFieldName的值命名)。对于每个特征,此字段的值将与特征来自的图层的名称一起设置。
GeometryType (可选):有关语法,请参见上文。如果未指定,则将从所有源图层的几何图形类型推导几何图形类型。
分层器 (可选):有关语法,请参见上文。如果未指定,则SRS将是第一个源层的SRS。
FieldStrategy (可选,不包括 场 或 GeometryField ):可能是 FirstLayer 要使用找到的第一层中的字段, 联合 使用来自所有源层的所有字段的超级集,或 交叉 使用来自所有源层的所有公共字段的子集。默认为 联合 .
场 (可选,不包括 FieldStrategy ):语法见上文。注意:在OGRVRTUnionLayer元素的上下文中不支持src属性(假定字段名相同)。
GeometryField (可选,不包括 FieldStrategy ): name 属性和以下子元素 GeometryType , SRS 和 [Extent[X|Y][Min|Max]] 是可用的。
FeatureCount (可选):有关语法,请参见上文
ExtentXMin , ExtentYMin , ExtentXMax 和 ExtentXMax (可选):有关语法,请参见上文
示例:ODBC点图层
在下面的示例(disease.ovf)中,ODBC数据库disease中的worms表用于形成空间层。虚拟文件使用“x”和“y”列来获取空间位置。它还将图层标记为点图层,并且位于WGS84坐标系中。
<OGRVRTDataSource>
<OGRVRTLayer name="worms">
<SrcDataSource>ODBC:DISEASE,worms</SrcDataSource>
<SrcLayer>worms</SrcLayer>
<GeometryType>wkbPoint</GeometryType>
<LayerSRS>WGS84</LayerSRS>
<GeometryField encoding="PointFromColumns" x="x" y="y"/>
</OGRVRTLayer>
</OGRVRTDataSource>
示例:重命名属性
在某些情况下,可以将源层中的字段名重命名为其他名称。当您希望转换为模式固定的格式(如GPX(<name>,<desc>,等等)时,尤其如此。这可以通过以下方式使用SQL实现:
<OGRVRTDataSource>
<OGRVRTLayer name="remapped_layer">
<SrcDataSource>your_source.shp</SrcDataSource>
<SrcSQL>SELECT src_field_1 AS name, src_field_2 AS desc FROM your_source_layer_name</SrcSQL>
</OGRVRTLayer>
</OGRVRTDataSource>
这也可以通过使用显式字段定义来实现:
<OGRVRTDataSource>
<OGRVRTLayer name="remapped_layer">
<SrcDataSource>your_source.shp</SrcDataSource>
<SrcLayer>your_source</SrcLayer>
<Field name="name" src="src_field_1" />
<Field name="desc" src="src_field_2" type="String" width="45" />
</OGRVRTLayer>
</OGRVRTDataSource>
示例:透明空间过滤
以下示例将只返回与(0,40)-(10,50)区域相交的源图层的要素。此外,返回的几何图形将被剪裁以适合该区域。
<OGRVRTDataSource>
<OGRVRTLayer name="source">
<SrcDataSource>source.shp</SrcDataSource>
<SrcRegion clip="true">POLYGON((0 40,10 40,10 50,0 50,0 40))</SrcRegion>
</OGRVRTLayer>
</OGRVRTDataSource>
示例:重投影层
下面的示例将把source.shp层重新投影到EPSG:4326。
<OGRVRTDataSource>
<OGRVRTWarpedLayer>
<OGRVRTLayer name="source">
<SrcDataSource>source.shp</SrcDataSource>
</OGRVRTLayer>
<TargetSRS>EPSG:4326</TargetSRS>
</OGRVRTWarpedLayer>
</OGRVRTDataSource>
示例:联合层
下面的示例将返回source1.shp和source2.shp的连接层。
<OGRVRTDataSource>
<OGRVRTUnionLayer name="unionLayer">
<OGRVRTLayer name="source1">
<SrcDataSource>source1.shp</SrcDataSource>
</OGRVRTLayer>
<OGRVRTLayer name="source2">
<SrcDataSource>source2.shp</SrcDataSource>
</OGRVRTLayer>
</OGRVRTUnionLayer>
</OGRVRTDataSource>
示例:SQLite/Spatialite SQL方言
下面的示例将返回四个不同的层,这些层是从同一个多边形形状文件在fly中生成的。第一个是shapefile层。第二层通过应用参数公差为10的空间函数“Simplify”来生成简化多边形。在第三层中,原始几何图形被它们的凸面外壳所代替。在第四层中,空间函数PointOnSurface用于将原始几何图形替换为对应源多边形内的点。注意,要使用这个VRT文件的最后三层,GDAL必须使用SQLite和SpatiaLite编译。
<OGRVRTDataSource>
<OGRVRTLayer name="polygons">
<SrcDataSource>polygons.shp</SrcDataSource>
</OGRVRTLayer>
<OGRVRTLayer name="polygons_as_simplified">
<SrcDataSource>polygons.shp</SrcDataSource>
<SrcSQL dialect="sqlite">SELECT Simplify(geometry,10) from polygons</SrcSQL>
</OGRVRTLayer>
<OGRVRTLayer name="polygons_as_hulls">
<SrcDataSource>polygons.shp</SrcDataSource>
<SrcSQL dialect="sqlite">SELECT ConvexHull(geometry) from polygons</SrcSQL>
</OGRVRTLayer>
<OGRVRTLayer name="polygons_as_points">
<SrcDataSource>polygons.shp</SrcDataSource>
<SrcSQL dialect="sqlite">SELECT PointOnSurface(geometry) from polygons</SrcSQL>
</OGRVRTLayer>
</OGRVRTDataSource>
示例:多个几何体字段
以下示例将公开源层的所有属性和几何体字段:
<OGRVRTDataSource>
<OGRVRTLayer name="test">
<SrcDataSource>PG:dbname=testdb</SrcDataSource>
</OGRVRTLayer>
</OGRVRTDataSource>
只暴露部分(或全部!)字段的数目:
<OGRVRTDataSource>
<OGRVRTLayer name="other_test">
<SrcDataSource>PG:dbname=testdb</SrcDataSource>
<SrcLayer>test</SrcLayer>
<GeometryField name="pg_geom_field_1" />
<GeometryField name="vrt_geom_field_2" field="pg_geom_field_2">
<GeometryType>wkbPolygon</GeometryType>
<SRS>EPSG:4326</SRS>
<ExtentXMin>-180</ExtentXMin>
<ExtentYMin>-90</ExtentYMin>
<ExtentXMax>180</ExtentXMax>
<ExtentYMax>90</ExtentYMax>
</GeometryField>
<Field name="vrt_field_1" src="src_field_1" />
</OGRVRTLayer>w
</OGRVRTDataSource>
要将“pg_geom_field_2”几何字段重新投影到EPSG:4326:
<OGRVRTDataSource>
<OGRVRTWarpedLayer>
<OGRVRTLayer name="other_test">
<SrcDataSource>PG:dbname=testdb</SrcDataSource>
</OGRVRTLayer>
<WarpedGeomFieldName>pg_geom_field_2</WarpedGeomFieldName>
<TargetSRS>EPSG:32631</TargetSRS>
</OGRVRTWarpedLayer>
</OGRVRTDataSource>
要使多个多重几何体层合并并仅保留其中的一部分,请执行以下操作:
<OGRVRTDataSource>
<OGRVRTUnionLayer name="unionLayer">
<OGRVRTLayer name="source1">
<SrcDataSource>PG:dbname=testdb</SrcDataSource>
</OGRVRTLayer>
<OGRVRTLayer name="source2">
<SrcDataSource>PG:dbname=testdb</SrcDataSource>
</OGRVRTLayer>
<GeometryField name="pg_geom_field_2">
<GeometryType>wkbPolygon</GeometryType>
<SRS>EPSG:4326</SRS>
<ExtentXMin>-180</ExtentXMin>
<ExtentYMin>-90</ExtentYMin>
<ExtentXMax>180</ExtentXMax>
<ExtentYMax>90</ExtentYMax>
</GeometryField>
<GeometryField name="pg_geom_field_3" />
<Field name="src_field_1" />
</OGRVRTUnionLayer>
</OGRVRTDataSource>
其他音符
当 GeometryField 从源数据源中提取所有行后,将应用“WKT”空间筛选。实际上,这意味着WKT导出的几何体没有快速的空间过滤。
当 GeometryField 是“PointFromColumns”,和 SrcLayer (而不是 SrcSQL语言 )使用,并且空间过滤器在虚拟层上生效,则空间过滤器将在内部转换为 SrcLayer . 在快速空间过滤非常重要的情况下,如果可能的话,索引源数据存储中的X和Y列会有帮助。例如,如果源是RDBMS。您可以通过设置 使用空间子查询 GeometryField元素的属性设置为FALSE。