栅格数据

作者

弗兰克·沃默丹

联系

Pobox.com上的Warmerdam

作者

杰夫麦克纳

联系

jmckenna在gatewaygeomatics.com

最后更新

2021-11-13

介绍

MapServer支持在地图中呈现各种栅格文件格式。下面介绍了一些支持的格式,以及哪些格式支持哪些功能。

本文档假定您已经熟悉设置mapserver Mapfile 但确实解释了 Mapfile 的特定于栅格的方面。

如何将栅格添加到 Mapfile 中?

一个简单的栅格层声明如下所示。这个 DATA 文件相对于 SHAPEPATH ,很像向量文件。

LAYER
  NAME "JacksonvilleNC_CIB"
  DATA "Jacksonville.tif"
  TYPE RASTER
  STATUS ON
END

PROJECTION, METADATA, PROCESSING, MINSCALE, 和 MAXSCALE CONNECTION, CONNECTIONTYPE, 或 FEATURE

分类栅格

栅格可以以类似于矢量的方式分类,但有一些例外。

CLASSITEM.

LAYER
  NAME "JacksonvilleNC_CIB"
  DATA "Jacksonville.tif"
  TYPE RASTER
  STATUS ON
  CLASSITEM "[pixel]"
  # class using simple string comparison, equivalent to ([pixel] = 0)
  CLASS
    EXPRESSION "0"
    STYLE
      COLOR 0 0 0
    END
  END
  # class using an EXPRESSION using only [pixel].
  CLASS
    EXPRESSION ([pixel] >= 64 AND [pixel] < 128)
    STYLE
      COLOR 255 0 0
    END
  END
  # class using the red/green/blue values from the palette
  CLASS
    NAME "near white"
    EXPRESSION ([red] > 200 AND [green] > 200 AND [blue] > 200)
    STYLE
      COLOR 0 255 0
    END
  END
  # Class using a regular expression to capture only pixel values ending in 1
  CLASS
    EXPRESSION /*1/
    STYLE
      COLOR 0 0 255
    END
  END
END

CLASS CLASS 有一个 NAME LEGEND. COLOR, EXPRESSIONNAME CLASS

BANDS

分类非8位栅格

自MapServer 4.4起,已添加对非8bit栅格输入分类的支持。即值在0-255范围之外的输入栅格。大多数情况下,这是透明的,但有一些警告和选项来提供显式控制。

在MapServer中对栅格数据进行分类是通过对所有预期的输入值进行预分类,并使用分类结果表在渲染时查找每个像素来完成的。这是因为根据一系列类定义来评估像素值对于典型渲染图像中数十万像素来说相对昂贵。

对于简单的8位输入,只需对256个输入值进行预分类。但对于非8bit输入,需要对更多的值进行分类。对于16位整数输入,所有65536个可能的输入值都是预先分类的。对于浮点和其他输入数据类型,最多可以根据输入值的最大预期范围对65536个值进行预分类。

这个 PROCESSING SCALE=min,max SCALE_BUCKETS PROCESSING

下面的示例对浮动栅格进行分类,但仅对范围-10到10的4个值进行分类。特别是,分类值为-7.5、-2.5、2.5和7.5(范围的每个“四分之一”的中间)。所以这四个值被分类,其中一个分类结果是根据哪个值最接近被分类的像素值来选择的。

LAYER
  NAME grid1
  TYPE raster
  STATUS default
  DATA data/float.tif
  PROCESSING "SCALE=-10,10"
  PROCESSING "SCALE_BUCKETS=4"
  CLASS
    NAME "red"
    EXPRESSION ([pixel] < -3)
    STYLE
      COLOR 255 0 0
    END
  END
  CLASS
    NAME "green"
    EXPRESSION ([pixel] >= -3 and [pixel] < 3)
    STYLE
      COLOR 0 255 0
    END
  END
  CLASS
    NAME "blue"
    EXPRESSION ([pixel] >= 3)
    STYLE
      COLOR 0 0 255
    END
  END
END

支持的格式

自6.2版以来,MapServer栅格输入支持仅通过gdal栅格库提供。

备注

有关PGRaster访问,请参阅: Postgis/PostgreSQL

有关GDAL的更多信息,请访问https://GDAL.org,包括 supported formats list . 一些高级的MapServer栅格功能(如重新采样、生成RGB颜色立方体和自动投影捕获)只适用于通过gdal使用的栅格格式。gdal通常与mapserver分开构建和安装,然后在使用 --with-gdal 配置开关。

要查明gdal支持是否内置到特定的mapserver可执行文件中,请使用-v标志来发现启用了哪些构建选项。为了找出可用的gdal格式,可以使用“gdalinfo--formats”命令。例如:

warmerda@gdal2200[124]% mapserv -v
MapServer version 6.2.0 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG
SUPPORTS=PROJ SUPPORTS=GD SUPPORTS=AGG SUPPORTS=FREETYPE
SUPPORTS=CAIRO SUPPORTS=OPENGL SUPPORTS=ICONV SUPPORTS=WMS_SERVER
SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT
SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER SUPPORTS=FASTCGI
SUPPORTS=THREADS SUPPORTS=GEOS INPUT=JPEG INPUT=POSTGIS INPUT=OGR
INPUT=GDAL INPUT=SHAPEFILE


warmerda@gdal2200[18]% gdalinfo --formats
Supported Formats:
  VRT (rw+v): Virtual Raster
  GTiff (rw+vs): GeoTIFF
  NITF (rw+vs): National Imagery Transmission Format
  RPFTOC (rovs): Raster Product Format TOC format
  ECRGTOC (rovs): ECRG TOC format
  ...

栅格和瓷砖索引

在处理非常大的栅格图层时,将栅格图像拆分为多个较小的图像通常很方便,而且性能更高。每个文件都是可供显示的较大栅格马赛克的平铺。构成一个层的文件列表可以存储在一个shapefile中,其中多边形表示每个文件的足迹和文件名。这被称为“tileindex”,其工作原理与向量层中的相同功能类似。结果可以在 Mapfile 中表示为一个图层,但MapServer将首先扫描图块索引,并确保只打开与当前显示请求重叠的栅格文件。

DATA

从MapServer 6.4开始,文件可以有不同的坐标系(投影)。这需要指定 TILESRS 关键字,并通过一些附加选项生成tileindex。见 不同投影中的瓷砖索引 .

LAYER
  NAME "hpool"
  STATUS ON
  TILEINDEX "hp2.shp"
  TILEITEM "Location"
  TYPE RASTER
END

SHAPEPATH SHAPEPATH SHAPEPATH

虽然有很多方法可以生产 TILEINDEX gdaltindex 程序,gdal实用程序套件的一部分。gdal index程序将从命令行上传递的gdal支持的栅格文件列表中自动生成平铺索引形状文件。

Usage: gdaltindex [-tileindex field_name] index_file [gdal_file]*
% gdaltindex doq_index.shp doq/*.tif

平铺索引注释

  • 如果形状文件(索引文件)不存在,将创建该文件。

  • 默认的平铺索引字段为“位置”。

  • 简单矩形多边形必须在与栅格层相同的坐标系中生成。如果tileindex中的文件与栅格层不在同一投影中,或者位于异构投影中,则必须在图层定义中指定tilesrs关键字。见 不同投影中的瓷砖索引

  • 栅格文件名将完全按照命令行中指定的方式放入文件中。

  • SHAPEPATH

gdalindex程序是gdal的一部分。包括gdalindex程序在内的gdal的预构建二进制文件可以作为 OSGeo4WFWToolsMS4W 分布。

参见

瓦片索引

栅格翘曲

MAPServer能够将gdal raster快速重采样到新的投影中。非gdal栅格只能上下采样,无任何旋转或扭曲。

如果一个栅格层的投影与正在生成的地图的投影不同,则会发生栅格扭曲。扭曲的栅格层比普通的栅格层渲染成本要高很多,渲染时间可能是普通层的2-4倍。投影和基准移动变换仅在选定的点处计算,通常沿扫描线线性插值(只要误差小于0.333像素)。

除了重新投影栅格外,栅格扭曲能力还可以将旋转应用于地理参考信息中具有旋转系数的GDAL栅格。目前,旋转系数不会触发栅格扭曲,除非地图和图层具有有效(尽管匹配很好)的投影定义。

24位RGB渲染

传统上,mapserver用于生成8位伪彩色地图显示,这些伪彩色地图显示是由8位灰度或伪彩色栅格数据生成的。但是,如果要渲染的栅格文件实际上是24位的(红、绿和蓝波段),那么就需要考虑其他因素。通过gdal渲染器支持24位图像的渲染。

IMAGEMODE OUTPUTFORMAT

PROCESSING

OUTPUTFORMAT IMAGEMODE IMAGEMODE

特殊处理指令

从MapServer 4.0开始,处理参数被添加到 LAYERMapfile . 它主要用于将专用的栅格处理选项传递给基于gdal的栅格渲染器。MapServer 4.0及更高版本支持以下处理选项。

BANDS=red_or_grey[,green,blue[,alpha]]

此指令允许从栅格文件中选择特定的波段。如果选择了一个波段,它将被视为灰度。如果选择3,则它们将被视为红色、绿色和蓝色。如果选择4,它们将被视为红色、绿色、蓝色和阿尔法(不透明度)。

从MapServer 8开始,如果指定了波段,则附加到栅格的GDAL掩膜波段(不是Alpha波段)将自动用于不透明度渲染,除非 PROCESSING 设置了“USE_MASK_BAND=no”选项。

例子:

PROCESSING "BANDS=4,2,1"
COLOR_MATCH_THRESHOLD=n

更改颜色需要与颜色表中的条目匹配的精度,以便在生成8位颜色映射输出(ImageMode PC256)时使用它。通常,来自栅格颜色映射(或灰度值)的颜色需要精确匹配。这就放宽了在指定颜色距离内的要求。因此,颜色匹配阈值3意味着将使用3内的现有颜色条目(红、绿和蓝的差之和),而不是创建新的颜色映射条目。尤其是对于灰度栅格图层,它通常会使用所有256种颜色的条目(如果可用),这是避免“窃取”整个栅格图层的颜色映射的一个好方法。通常在2-6范围内的值会产生良好的结果。

例子:

PROCESSING "COLOR_MATCH_THRESHOLD=3"
**抖动=是* *

这将打开错误扩散模式,用于将24位图像转换为8位图像,并进行错误扩散以获得更好的颜色效果。

例子:

PROCESSING "DITHER=YES"
EXTENT_PRIORITY=WORLD

用世界文件覆盖gdal。

例子:

PROCESSING "EXTENT_PRIORITY=WORLD"
LOAD_FULL_RES_IMAGE=YES/NO

此选项会影响在重新投影或以其他方式进行复杂重采样(而不是快速默认图像抽取代码路径)时为重采样器加载图像数据的方式。如果启用此选项,将强制以完全分辨率加载源图像(默认值为否)。这有助于解决在进行根本扭曲时默认图像分辨率选择的问题。如果源图像较大,则会导致处理速度非常慢。

LOAD_WHOLE_IMAGE=YES/NO

此选项会影响为重采样器加载图像数据的方式(如上所述)。如果启用此选项,将导致加载整个源图像,并帮助弥补识别所需区域的问题,通常是由于日期线附近的根本图像重新投影或投影“地平线”。默认值为否。启用此选项会显著影响渲染性能和内存需求。

LUT[_n]=<lut_spec>

此指令(mapserver 4.9+)指示gdal阅读器将自定义LUT(查找表)应用于一个或所有色带,作为动态颜色校正的形式。如果使用lut,lut将应用于所有色带。如果使用lut_n,它将应用于一个色带(n为1表示红色,2表示绿色,3表示蓝色,4表示alpha)。

可以以以下形式内联指定LUT::

<lut_spec> = <in_value>:<out_value>[,<in_value>:<out_value>]*

这基本上建立了映射到特定输出值的特定输入值。列表以0:0和255:255隐式开头。实际的256个条目查找表是根据该规范创建的,在值之间进行线性插值。in值必须按递增顺序。

从MapServer 7.2开始,输入值的范围可以达到65535。必须明确列出曲线的最后一个点,例如,对于12位栅格,4095:255。只有在未指定scale指令的情况下,才正确支持此扩展lut语法,因为扩展lut的目的主要是避免预缩放。

lut规范也可以在文本文件中,文件名为<lut_spec>。文件内容应采用相同的语法,并相对于mapfile搜索文件。

例子:

PROCESSING "LUT_1=red.lut"
PROCESSING "LUT_2=green.lut"
PROCESSING "LUT_3=blue.lut"
  or
PROCESSING "LUT=100:30,160:128,210:200"

作为特殊情况,还支持gimp格式的曲线文件。这是由工具->颜色->曲线工具写出的文本文件。如果将其指定为文件名,则将根据曲线控制点将其内部转换为线性段。请注意,这不会产生与GIMP完全相同的结果,因为在控制点之间使用线性插值,而不是在GIMP中使用的曲线。对于合理数量的控制点,结果应该相似。还要注意,gimp颜色曲线文件包括一个整体的“值”曲线,以及红色、绿色、蓝色和alpha的曲线。值曲线和适当的颜色曲线将在内部组成,以生成最终的LUT。

例子:

PROCESSING "LUT=munich.crv"
OVERSAMPLE_RATIO=double

默认值为2.5。渲染时间将随着过采样率的增加而增加。

例子:

PROCESSING "OVERSAMPLE_RATIO=1.0"
重采样=最近/平均/双线性

此选项可用于控制重新采样内核使用的栅格图像采样。默认值(也是最快的)是最近的。Average将执行计算被映射到输出像素的磁盘文件区域中所有像素的平均像素值(或者可能只是它们的一个采样)。双线性将计算目标位置周围四个像素的线性插值。本主题将在 MS RFC 4:MapServer栅格重新采样 .

重新采样选项而不是最近的结果是使用广义翘曲器,可以大大降低栅格处理速度。一般来说,平均值可以用来减少大幅减少采样数据中的噪声,并且可以为黑白线条提供近似的抗锯齿效果。双线性在对数据进行过采样时会很有帮助,以获得平滑的外观。

示例(选择一个):

PROCESSING "RESAMPLE=NEAREST"
PROCESSING "RESAMPLE=AVERAGE"
PROCESSING "RESAMPLE=BILINEAR"
比例[u n]=自动或最小,最大值

该指令指示GDAL阅读器预先缩放输入的栅格数据。它主要用于将16位或浮点数据缩放到0-255范围,但也可用于构造8位数据。如果提供了显式的最小/最大值,那么输入数据将被拉伸(或压缩),以便最小值映射为零,最大值映射为255。如果使用自动,则会自动计算最小值/最大值。要控制单个输入波段的缩放,请使用scale_1、scale_2和scale_3关键字(用于红色、绿色和蓝色),而不是适用于所有波段的缩放。

例子:

PROCESSING "SCALE=AUTO"
 or
PROCESSING "SCALE_1=409,1203"
PROCESSING "SCALE_2=203,296"
PROCESSING "SCALE_3=339,1004"
worldfile=<file>

指定替代世界文件(用于地理参考)。如果只指定了路径,则将追加数据集的基名称。后缀(.wld/.tfw/…)可以省略。

例子:

PROCESSING "WORLDFILE=/path/"
 or
PROCESSING "WORLDFILE=/path/file.wld"
 or
PROCESSING "WORLDFILE=/path/file"

栅格查询

MapServer4.4中添加的一个新功能是能够以类似于对向量层查询的方式对栅格执行查询。栅格图层上的栅格查询为匹配查询的每个像素返回一个点特征。点特征将具有指示该像素上不同带区的值、最终渲染颜色和类名的属性。生成的特性可以在mapscript中直接访问,也可以通过模板(类似于普通向量查询结果)进行处理。即使查询方法实际上不使用查询模板(很像矢量数据),也只能查询与查询模板关联的栅格图层。

栅格查询支持querybypoint、querybyect和querybyshape。QueryByPoint支持单个和多个结果查询。栅格层不支持其他查询操作,如querybyindex、querybyindexadd、querybyattributes和querybyfeature。

栅格图层有 not 支持将查询保存到磁盘,也不支持 查询图.

栅格查询返回具有以下部分或全部属性的点要素:

X

地理参考X像素位置。

Y

像素的地理参考Y位置。

value_list

目标像素上所有选定带区的值的逗号分隔列表。

value_n

选定列表中第n个波段在此像素处的值(基于零)。每个选定波段都有一个值条目。

此像素所属的类的名称(仅限分类层)。

红色

此像素的显示颜色的红色分量。

绿色

此像素的显示颜色的绿色组件。

蓝色

此像素的显示颜色的蓝色组件。

PROCESSING PROCESSING

PROCESSING

查询结果可以通过正常的查询模板HTML替换返回为HTML。也可以通过wms getfeatureinfo调用和mapscript访问查询结果。下面的示例显示从python mapscript执行功能查询并获取结果:

map = mapscript.Map('rquery.map')
layer = map.getLayer(0)

pnt = mapscript.Point()
pnt.x = 440780
pnt.y = 3751260

layer.queryByPoint( map, pnt, mapscript.MS_MULTIPLE, 180.0 )

layer.open()
for i in range(1000):
  result = layer.getResult( i )
  if result is None:
    break

  s = layer.getShape( result )
  for i in range(layer.numitems):
    print '%s: %s' % (layer.getItem(i), s.getValue(i))

layer.close()

下面是一个简单的示例查询 TEMPLATE 文件。在将查询结果作为HTML返回给用户之前,将替换栅格像素属性。

Pixel:<br>
  values=[value_list]<br>

  value_0=[value_0]<br>
  value_1=[value_1]<br>
  value_2=[value_2]<br>
  RGB = [red],[green],[blue]<p>
  Class = [class]<br>

在内部,栅格查询结果基本上被视为一组缓存在RAM中的临时特性。发出新的查询操作将清除层上现有的查询缓存。由于保存的查询结果通常只包含特征ID,而不是整个特征,因此栅格查询结果的临时内存表示法也会导致无法保存栅格查询结果。一些附加信息可在 RasterQuery 维基主题。

栅格显示性能提示

  • 为大栅格构建概述级别,以确保只需触摸合理数量的数据即可显示大图层的概述。概述可以实现为一组不同分辨率的栅格层,使用 MINSCALEDENOM, 和 MAXSCALEDENOM gdaladdo 实用工具。

  • 当使用tileindex将许多栅格文件作为单个文件来管理时,特别重要的是要有一个以高比例启动的概述层,以避免必须打开大量栅格文件来满足地图请求。

  • 使用颜色映射将RGB图像预处理到8位,以减少必须读取的数据量和动态计算量。

  • TILEINDEX

  • 确保图像以最常用的投影方式保存在磁盘上,以避免飞行中的图像扭曲,这是相当昂贵的。

  • 如果要从Web服务器日志文件中的mapserver获取调试输出,请检查是否显示消息msresamplegdaltomap in effect。如果是这样,栅格层将重新采样。如果您认为不应该对其重新取样,请仔细查看 Mapfile ,以确保图层投影与地图投影完全匹配,或者图层没有投影定义。

预处理栅格

以下操作使用gdal命令行实用程序,其中一些是python脚本。它们通常可用于任何支持python的gdal安装。

生成平铺数据集

TIFF和ERDAS IMEAL格式支持文件中的内部平铺,通常可以为来自大型图像的本地地图请求提供更好的显示速度。使用tiled=yes创建选项和 gdal_translate 实用工具:

gdal_translate -co TILED=YES original.tif tiled.tif

Erdas Imagine(HFA)文件总是平铺的,可以大于4GB(geotiff限制)。使用如下命令将栅格转换为图像格式:

gdal_translate -of HFA original.tif tiled.img

将RGB减少到8位

渲染和返回24位图像(尤其是PNG)在渲染/压缩时间和带宽上可能非常昂贵。预先将栅格数据减少到8位,可以节省磁盘空间、处理时间和带宽。然而,这样的颜色减少也隐式地降低了生成的地图的质量。颜色还原可以由MapServer即时完成,但这需要更多的处理。一种更快的方法是将24位图像的颜色预缩为8位图像。这可以用gdal rgb2pct.py脚本完成,如下所示:

rgb2pct.py original.tif 8bit.tif

默认情况下,图像将减少到256色,但这可能意味着没有足够的颜色来渲染地图中的其他颜色。因此可能需要减少颜色:

rgb2pct.py -n 200 original.tif 8bit.tif

在内部瓷砖铺设和建筑概况之前,应将采样降到8位。py脚本尝试为给定的图像计算一个最佳颜色表,然后在24位到8位的减少过程中使用错误扩散。其他软件包(如ImageMagick或Photoshop)可能具有更适合某些用途的可选颜色还原算法。

建筑内部概述

大多数支持gdal的栅格格式都可以使用 gdaladdo 实用工具。但是,一些格式(如JPEG2000、MRSID和ECW)已经在格式本身中包含了隐式的概述,一般不会从外部概述中受益。对于其他格式(如geotiff和erdas image格式),使用如下命令构建概述:

gdaladdo tile.tif 2 4 8 16 32 64 128

上面将构建从x2到x128抽取级别的概述。默认情况下,它使用“最近邻”下采样。这是为每个输出像素选择输入下采样区域中的一个像素。对于某些类型的数据,平均值可以提供更平滑的概述结果,这可能是通过以下命令生成的:

gdaladdo -r average tiled.tif 2 4 8 16 32 64 128

请注意,概述构建应在转换为最终格式后完成。在使用gdal_Translate进行格式转换时,概视图会丢失。此外,不需要执行任何特殊操作即可使MapServer使用GDAL生成的概视图。当MapServer请求降低分辨率的地图时,GDAL会自动拾取它们。

建筑外部概述

MINSCALEDENOM / MAXSCALEDENOM

gdal_merge.py -o overview.tif -ps 250 250 ortho_*.tif

gdal-merge.py实用程序存在各种问题,包括不支持不同的重新采样内核。使用gdal 1.3.2或更高版本,它应该能够完成与更灵活的gdalwarp实用程序类似的任务:

gdalwarp -rc -tr 250 250 ortho_*.tif overview.tif

在某些情况下,生成概述的最简单方法是让mapserver使用shp2img实用程序来完成。例如,如果tileindex层被称为“Orthos”,我们可以执行如下操作:

shp2img -m ortho.map -l orthos -o overview.png

请注意,将使用.map文件中的范围和大小生成概述,因此可能需要临时调整地图范围和大小值以匹配栅格范围和所需的输出大小。另外,如果使用这种方法,不要留下PNG(或GIF或JPEG)格式的大文件,因为它们是从中提取子区域的缓慢格式。

带有世界文件的地理参考

世界文件是将地理参考(世界坐标)信息与栅格文件关联的简单机制。ESRI是第一家传播世界文件使用的公司,它们通常与TIFF一起使用,而不是将地理参考信息嵌入文件本身。

世界文件内容如下。第一个系数是x像素大小。第二个和第三个是旋转/剪切系数(通常应为0.0)。第四个是Y像素大小,通常为负,表示Y从左上角向下移动时减小。最后两个值是左上像素中心的X和Y位置。此示例适用于像素大小为2米x 2米且左上角原点位于(356800E,5767999N)的图像:

2
0.0000000000
0.0000000000
-2
356800.00
5767999.00

世界文件的名称基于与之相关的文件。例如,aerial.tif的世界文件可能是aerial.tfw。对于适当的结尾,约定会有所不同,但是对于mapserver,扩展名.wld对于world文件总是可以的。