| Повече ▼

Как да нарисувате окръжност в OpenLayers 2 и да измерите радиуса й динамично?

Как да нарисувате окръжност в OpenLayers 2 и да измерите радиуса й динамично?


С OpenLayers 2.13 искам да нарисувам кръг и да получа неговия радиус при всяко движение на мишката. Радиусът след това ще бъде върнат като аргументи на функция за обратно извикване, например. Но, разбира се, това не е проблемът тук.

Опитах няколко начина, но никой от тях не работи както искам:

МЕТОД А

Опитах се да променя метода "move" в OpenLayers.Handler.RegularPolygon, добавяйки персонализирано събитие в контролата на манипулатора. Работи, но не отговаря на нуждите ми, защото:

  • Мога да изчисля само "нормалната" дължина, а не "геодезическата" дължина. Така че никога не получавам правилен радиус.
  • Между другото, смяната на ядрото на OpenLayers не ми изглежда много чиста, нито безопасна!

МЕТОД Б

Използването на OpenLayers.Control.Measure заедно с OpenLayers.Control.DrawFeatiure ми се стори най -добрият вариант. Регистрирах събитие за „merepartial“, но не върна нищо. Събитието "merepartial" не се задейства при изчертаване на кръг (RegularPolygon), защото няма добавена точка (предполагам, че това е причината).

ИЗТОЧНИЦИ

  • В този въпрос се задава нещо много подобно на това, което питам, но нямаше добър отговор за случая y, затова се опитах да го проуча и да публикувам собствен въпрос.
  • В този въпрос открих абсолютно същия проблем като моя и въз основа на това приложих МЕТОД А.

ЗАКЛЮЧЕНИЕ

Предпочитам да използвам нещо като МЕТОД Б, но не знам как. Събитието "merepartial" не се задейства при използване на RegularPolygon.

Не публикувах код, защото е свързан с работата. И между другото, мисля, че обясних всичко, което трябваше да се каже.


Можете да опитате да използвате преместването за обратно извикване:

var my_polygonhandler = OpenLayers.Handler.RegularPolygon; var polygonControl = нов OpenLayers.Control.DrawFeature (кръгове, my_polygonhandler, {handlerOptions: {страни: 40}}); polygonControl.handler.callbacks.move = function (e) {var linearRing = new OpenLayers.Geometry.LinearRing (e.components [0] .components); var geometry = нов OpenLayers.Geometry.Polygon ([linearRing]); var polygonFeature = нов OpenLayers.Feature.Vector (геометрия, нула); var polybounds = polygonFeature.geometry.getBounds (); var minX = polybounds.left; var minY = polybounds.bottom; var maxX = polybounds.right; var maxY = polybounds.top; // изчисляване на централните координати var startX = (minX + maxX) /2; var startY = (minY + maxY) / 2; // правим две точки в центъра и на ръба var startPoint = new OpenLayers.Geometry.Point (startX, startY); var endPoint = нов OpenLayers.Geometry.Point (maxX, startY); var radius = нов OpenLayers.Geometry.LineString ([startPoint, endPoint]); var len = Math.round (radius.getLength ()). toString (); document.getElementById ("радиус"). innerHTML = len; }

Току -що настроих jsfiddle, за да демонстрирам как да го използвам:

http://jsfiddle.net/expedio/L529bqb5/

Ако искате да изчислите геодезическата дължина, можете да използвате метода "getGeodesicLength" на вашия низ.


Гледай видеото: An Introduction to Mapbox