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 (或) OGRVRTWarpedLayerOGRVRTUnionLayer )虚拟数据源中每个层的子级,以及 元数据 元素。

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 SQLSQLITE .如果 方言 未指定,将使用数据源的默认方言。

  • 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”,则 xyzm 属性将具有用于X、Y、Z和M坐标的列的名称。这个 zm 属性是可选的(自OGR 2.1.1以来仅支持m)。

    可选的 报表列 属性可用于指定源几何体字段(在 领域xyzm 属性)应报告为VRT层的字段。默认为TRUE。如果设置为FALSE,则源几何图形字段将仅用于构建VRT层特征的几何图形。

    GeometryField元素可以根据需要重复多次以创建多个几何体字段。它接受 name 用于定义VRT几何体字段名的属性(推荐)。什么时候? 编码 未指定,则 领域 属性将用于确定源层中相应的几何体字段名。如果两者都不是 编码 也不 领域 如果已指定,则假定源几何体字段的名称为 name 属性。

    可选的 可空的 属性可用于指定几何体字段是否可为空。默认为“真”。

    当使用多个几何字段时,以下子元素 GeometryField 可以定义为显式设置几何体类型、SRS、源区域或范围。

    • GeometryType (可选):与OGRVRTLayer级别的语法相同 GeometryType .

    • SRS (可选):与OGRVRTLayer级别的语法相同 分层器 (注意SRS与图层)

    • SrcRegion (可选):与OGRVRTLayer级别的语法相同 SrcRegion

    • ExtentXMinExtentYMinExtentXMaxExtentXMax (可选):与同名的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 (可选):此元素用于定义图层的要素计数(当未设置空间或属性过滤器时)。当从源层获取要素计数很慢时,这对静态数据很有用。

  • ExtentXMinExtentYMinExtentXMaxExtentXMax (可选):这些元素用于定义层的范围。当从源层获取数据块很慢时,这对静态数据很有用。

OGRVRTWarpedLayer元素

A OGRVRTWarpedLayer 元素用于对源层进行动态重投影。它可能有以下子元素:

  • OGRVRTLayerOGRVRTWarpedLayerOGRVRTUnionLayer (必需):要重新投影的源层。

  • SRCSR公司 (可选):此元素的值是在重新投影之前用于层的空间引用。如果未指定,则从源层导出。

  • 目标SRS (必需):此元素的值是重新投影后用于层的空间引用。

  • ExtentXMinExtentYMinExtentXMaxExtentXMax (可选):这些元素用于定义层的范围。当从源层获取数据块很慢时,这对静态数据很有用。

  • WarpedGeomFieldName (可选):此元素的值是要换行的源层的几何体字段名称。如果未指定,将使用第一个几何体字段。如果有多个几何体字段,则只有与WarpedGeomFieldName匹配的一个字段将被扭曲;其他字段将保持不变。

OGRVRTUnionLayer元素

A OGRVRTUnionLayer 元素用于连接源层的内容。它应该有一个 name 并且可以具有以下子元素:

  • OGRVRTLayerOGRVRTWarpedLayerOGRVRTUnionLayer (必需的,可以重复):要在联合中添加的源层。

  • 保留基准 (可选):可以打开或关闭。如果设置为“开”,将使用来自源层的FID,否则将使用计数器。默认为关闭。

  • SourceLayerFieldName (可选):如果指定,则将在层字段定义中添加一个附加字段(使用SourceLayerFieldName的值命名)。对于每个特征,此字段的值将与特征来自的图层的名称一起设置。

  • GeometryType (可选):有关语法,请参见上文。如果未指定,则将从所有源图层的几何图形类型推导几何图形类型。

  • 分层器 (可选):有关语法,请参见上文。如果未指定,则SRS将是第一个源层的SRS。

  • FieldStrategy (可选,不包括 GeometryField ):可能是 FirstLayer 要使用找到的第一层中的字段, 联合 使用来自所有源层的所有字段的超级集,或 交叉 使用来自所有源层的所有公共字段的子集。默认为 联合 .

  • (可选,不包括 FieldStrategy ):语法见上文。注意:在OGRVRTUnionLayer元素的上下文中不支持src属性(假定字段名相同)。

  • GeometryField (可选,不包括 FieldStrategy ): name 属性和以下子元素 GeometryTypeSRS 和 [Extent[X|Y][Min|Max]] 是可用的。

  • FeatureCount (可选):有关语法,请参见上文

  • ExtentXMinExtentYMinExtentXMaxExtentXMax (可选):有关语法,请参见上文

示例: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。