2017-02-06 32 views
0

У меня есть точка с заданным радиусом - допустим, 1000 м. Я вычислить радиус внутри мой стайлинг функции, как:Как вычислить координаты границы круга с помощью Openlayers 3

 var givenRadius = 1000; 
     var coords = feature.getGeometry().getCoordinates(); 
     var projection = map.view.getProjection(); 
     var resolutionAtCoords = projection.getPointResolution(resolution, coords); 

     var featureStyleRadius = Math.round(radius/resolutionAtCoords); 

     style.getImage().setRadius(featureStyleRadius); 

Отображаемого круг выглядит нормально - я проверил это, измеряя ее радиус на карте.

Теперь я хочу нанести на него 2 знака - по его центру и на его границе. Я делаю это так:

 var center = ol.proj.transform([lon,lat], 'EPSG:4326', 'EPSG:3857'); 

     // center point 

     map.previewLayer.getSource().addFeature(new ol.Feature({ 
       geometry: new ol.geom.Point(center), 
       type: "dragPoint" 
      }) 
     ); 

     // border point 

     center[0] += givenRadius; 

     map.previewLayer.getSource().addFeature(new ol.Feature({ 
       geometry: new ol.geom.Point(center), 
       type: "dragPoint" 
      }) 
     ); 

Центр знак правильно установлен, но пограничный знак всегда находится внутри круга (~ 2/3 ее радиуса независимо от размера радиуса или карты масштаба) - увидеть картину. Что не так с расчетом?

enter image description here

ответ

0

Судя кода вы вычислительное радиус окружности, используя givenRadius и resolutionAtCoords. Но при вычислении граничной точки вы добавляете строчный код givenRadius в center. Поэтому каждый раз, когда он добавляет 1000 м в центр. Вместо этого вы должны добавить featureStyleRadius в center.

center[0] += featureStyleRadius; 
+0

Я думаю, это правильно - центральная переменная содержит координаты - в зависимости от проекции она находится в метрах. Вот почему я добавляю заданный радиус 1000 м - который я ожидаю дать мне географические координаты границы. Что касается круга, OpenLayers не может указать радиус окружности в метрах - вам нужно использовать пиксели экрана. Вот почему я пересчитываю радиус для круга каждый раз внутри функции стилизации. – user3523426

+0

Если проекция используется в метрах, параметр 'radius' при создании' ol.geom.Circle' также будет использоваться только в метрах. Поэтому вы излишне вычисляете радиус с помощью 'resolutionAtCoords' –

+0

Sumanth - это интересная информация для меня. Я не создаю свои функции «на лету», у меня есть geojson как источник, тип геометрии - «точка» (насколько я понимаю, геойсон не имеет типа геометрии круга), и я указываю радиус по стилю для точки. Поскольку это около 1 года проекта, радиус из стиля считался в пикселях (он не менялся во время операции масштабирования), и именно поэтому я использую расчет. – user3523426

0

Похоже, что проблема связана с искажением карты, связанной с EPSG: проекция 3857. Я решил проблему, преобразовывая координаты центра в EPSG: 4326, вычисляя положение пограничной точки в этой проекции и переходя к EPSG: 3857. Это делается таким образом, что точка точно находится на границе.