WMS时间

作者

Jeff McKenna

联系方式

jmckenna at gatewaygeomatics.com

最后更新

2019-11-21

介绍

WMS服务器可以为临时请求提供支持。这是通过在请求中提供带有时间值的时间参数来完成的。MapServer 4.4及更高版本支持解释时间参数并将结果值转换为适当的请求。

在MapServer中启用时间支持

时间模式

WMS规定用于时间请求的基本格式基于ISO 8601:1988(e)“扩展”格式。MapServer支持在ISO 8601规范中定义的一组有限的模式,以及一些其他有用但不符合ISO 8601的模式。以下是当前支持的模式列表:

表1。支持的时间模式

时间模式

实例

YYYYMMDD

20041012

YYYY-MM-DDTHH:MM:SSZ

2004年10月12日13:55:20Z

YYYY-MM-DDTHH:MM:SS

2004年10月12日13:55:20

年-月-日hh:mm:ss

2004年10月12日13:55:20

年-月-日时:月

2004年10月12日13:55

年-月-日hh:mm

2004年10月12日13:55

YYYY-MM-DDTHH

2004年10月12日13

YYY-MM-DH-HH

2004年10月12日至13日

年-月-日

2004-10-12

年-月

2004—10

YYYY

2004

THH:毫米:SSZ

T13:55∶20Z

厚度:mm:ss

T13:55∶20

设置具有时间支持的WMS层

要使有效的WMS层具有时间支持,用户必须在层级别定义以下元数据:

  • wms_timeextent:

  • wms_timeitem:(必选)这是数据库中包含时间值的字段的名称。

  • wms_timedefault:(可选)如果定义了该值并且请求中缺少该时间值,则使用该值。

还建议为时间层设置 :ref:`layer``filter`以同时为非WMS请求提供默认时间。如果时间项为“mytime”,时间格式为“yyyymmdd”,则可以使用以下层筛选器:

FILTER (`[mytime]` = `2004-01-01 14:10:00`)

指定时间范围

可以使用以下语法为 wms_timeextent 元数据(见附录C.3 WMS 1.1.1 specification 完整描述的文档):

  1. value-—单个值。这在MapServer中不直接受支持,但通过指定与最小值和最大值相同的值,很容易实现。

  2. value1,value2,value3,…—多个值的列表。

  3. min/max/resolution—由其下限和上限及其分辨率定义的间隔。这在MapServer中是受支持的(但是请注意,不支持解析)。

  4. min1/max1/res1,min2/max2/res2,…—多个间隔的列表。

WMS服务器层示例

LAYER
  NAME "earthquakes"
  METADATA
    "wms_title"    "Earthquakes"
    "wms_timeextent" "2004-01-01/2004-02-01"
    "wms_timeitem" "TIME"
    "wms_timedefault" "2004-01-01 14:10:00"
    "wms_enable_request" "*"
  END
  TYPE POINT
  STATUS ON
  DATA "quakes"
  FILTER (`[TIME]`=`2004-01-01 14:10:00`)
  CLASS
    ..
  END
END

获取能力输出

如果层设置正确,则请求服务器上的功能将输出一个维度元素。以下是为时间支持配置的层的getCapabilities结果示例:

<Layer queryable="0" opaque="0" cascaded="0">
    <Name>earthquakes</Name>
    <Title>Earthquakes</Title>
    <SRS>EPSG:4326</SRS>
    <LatLonBoundingBox minx="-131.02" miny="24.84" maxx="-66.59" maxy="48.39" />
    <BoundingBox SRS="EPSG:4326"
                minx="-131.02" miny="24.84" maxx="-66.59" maxy="48.39" />
    <Dimension name="time" units="ISO8601"/>
    <Extent name="time" default="2004-01-01 14:10:00" nearestValue="0">2004-01-01/2004-02-01</Extent>
</Layer>

支持的时间请求

使用时间参数发送请求时,可以指定不同类型的时间值。MapServer支持以下功能:

  • single value: 例如 : ...&TIME=2004-10-12&...

  • multiple values: 例如 : ...&TIME=2004-10-12, 2004-10-13, 2004-10-14&...

  • single range value: 例如 : ...&TIME=2004-10-12/2004-10-13&...

  • multiple range values:例如 : ...&TIME=2004-10-12/2004-10-13, 2004-10-15/2004-10-16&...

解释时间值

