我需要计算 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/