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一致。
模型图:http://maps.dnr.state.mn.us/mapserver_docs/rfc25_extent.pdf
技术细节¶
受影响的文件(相对于主开发主干中的文件):
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。必须努力让这些人意识到变化。
Mapfile 含义¶
无,这些只是内部更改。
MapScript含义¶
无,这些只是内部更改。
文件的含义¶
一个像素和一个范围的模型需要记录在几个地方:mapfile引用、相关的OWS服务操作方法,也许还有一个与这个主题相关的新操作方法。
测试计划¶
需要开发一些测试来验证数学。使用gdal的wcs接口或输出驱动程序是很好的候选者,因为它们产生地理引用的输出。已经进行了一些测试来验证问题的存在(首先通过WCS发现)和建议的修复。
可以使用迷你图像(例如7x7)验证渲染是否合理。例如,如果将范围绘制为多边形,则希望看到左边缘和上边缘的线,而不是底部和右侧的线。这是因为maxx,miny范围值不会表示输出中的像素(而不是右边和/或下面的下一个图块)。
人员配备/时间表¶
对maputil.h、map.h、mapwcs.c和mapwms.c的更改将由steve lime完成。对mapserver其他部分的更改将与各个组件所有者进行协调。此RFC将在5.0版本中完成。