MS RFC 36:对查询输出的简化模板支持

日期

2007/10/23

作者

史蒂夫·莱姆

联系

明尼苏达州第纳尔的史蒂夫·莱姆

最后编辑

2007/10/23

状态

开发

概述

问题:

  1. 目前,像gml这样的驱动程序不可用于CGI作为显示查询结果的方法。

  2. 用于查询的模板方案(页眉/模板/页脚)既不便于用户使用,也不适用于多种表示格式。也就是说,一个层=>一个模板集

解决方案:

  1. 使用输出格式对象定义除图形图像外还可用于输出查询结果的格式。例如:

OUTPUTFORMAT
  NAME 'gml3'
  DRIVER GML3
  MIMETYPE 'text/xml; subtype=gml/3.2.1'
END

可能需要扩展该对象以区分映射呈现和查询格式化程序,但这也可能发生在mapdraw.c和mapserv.c中。也就是说,驱动程序在这些地方被显式引用,所以如果有人试图用GML3驱动程序绘制一个映射,它将抛出一个错误。

  1. 使用webobj queryformat属性引用格式:“queryformat gml3”。现在,该属性带有一个mime类型,但也可以用于引用格式。

  2. 还允许适用的模式(即WFS、WMS、SOS)使用从outputformat/mimetype映射而来的驱动程序/模板类型格式(即,在getCapabilities响应中进行广告,通过api支持[例如,request=getFeature&outputformat=text/xml;subtype=gml/3.2.1])。目前,WCS驱动程序要求开发人员显式定义支持的输出格式,其他服务也可以这样做,并且可以引用模板化的输出。

  3. 定义模板驱动程序。基本上,这只是调用普通的查询模板方案。例如:

OUTPUTFORMAT
  NAME 'kml'
  DRIVER TEMPLATE
  MIMETYPE 'application/vnd.google-earth.kml+xml'
  TEMPLATE 'myTemplate.kml'
END

OUTPUTFORMAT
  NAME 'geojson'
  DRIVER TEMPLATE
  MIMETYPE 'application/json; subtype=geojson'
  TEMPLATE 'myTemplate.js'
END
  1. 注意,在上面的例子中,我们引用了一个文件,所以我考虑除了当前的机制之外,还支持一个用于查询的单一模板系统。为此,我建议使用4个新的模板标记:【resultset】、【feature】、【join】(用于一对多联接)和【include】(用于支持模板之间的代码共享)。除include标记外,其他所有标记都是块。例如:

[include src="templates/header.html"]
[resultset name=lakes]
  ... old layer HEADER stuff goes here, if a layer has no results this block disappears...
  [feature]
    ...repeat this block for each feature in the result set...
    [join name=join1]
      ...repeat this block for each joined row...
    [/join]
  [/feature]
  ...old layer FOOTER stuff goes here...
[/resultset]
[resultset name=streams]
  ... old layer HEADER stuff goes here, if a layer has no results this block disappears...
  [feature]
    ...repeat this block for each feature in the result set...
  [/feature]
  ...old layer FOOTER stuff goes here...
[/resultset]
[include src="templates/footer.html"]

特定的GML3示例可能是:

<?xml version="1.0" encoding="ISO-8859-1"?>
[resultset layer=mums]
<MapServerUserMeetings xmlns="http://localhost/ms_ogc_workshop" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://localhost/ms_ogc_workshop ./mums.xsd">
 <gml:description>This is a GML document which provides locations of all MapServer User Meeting that have taken place</gml:description>
 <gml:name>MapServer User Meetings</gml:name>
 <gml:boundedBy>
  <gml:Envelope>
   <gml:coordinates>-93.093055556,44.944444444 -75.7,45.4166667</gml:coordinates>
  </gml:Envelope>
 </gml:boundedBy>
 [feature]
 <gml:featureMember>
  <Meeting>
   <gml:description>[desc]</gml:description>
   <gml:name>[name]</gml:name>
   <gml:location>
    <gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
     <gml:pos>[x] [y]</gml:pos>
    </gml:Point>
   </gml:location>
   <year>[year]</year>
   <venue>[venue]</venue>
   <website>[url]</website>
  </Meeting>
 </gml:featureMember>
 [/feature]
 <dateCreated>2007-08-13T17:17:32Z</dateCreated>
