ol.geom.Circle може да не представлява кръг
Геометриите на OpenLayers Circle се дефинират върху проектираната равнина. Това означава, че те винаги са кръгли на картата, но покритата област може да не представлява действителен кръг на земята. Действителната форма и размер на площта, покрита от кръга, ще зависи от използваната проекция.
Това може да се визуализира чрез индикатриса на Тисо, която показва как кръглите зони на земното кълбо се трансформират, когато се проектират върху равнина. Използвайки проекцията EPSG:3857, това ще изглежда така:
![„Индикатриса](https://i.stack.imgur.com/w3Hl0.jpg)
Изображението е от пример Tissot на OpenLayer 3 и показва области, които всички имат радиус от 800 000 метра. Ако тези кръгове бяха начертани като ol.geom.Circle
с радиус 800 000 (използвайки EPSG:3857), всички те биха били с еднакъв размер на картата, но тези, които са по-близо до полюсите, ще представляват много по-малка площ от земното кълбо.
Това е вярно за повечето неща с геометриите на OpenLayers. Радиусът, дължината или площта на дадена геометрия се отчитат в проектираната равнина.
Така че, ако имате ol.geom.Circle
, получаването на действителния радиус на повърхността ще зависи от проекцията и местоположението на елементите. За някои прогнози (като EPSG:4326) няма да има точен отговор, тъй като геометрията може дори да не представлява кръгла област.
Въпреки това, ако приемем, че използвате EPSG:3857 и не рисувате изключително големи кръгове или много близо до полюсите, кръгът ще бъде добро представяне на кръгла област.
ol.proj.METERS_PER_UNIT
ol.proj.METERS_PER_UNIT е просто таблица за преобразуване между метри и някои други единици. ol.proj.METERS_PER_UNIT['m']
винаги ще връща 1
, тъй като единицата 'm'
е метри. EPSG:3857 използва метри като единици, но както беше отбелязано, те са изкривени към полюсите.
Решение (използвайте, след като прочетете и разберете горното)
За да получите действителния земен радиус на ol.geom.Circle
, трябва да намерите разстоянието между центъра на кръга и точка на неговия ръб. Това може да стане с помощта на ol.Sphere:
var center = geometry.getCenter()
var radius = geometry.getRadius()
var edgeCoordinate = [center[0] + radius, center[1]];
var wgs84Sphere = new ol.Sphere(6378137);
var groundRadius = wgs84Sphere.haversineDistance(
ol.proj.transform(center, 'EPSG:3857', 'EPSG:4326'),
ol.proj.transform(edgeCoordinate, 'EPSG:3857', 'EPSG:4326')
);
Още опции
Ако искате да добавите геометрия, представляваща кръгла област на земното кълбо, трябва да обмислите използването на метода, използван в примера на Tissot по-горе. Тоест дефиниране на правилен многоъгълник с достатъчно точки, за да изглежда гладък. Това би го направило прехвърляем между проекции и изглежда, че е това, което правите от страна на сървъра. OpenLayers 3 позволява това чрез ol.geom.Polygon.circular:
var circularPolygon = ol.geom.Polygon.circular(wgs84Sphere, center, radius, 64);
Има и ol.geom.Polygon.fromCircle, който взема ol.geom.Circle
и го трансформира в многоъгълник, представляващ същата област.
person
Alvin Lindstam
schedule
27.08.2015