Измерьте длину отрезка для OpenLayers 2.11 - PullRequest
0 голосов
/ 25 ноября 2011

При переходе на OpenLayers 2.11 возникла небольшая проблема с отображением длины каждого сегмента на измерительной линии.

Ранее после размещения точек A -> B, B -> C. Длинаотрезок от А до В будет отображаться между этими точками, также с B до C, и после окончания строки будет отображаться общая сумма.

Мой скрипт работал нормально с OpenLayers 2.10, но после перехода на OpenLayers 2.11, как толькоЯ заканчиваю строку, только значения сегментов исчезают из векторного слоя.

Я понимаю проблему, но у меня возникают проблемы при разработке логики ...

Ниже приведен скрипт, который я использую:

    line: new OpenLayers.Control.Measure(OpenLayers.Handler.Path, {
    persist: true,
    handlerOptions: {
        layerOptions: {
            renderers: renderer,
            styleMap: styleMap
        }
    },
    textNodes: null,
    callbacks:{
        create:
        function(){
            this.textNodes = [];
            vlayer.destroyFeatures(vlayer.features); /*-- figured this area is the problem */
            mouseMovements = 0;
        },
        modify:
        function(point, line){
            if(mouseMovements++ < 5){
                return;
            }
            var len = line.geometry.components.length;
            var from = line.geometry.components[len -2];
            var to = line.geometry.components[len -1];
            var ls = new OpenLayers.Geometry.LineString([from, to]);
            var dist = this.getBestLength(ls);
            if(!dist[0]){
                return;
            }
            var total = this.getBestLength(line.geometry);
            var label = dist[0].toFixed(3) + " " + dist[1];
            var textNode = this.textNodes[len -2] || null;
            if(textNode && !textNode.layer){
                this.textNodes.pop();
                textNode = null;
            }
            if(!textNode){
                var c = ls.getCentroid();
                textNode = new OpenLayers.Feature.Vector(
                new OpenLayers.Geometry.Point(c.x, c.y), {}, {
                    label: "",
                    fontColor: "#800517",
                    fontSize: "12px",
                    fontFamily: "Tahoma",
                    fontWeight: "bold",
                    labelAlign: "cm"
                });
                this.textNodes.push(textNode);
                vlayer.addFeatures([textNode]);
            }
            textNode.geometry.x = (from.x + to.x) / 2;
            textNode.geometry.y = (from.y + to.y) / 2;
            textNode.style.label = label;
            textNode.layer.drawFeature(textNode);
            this.events.triggerEvent("measuredynamic", {
                measure: dist[0],
                total: total[0],
                units: dist[1],
                order: 1,
                geometry: ls
            });
        }
    }

2011-11-28

После небольшого исследования я пришел к выводу, что в OpenLayers 2.11 частичное управление мерой активируется, как только нажимается кнопка.Ранее в OpenLayers 2.10 частичное управление мерой было активировано, когда карта щелкалась и заканчивалась одновременно с окончанием пути, поэтому раньше он работал потому, что массив textnodes будет пустым только в начале новой строки, нов 2.11 частичное управление мерой не деактивируется один раз в конце пути, поэтому фактически возвращается к пустому массиву и стирает элементы слоя, когда я заканчиваю линию.

Источник: http://trac.osgeo.org/openlayers/ticket/3315

Может ли кто-нибудь подробнее рассказать об этом?

1 Ответ

1 голос
/ 14 февраля 2012

На всякий случай, если кто-то захочет узнать ответ. https://github.com/jorix/OL-DynamicMeasure

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...