</MapServerUserMeetings>
[resultset]

一个geojson示例可能是:

[resultset layer=foo] {
"type": "FeatureCollection",
"features": [
 [feature trim=',']
 {
  "type": "Feature",
  "id": "[id]",
  "geometry": {
   "type": "PointLineString",
   "coordinates": [
    {
     "type": "Point",
     "coordinates": [[x], [y]]
    }
   ]
  },
  "properties": {
   "description": "[description]",
   "venue": "[venue]",
   "year": "[year]"
  }
 },
 [/feature]
 ]
}
[/resultset]

这将允许从多个层构建任何类型的相对复杂的文本文件。仍然支持所有普通模板标记,但通常可用于查询结果的标记只在[Feature]…[/Feature]内有效。这些标签也适用于现有的系统,但不会像使用1模板一样有用。

备注

最后一条记录后面有尾随的记录分隔符通常是一个问题。例如,在json模板中,在[Feature]块的尾随逗号上方会导致Internet Explorer出现问题。因此,我建议支持一个“trim”属性,该属性告诉模板处理器从最后一个处理的特性的输出端删除该字符串。

备注

结果集可以应用于多个层,因此name属性将采用逗号分隔的层列表。列出的顺序是显示结果的顺序。也可以使用组,但在这一点上,这似乎是一个相当罕见的用例。

备注

结果集还将具有maxresults属性,以便可以限制处理的功能的数量。

其他映射文件更改

通过将模板移出层,我们将失去将层标记为可查询的能力。丹建议在layerobj中添加一个可查询的真/假选项。这可以作为这个RFC的一部分,尽管它不是必需的。我们可以继续利用虚拟模板值。添加它需要正常的更改来支持一个新的关键字,以及对mapquery.c中的函数进行一个小的更改,以测试层是否可查询。基本上,一个层可以查询,如果:1)它有一个模板,或者2)可查询为真(默认为假)。

文档

详细说明新模板输出功能的文档将添加到mapfile引用指南(outputformat和web对象)和模板引用指南(new[resultset]、[feature]、[join]和[include]标记)中。

实施

C:不需要更改(我认为),不需要定义默认格式,也不需要扩展outputformatobj结构。

mapfile.c/maplexer.l:允许从URL更改webobj queryformat。(TODO:添加对将层设置为可查询的支持)

C:为新标签添加处理器功能。更新进程行以识别[resultset]和[join]标记(该[feature]标记只在[resultset]块内有效。在同一个源文件中编写一个类似于msReturnQuery()的新单模板处理函数,类似于msReturnSingleTemplateQuery()。

mapserv.c:在查询处理switch语句的末尾添加代码,查看web->queryformat的值。如果它按名称引用了现有的输出格式,则使用格式指向的文件msReturnSingleTemplateQuery(),否则按当前完成的方式处理。

注意:为了简化标签分析(至少在最初),我建议要求在模板文件中的自己行上存在开始和结束标签(这是对图例模板的要求吗?)。根据图例模板块的不同,完成一些实现工作后,可以删除此要求。

MapScript

尽管我们可能选择在以后的日期将模板化输出作为一个选项公开,但此时MAPScript中没有预期的更改。

向后兼容性问题

预计不会出现其他兼容性问题。当前的模板机制将继续工作。如果queryformat未引用当前系统将启动的outputformatobj。实际上,当前系统可以使用几个新的建议标签,特别是[join]和[include]标签。

臭虫识别码

没有指定。

投票历史

没有