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

标签 c scale bounding-box mapserver wms

我需要计算 map 坐标中给定边界框的比例 (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" };

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

最佳答案

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

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 的 <math.h> 中的三角函数。要求。从度数到弧度的转换很简单:r = pi/180.0。结果的单位是您使用的周长单位。南北边长度相等,东西尺寸根据纬度和南北范围的长度而不同,因此是三个值,而不是两个或四个。

要计算比例,您可能只需要这些值之一,我建议 lengthNorthSouth值,因为它不需要三角函数,因此不需要转换为弧度(在本例中除以 360 而不是 2*pi)。

将一侧的长度除以图像的相应边长即可得出比例。

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

关于计算给定边界框以及图像的宽度和高度的比例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9255834/

相关文章:

c - 逐行读取字符串数组中的内容

Android VideoView如何缩放为ImageView缩放类型fitXY?

algorithm - 球扇形边界框(锥球相交)

使用lua源编译C代码

c - C中的strtok和strsep有什么区别

c - 0x0F8AD4EC (ucrtbased.dll) 处抛出异常

azure - azure应用服务中最大连接和响应超时的自动缩放规则

css - 复合缩放和旋转变换会扭曲内容

algorithm - 如何从包含给定点的一组点中找到最小的 N 维单纯形?

xna - 如何检查 XNA 4.0 中的边界框?