【问题标题】:Calculate the scale given a bounding box and the width and the height of a image计算给定边界框的比例以及图像的宽度和高度
【发布时间】:2012-02-13 05:04:32
【问题描述】:

我需要计算地图坐标中给定边界框的比例 (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 代码中进行计算。

【问题讨论】:

  • 这肯定是一个数学问题而不是编程问题?

标签: c scale bounding-box mapserver wms


【解决方案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 语言 <math.h> 中的三角函数所要求的。从度数到弧度的转换只需 r = pi/180.0。结果的单位是您用于圆周的任何单位。南北边长度相等,东西尺寸因纬度而异,南北范围的长度不同,因此三个值不是两个或四个。

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

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

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

【讨论】:

  • 谢谢,这是一道数学题,有类似 stackoverflow 的网站吗? (在此之后搜索),我要尝试这个公式,它应该给我与“比例”属性中相同的值,因为请求是针对小比例的,所以这些值应该给我一个 3385.50012773023 的比例。跨度>
  • @alter:确实如此,但要注意结果的精度。此外,即使它不是近似值,将一个计算/转换的浮点值与另一个计算值进行比较也不太可能成功,即使它们在数学上相等。我认为你会很幸运能达到百分之几。
  • 关于数学,这很简单,因为地图可能与地理经度/纬度正交。您所需要的 N-S 距离只是极圆周的一小部分,即 360 度和大约 40 007.863 公里(WGS84 参考)。东西距离更复杂,但也不过是高中三角学——余弦计算特定纬度圆上的周长,然后距离只是其中一部分的增益。
猜你喜欢
  • 2020-12-28
  • 2020-07-15
  • 2022-12-12
  • 2011-06-04
  • 2011-03-28
  • 2011-12-30
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
相关资源
最近更新 更多