MS RFC 25:将MapServer像素和扩展模型与OGC模型对齐

日期

2007/10/23

作者

史蒂夫·莱姆

联系

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

状态

草稿

概述

目前,MapServer使用的像素和范围模型与WCS和WMS等OGC服务定义的模型不同。MapServer使用像素的中心来表示其唯一的坐标值。范围被解释为从图像中的ul像素中心到图像中lr像素中心的边界框。为什么?好吧,它可以追溯到MapServer旁边的配套软件,显示存储在ERDAS中的卫星数据,ERDAS使用中心到中心的范围模型。数学很简单,并且有一定的逻辑可以让范围实际代表像素值——也就是说,如果将范围渲染为多边形,则可以得到图像的精确边缘,正如人们所期望的那样。

另一方面,OGC服务规范定义了一个范围(bbox),以引用所请求图像外边缘的尺寸。这似乎是一种更常见的表达感兴趣领域的方法。

我无法从各种OGC规范中确定单个像素的坐标位置。MapServer“无法”保留基于中心的像素模型。这确实增加了映射的复杂性<=>图像坐标转换,因为您必须将内容偏移一半的单元格大小。因为那个计算已经做了很多次,所以我希望性能会受到影响。我们可以通过计算和存储半个cellsize值来优化事情(就像cellsize现在一样),但这会使C API复杂化,需要进行大量的更改。我建议移动到左上角的像素模型来简化这些转换。

注:在查看代码时,过去曾在4.8和4.10中努力达到OGC的程度,但并未普遍应用。此RFC将确保整个MapServer使用相同的范围和像素模型,并且与OGC一致。

技术细节

受影响的文件(相对于主开发主干中的文件):

  • map.h:更改ms-cellsize的定义

#define MS_CELLSIZE(min,max,d)    ((max - min)/d)
  • map.h:更改坐标转换宏(不更改,只添加注释)

/*
** These macros work relative to the UL corner of the UL pixel of a map exent. Pixel
** model is (as of 5.0) the UL corner of a pixel. UL pixel = minx,maxy.
*/
#define MS_MAP2IMAGE_X(x,minx,cx) (MS_NINT((x - minx)/cx))
#define MS_MAP2IMAGE_Y(y,maxy,cy) (MS_NINT((maxy - y)/cy))
#define MS_IMAGE2MAP_X(x,minx,cx) (minx + cx*x)
#define MS_IMAGE2MAP_Y(y,maxy,cy) (maxy - cy*y)
  • maputil.c:更新msadjustextent()。

ox = MS_MAX((width - (rect->maxx - rect->minx)/cellsize)/2,0);
oy = MS_MAX((height - (rect->maxy - rect->miny)/cellsize)/2,0);
  • mapwcs.c:删除要在mapserver扩展和ows扩展之间转换的代码

  • mapwms.c:删除要在mapserver扩展和ows扩展之间转换的代码

  • mapwmsclient.c删除要在mapserver扩展和ows扩展之间转换的代码

  • 各种栅格层处理程序:这里需要Frank的注释。

  • MapScript…缩放功能:我不认为这些需要任何更改。

这些变化对最终用户的影响应该是最小的,因为他们不太可能意识到程度解释上的差异。更大的影响可能是对第三方应用程序,如dbox、chameleon和qgis,它们管理扩展数据块并调用mapserver。必须努力让这些人意识到变化。

映射文件含义

无,这些只是内部更改。

MapScript含义

无,这些只是内部更改。

文件的含义

一个像素和一个范围的模型需要记录在几个地方:mapfile引用、相关的OWS服务操作方法,也许还有一个与这个主题相关的新操作方法。

测试计划

需要开发一些测试来验证数学。使用gdal的wcs接口或输出驱动程序是很好的候选者,因为它们产生地理引用的输出。已经进行了一些测试来验证问题的存在(首先通过WCS发现)和建议的修复。

可以使用迷你图像(例如7x7)验证渲染是否合理。例如,如果将范围绘制为多边形,则希望看到左边缘和上边缘的线,而不是底部和右侧的线。这是因为maxx,miny范围值不会表示输出中的像素(而不是右边和/或下面的下一个图块)。

人员配备/时间表

对maputil.h、map.h、mapwcs.c和mapwms.c的更改将由steve lime完成。对mapserver其他部分的更改将与各个组件所有者进行协调。此RFC将在5.0版本中完成。