MS RFC 62:支持其他WFS GetFeature输出格式

日期

2010/10/07

作者

弗兰克·沃默丹

联系

warmerdam@pobox.com

状态

采用

描述:此RFC建议扩展WFS GetFeature请求支持GML以外的格式的能力。介绍了对模板查询格式(即RFC36)的支持,以及对输出到OGR输出的支持。输出格式的控制通过适当的outputformat声明进行管理。

WFS GetFeature更改

1)如果wfs outputformat值不是现有支持的值之一,则将搜索地图的outputformatobj集,以查找具有匹配名称或mime类型和ms_image mode_功能的图像模式的值。

2)如果层上存在WFS_GetFeature_FormatList元数据,那么它应该是该层允许的以逗号分隔的输出格式列表。使用outputformat参数getfeature将无法选择任何其他项。此参数中的值将是OutputFormat声明中的“名称”。作为回退,它也可能存在于地图上,而不是图层上。

3)现有的gml2/gml3生成支持将基本上保留在mapwfs.c中的当前形式,但它的前导码和后缀生成将移动到单独的函数中,以减少主mswfsgetfeature()函数中的“gml混乱”。

4)如果使用outputformatobj而不是gml输出,则将通过调用已支持通过新模板引擎(RFC 36)输出的msReturnTemplateQuery()以及调用其他渲染器生成。

WFS getCapabilities更改

在WFS 1.1.0模式下,getCapabilities文档列出了outputformat参数允许的一组格式。作为开发的一部分,它将被扩展为显示所有层的所有合法输出格式(基于WFS_GetFeature_FormatList元数据)。

请注意,在WFS 1.0.0中,没有任何机制可以在每层的基础上发现格式列表,只有整体列表。WFS 1.1.0支持整体列表和每层列表。

输出格式对象

将添加一个新的图像模式值ms-image mode-feature,用于适合面向功能的格式,不能有意义地将其视为图像。RFC 36样式模板输出格式声明现在将默认为此ImageMode。wfs getfeature()指令将只支持此图像模式的输出格式。

还有一个新的渲染器值,ms_render_with_ogr,将添加到ogr输出中。

ogr outputformat声明

OGR渲染器将支持以下格式选项声明:

DSCO:*

任何以dsco:为前缀的内容都用作带有ogr驱动程序的数据集创建选项。

LCO:*

以lco:为前缀的任何内容都用作层创建选项。

表单=简单/zip/multipart

指示结果应该是简单的单个文件(单个)、mime多部分附件(多部分)还是zip文件(zip)。““zip”是默认值。

存储=内存/文件系统/流

指示在写入数据源时应将其存储在何处。“文件”是默认值。

如果是“内存”,那么它将在/vsimem/中创建,但这只适用于支持vsi*l的驱动程序,我们无法轻松地自动确定这些驱动程序。

如果是“文件”,则会在映像路径下创建一个临时目录,如果文件将被写入,然后读取回流到客户端。

如果是“流”,则将使用名称“/vsistdout”创建数据源,以尝试直接写入stdout。只有少数几个OGR驱动程序可以在此模式下正常工作(即.csv,可能是kml,gml)。

压缩=无/gzip

返回结果时是否应应用gzip压缩?这通常不适用于已经压缩图像的form=zip。”“无”是默认值。

geomtype=none/unknown/point/linestring/polygon/geometrycollection/multipoint/multilistering/multipolygon

这将设置创建的输出层的几何图形类型。默认为“未知”。

文件名=名字

为创建的数据源提供名称,默认值为“result.dat”。

实例:

OUTPUTFORMAT
  NAME "CSV"
  DRIVER "OGR/CSV"
  MIMETYPE "text/csv"
  FORMATOPTION "LCO:GEOMETRY=AS_WKT"
  FORMATOPTION "STORAGE=memory"
  FORMATOPTION "FORM=simple"
  FORMATOPTION "FILENAME=result.csv"
END

OUTPUTFORMAT
  NAME "OGRGML"
  DRIVER "OGR/GML"
  FORMATOPTION "STORAGE=filesystem"
  FORMATOPTION "FORM=multipart"
  FORMATOPTION "FILENAME=result.gml"
END

OUTPUTFORMAT
  NAME "SHAPEZIP"
  DRIVER "OGR/ESRI Shapefile"
  FORMATOPTION "STORAGE=memory"
  FORMATOPTION "FORM=zip"
  FORMATOPTION "FILENAME=result.zip"
END

OGR渲染器实现

OGR渲染器将作为函数msogrWriteFromQuery()在新文件mapogrOutput.c中实现。它将基于输出格式声明中的信息创建新的OGR数据源。然后,它将为每个具有活动的非空查询结果缓存的映射层创建一个输出层。将写入这些resultcache形状。

  • gml_include_items和gml_exclude_items规则将用于决定应将哪些属性写入输出层。

  • OGR输出将支持GML字段名别名机制。

  • ogr输出将支持gml_u[item]_类型元数据。

  • ogr输出将支持gml_u[item]_width(new)元数据。

  • OGR输出将支持GML_u[item]_精度(新)元数据。

  • 当gml_u[item]_类型元数据不可用时,所有字段都将使用字符串类型创建。

  • 某些功能,如zip输出,将只支持GDAL/OGR 1.8。这些功能将以GDAL/OGR版本为条件。