当MapServer接收到带有时间参数的请求时,它将时间请求转换为有效表达式,这些表达式被分配给具有时间意识的层上的筛选器参数。以下是处理不同类型请求的一些示例(此处将wms-timeitem定义为“time-field”):

  • 单值(2004-10-12) transforms to (`[时间域]`eq`2004-10-12`)

  • 多值(2004-10-12、2004-10-13) transform to (`[时间域]`eq`2004-10-12`或`[时间域]`eq`2004-10-13`)

  • 单量程:2004-10-12/2004-10-13 transforms to[时间域]`GE`2004-10-12)和([时间域]`LE`2004-10-13))

  • 多个范围(2004-10-12/2004-10-13、2004-10-15/2004-10-16) transform to[时间域]`GE`2004-10-12``和`[时间域]`LE`2004-10-13)或([时间域]`GE`2004-10-15``和`[时间域]`LE`2004-10-16

如以上示例所示,所有字段和值都写在back tics(`)中—这是在mapserver中指定时间表达式的一般方法。

此规则的例外情况:

  1. 当处理不是shapefile或通过ogr的层时,所构建的表达式的语法稍有不同。例如,上面第一个示例的过滤器中设置的表达式为([Time_Field]='2004-10-12')。

  2. 为了 Postgis/PostgreSQL 层,生成的时间表达式使用 date_trunc PostgreSQL中提供的函数。例如,如果用户传递的时间值为“2004-10-12”,则过滤器中设置的表达式为日期“turnc('day',time_field)='2004-10-12'。使用date_trunc函数允许请求使用时间分辨率的概念。在上面的示例中,对于“2004-10-12”的请求,mapserver通过分析时间字符串确定分辨率为“day”,结果给出所有与日期2004-10-12匹配的记录,而不管数据库中设置的小时/分钟/秒值如何。有关日期转换函数的更多信息,请参阅 PostgreSQL documentation .

限制要使用的时间格式

用户可以在Web级别的元数据中定义发送请求时要使用的时间格式。例如,用户可以定义以下两种格式:

"wms_timeformat" "YYYY-MM-DDTHH, YYYY-MM-DDTHH:MM"

另一个例子是基于时间数据的WMS层,该数据包含每分钟采集的精确时间值(例如,2004-10-12t13:55、2004-10-12t13:56、2004-10-12 t13:57,…)。通常,对这样一个层的有效请求需要时间值和下面的数据一样完整。通过定义一组要使用的模式,MapServer引入了在执行查询时要使用的解析概念。使用上面的示例,请求时间=2004-10-12t13:55是有效的,请求时间=2004-10-12t13也是有效的,它将返回为该小时所取的所有元素。

请注意,此功能仅在基于shapefiles和ogr的层上可用。

带Postgis栅格图像切片索引的WMS-T示例

此示例当前需要最新的4.9cvs构建!

下面是一个使用postgis tileindex的栅格WMS-T实例的mapfile片段示例。这个例子显示了在爱荷华州U运行的nexrad基本反射率,网址为http://mesenet.agron.iastate.edu/cgi-bin/wms/nexrad/nwr-t.cgi?服务=WMS&请求=getCapabilities

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#  Tile Index
LAYER
 STATUS ON
 NAME "time_idx"
 TYPE POLYGON
 DATA "the_geom from nexrad_n0r_tindex"
 METADATA
   "wms_title" "TIME INDEX"
   "wms_srs"   "EPSG:4326"
   "wms_extent" "-126 24 -66 50"
   "wms_timeextent" "2003-08-01/2006-12-31/PT5M"
   "wms_timeitem" "datetime" #column in postgis table of type timestamp
   "wms_timedefault" "2006-06-23T03:10:00Z"
   "wms_enable_request" "*"
 END
 CONNECTION "dbname=postgis host=10.10.10.20"
 CONNECTIONTYPE postgis
END

# raster layer
LAYER
 NAME "nexrad-n0r-wmst"
 TYPE RASTER
 STATUS ON
 DEBUG ON
 PROJECTION
   "init=epsg:4326"
 END
 METADATA
   "wms_title" "NEXRAD BASE REF WMS-T"
   "wms_srs"   "EPSG:4326"
   "wms_extent" "-126 24 -66 50"
   "wms_timeextent" "2003-08-01/2006-12-31/PT5M"
   "wms_timeitem" "datetime" #datetime is a column in postgis table of type timestamp
   "wms_timedefault" "2006-06-23T03:10:00Z"
   "wms_enable_request" "*"
 END
 OFFSITE 0 0 0
 TILEITEM "filepath" #filepath is a column in postgis table with varchar of the filepath to each image
 TILEINDEX "time_idx"
 FILTER (`[datetime]` = `2006-06-23T03:10:00Z`)
END

您可以在 WCS documentation .

未来增加

  • 支持特殊时间值:“当前”。

限制和已知错误

  • 模式“YYYYMMDD”在Windows上不起作用。( Bug#970