计算给定边界框的比例以及图像的宽度和高度

时间:2012-02-13 05:04:33

标签: c scale bounding-box mapserver wms

我需要计算给定地图坐标(EPSG:900913)中的边界框和图像宽度/高度的比例。

这是因为我实现了一个非常基本的WMS服务器,但在某些时刻我需要知道图像的规模。

一个简单的请求是:

  wms.exe?LAYERS=all&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&FORMAT=image%2Fjpeg&SRS=EPSG%3A900913&BBOX=-7810029.800979,-2298920.0623849,-7809724.0528659,-2298614.3142718&WIDTH=256&HEIGHT=256

该请求源自使用此参数配置的网页中的openlayer组件:

var optionsGmap = {
projection: new OpenLayers.Projection("EPSG:900913"),
units: "m",
sphericalMercator: true,
numZoomLevels: 16,
maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34),
scales : [110936068.185464,55468034.0927321,27734017.0463661,13867008.523183,6933504.26159152,
    3466752.13079576,1733376.06539788,866688.03269894,433344.01634947,216672.008174735,108336.004087367,54168.0020436837,27084.0010218419,
    13542.0005109209,6771.00025546046,3385.50012773023],
maxResolution: "auto" };

theres公式计算这个?我可以在后端访问postgres + posgis,但我更喜欢自己在C代码中进行计算。

1 个答案:

答案 0 :(得分:1)

正交地理区域的每一边的长度如下:

lengthEastWestNorth = (east - west) * ((equatorial_circumference * cos(north)) / (2*pi) ) ;
lengthEastWestSouth = (east - west) * ((equatorial_circumference* cos(south)) / (2*pi)) ;
lengthNorthSouth = (north - south) * (polar_circumference/(2*pi)) ;

请注意,东,西,北,南是弧长的长/纬角,因为这是C中的trig函数所需要的。从度数到弧度的转换只是r = pi / 180.0。结果的单位是您用于圆周的任何单位。南北两侧长度相等,东西向尺寸根据纬度和南北大小的长度而不同,因此三个值不是两个或四个。

要计算比例,您可能只需要其中一个值,我建议使用lengthNorthSouth值,因为它不需要触发函数,因此不会转换为弧度(在这种情况下除以360而不是2 * pi)

一侧的长度除以图像的相应边长将产生刻度。

地理计算必然是近似值,例如,地图投影可能使用不同的圆周值,因此您必须确定最近首选比例以确定预期比例。依次从每个首选刻度中减去计算出的刻度,以确定具有最小绝对值(删除符号)差异的刻度。