2012-02-13 6 views
0

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

+0

Это скорее вопрос математики, чем программирование. – Clifford

ответ

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)) ; 

Обратите внимание, что на восток, запад, север, юг, длинные/LAT углы в радианах, так это то, что функция наряжать в Кассиопеяне требуют. Преобразование из градусов в радианы просто r = pi/180.0. Единицы результата - это те единицы, которые вы используете для окружностей. Стороны с севера на юг имеют одинаковую длину, размеры восток-запад различаются в зависимости от широты и длины от севера до юга, поэтому три значения не два или четыре.

Чтобы вычислить масштаб, который, вероятно, потребуется только для одного из этих значений, я предлагаю значение lengthNorthSouth, так как он не требует функций триггера и, следовательно, не конвертируется в радианы (в этом случае разделите на 360, а не на 2 * pi).

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

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

+0

спасибо, это своего рода математический вопрос, theres stackoverflow как сайт для этого? (googling после этого), я собираюсь попробовать эти формулы, он должен дать мне те же значения, что и в атрибутах «шкалы», так как запрос для малого масштаба, эти значения должны дать мне шкалу 3385.50012773023. – alter

+0

@alter: Действительно, но прислушайтесь к предупреждению о точности результата. Более того, даже если бы это не было приближением, сравнение одного рассчитанного/преобразованного значения с плавающей запятой для равенства с другим вычисленным значением вряд ли удастся, даже если они математически равны. Я считаю, что вам повезет, если вы достигнете нескольких процентов. – Clifford

+0

Что касается математики, то это довольно просто, поскольку карты предположительно ортогональны географическим длинным/лат. Расстояние N-S, которое вам нужно, составляет всего лишь часть полярной окружности, составляющей 360 градусов и около 40 007,863 км (ссылка WGS84). Расстояние Восток-Запад более сложное, но не более чем тригонометрия средней школы - косинус вычисляет окружность на определенном круге широты, тогда расстояние - это выигрыш, составляющий лишь часть этого. – Clifford