Рассчитать масштаб с учетом ограничивающей рамки, а также ширины и высоты изображения.

Мне нужно рассчитать масштаб с учетом ограничивающей рамки в координатах карты (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.


person alter    schedule 13.02.2012    source источник
comment
Это больше вопрос математики, чем программирование?   -  person Clifford    schedule 13.02.2012


Ответы (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).

Длина одной стороны, деленная на соответствующую длину стороны изображения, даст масштаб.

Географические расчеты обязательно являются приблизительными, а проекция карты может использовать, например, разные значения окружности, поэтому вам придется определить ближайший предпочтительный масштаб, чтобы определить предполагаемый масштаб. Вычтите рассчитанный масштаб из каждого из предпочтительных масштабов по очереди, чтобы определить масштаб с наименьшей абсолютной разницей (уберите знак).

person Clifford    schedule 13.02.2012
comment
спасибо, это вроде математический вопрос, для этого есть сайт, похожий на stackoverflow? (после этого погуглил), я собираюсь попробовать эту формулу, она должна дать мне те же значения, что и в атрибутах весов, поскольку запрос предназначен для малого масштаба, эти значения должны дать мне масштаб 3385,50012773023. - person alter; 14.02.2012
comment
@alter: Действительно, но обратите внимание, предупредив о точности результата. Более того, даже если бы это не было приближением, сравнение одного вычисленного/преобразованного значения с плавающей запятой на равенство с другим вычисленным значением вряд ли будет успешным, даже если они математически равны. Думаю, вам повезет, если вы уложитесь в несколько процентов. - person Clifford; 14.02.2012
comment
Что касается математики, она довольно проста, поскольку карты предположительно ортогональны географической долготе/широте. Расстояние с севера на юг, которое вам нужно, — это всего лишь часть полярной окружности, равной 360 градусам и примерно 40 007,863 км (ссылка WGS84). Расстояния Восток-Запад более сложны, но представляют собой не более чем школьную тригонометрию - косинус вычисляет длину окружности на конкретном круге широты, тогда расстояние является приростом только в пропорции к этому. - person Clifford; 14.02.2012