支持的几何类型

在MapServer中,我们有点、线和多边形层,它们也允许具有多个点、线或多边形的特征。然而,在OGC使用的简单特征几何模型中,一个点和多点层是非常不同的。同样,对于线串、多线串和多边形,也是多多边形层类型。当写入层的特征可以是这样的不同类型时,我们创建层的唯一方法是作为几何类型“wkbunknown”——也就是说没有不同的几何类型。

一些驱动程序,例如ogr shapefile驱动程序将根据遇到的第一个几何图形建立特定的几何图形类型,并放弃不支持的几何图形类型的错误功能。一些驱动程序支持几何类型的混合。

geomtype格式选项可以强制创建具有特定几何类型的图层。

属性字段定义

对于OGR输出,非常希望能够创建具有适当数据类型、宽度和精度的输出字段,以反映源特征定义。在过去,对于GML输出,GML_u[item]u类型元数据提供了一种机制,允许用户在生成的GML中手动设置字段类型,因为没有支持的机制可以自动发现。

作为进一步的步骤,对于OGR输出机制,计划为两个新的数据项提供支持,即gml_u[item]_width和gml_[item]_precision,默认字段的宽度和精度(小数位数)。

目前还没有计划利用GML输出中的字段宽度和精度信息,尽管这可能被证明是有用的。宽度和精度元数据将由msgmlgetitems()解析并添加到gmliteMobj结构中。值“0”表示一个值未知。

GMLY类型自动

为一个层中的所有字段设置字段类型信息是繁琐且容易出错的。因此,作为进一步的扩展,它旨在支持一种机制来自动发现某些数据源的字段类型、宽度和精度。这将通过将“gml_types”元数据项设置为“auto”值来请求。这将作为实现层类型的线索,用于在调用getitems层方法时设置层上的各种元数据项,以定义字段类型、宽度和精度。

作为此RFC的开发工作的一部分,将为“ogr”、“postgis”、“oracle”和“shapefile”层实现对自动字段定义的支持。其他特性源的维护人员可以在方便的时候实现支持。

使用CPL服务

对WFS OGR输出的支持取决于所定义的使用OGR。但当可用时,这意味着GDAL/OGR cpl(公共可移植性库)服务也可用。其中包括虚拟文件系统接口(VSI*L),它提供诸如“内存”文件之类的服务。如果storage=memory(默认配置),那么/vsimem服务将用于避免将中间文件写入磁盘。

注意,在使用基于gdal的输出格式时,/vsimem/服务已经用于WMS层,以避免从删除WMS服务器向磁盘写入图像,在WCS中则避免将gdal写入图像写入磁盘和在WMS中。所以这不是什么新鲜事。

此外,CPL还通过/vsigzip虚拟文件系统处理程序支持gzip压缩。

过去,GDAL not 支持编写zip文件;这是一个非常理想的功能,作为压缩和分组由许多OGR驱动程序生成的多文件集的机制。作为为这个RFC进行的开发的一部分,打算用CPL API扩展gdal以写入zip文件,或者使用/vsizip/虚拟文件系统机制来写入文件。

向后兼容性问题

与此建议没有明显的向后兼容性问题。它的效果主要是在wfs getfeature指令中使用新的outputformat值的情况下。

安全隐患

这项提议没有明显的安全隐患。

进一步考虑

  • 应该注意的是,describeFeatureType WFS操作仍然只支持功能类型的GML格式描述。

  • 一个原型实现已经开发(由FrankWarmerdam开发)并且正在工作,尽管它还没有完全完成,在提交之前需要进行一些改进。

  • 使用元数据和其他原本用于驱动GML生产的结构很方便,但在使用“GML”元数据项驱动非GML输出时确实会造成一些混乱。

未解决问题

  • 如何更改msReturnTemplate()以支持WFS对功能数量的限制,以及对第一个功能的偏移?

  • 如果查询不是在WFS GetFeature中选择一个OGR输出格式,会有什么影响?

测试

MSAutoTest/WXS套件将通过几个OGR输出测试进行扩展。这很可能是围绕生成文本输出格式而进行的,因此可以像处理GML输出一样,轻松地与以前的结果进行比较。一些高级特性,例如压缩输出,可能不方便为添加回归测试。

文档

以下文件需要更新文件:

  • WFS服务器:广泛讨论新的GML项,以及如何调用和控制OGR和模板化输出。

  • mapfile引用:添加有关ogr outputformat声明的信息。

  • 理想情况下,我们应该在文档中记录关于如何编写特性层实现的新的“gml-types auto”内容,但是这方面唯一的文档是RFC3,它似乎没有定义函数在大部分情况下应该做什么。

票据ID

投票历史

2010/10/13通过,史蒂文、史蒂文、阿塞菲和弗兰克的+1。