OpenLayers. Линейка с масшт-ми подписями под каждым узлом.

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
novice
Гуру
Сообщения: 527
Зарегистрирован: 21 окт 2012, 00:17
Репутация: 15
Ваше звание: developer

OpenLayers. Линейка с масшт-ми подписями под каждым узлом.

Сообщение novice »

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

Желательно, чтобы код можно было использовать с уже имеющимся.
Настройки линейки объявлены глобально, определены в функции init

Код: Выделить всё

    var measureControls;
    measureControls = {
        line: new OpenLayers.Control.Measure(
            OpenLayers.Handler.Path, {
                persist: true,
                handlerOptions: {
                    layerOptions: {
                        renderers: renderer,
                        styleMap: styleMap
                    }
                }
            }
        )
    };
кнопка, на которую посажена линейка, объявлена в init

Код: Выделить всё

    var buttonRuler = new OpenLayers.Control.Button({
        title:'Измерение расстояний',
        displayClass: 'MeasureDistance', activate: OnMeasure, deactivate: OffMeasure, type: OpenLayers.Control.TYPE_TOOL
    });
функция, которая позволяет измерить расстояние

Код: Выделить всё

function OnMeasure() {
    if(this.panel_div)
       this.panel_div.className = "MeasureDistanceItemActive"
    OnOffMeasure(true);
}
function OnOffMeasure(checked) {
    if(!measureControls) return;
    var control = measureControls['line'];
    if(control != null)
        if(checked)
            control.activate();
      ...
}
Последний раз редактировалось novice 17 июн 2013, 16:21, всего редактировалось 4 раза.
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло

Сообщение Denis Rykov »

Посмотрите пример и код. Похоже, это как раз то что нужно.
Spatial is now, more than ever, just another column- The Geometry Column.
novice
Гуру
Сообщения: 527
Зарегистрирован: 21 окт 2012, 00:17
Репутация: 15
Ваше звание: developer

Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло

Сообщение novice »

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

Для линейки ранее был написан код.

Код: Выделить всё

// кнопка по нажатию на которую происходит начало измерений. написано в init
    var buttonRuler = new OpenLayers.Control.Button({
        title:'Измерение расстояний',
        displayClass: 'MeasureDistance', activate: OnMeasure, deactivate: OffMeasure, type: OpenLayers.Control.TYPE_TOOL
    });
Набор функций для измерений.

Код: Выделить всё

function OnMeasure() {
    if(this.panel_div)
       this.panel_div.className = "MeasureDistanceItemActive"
    OnOffMeasure(true);
}
function OffMeasure() {
    if(this.panel_div)
        this.panel_div.className = "MeasureDistanceItemInactive"
    OnOffMeasure(false);
}
function OnOffMeasure(checked) {
    if(!length) return;
    var control = length;
    if(control != null)
        if(checked)
            control.activate();
        else
            control.deactivate();
}

Сейчас дописал такой код:

Код: Выделить всё

//глобальные переменные
var mouseMovements;
var length;
var layerRuler;

Код: Выделить всё

// это код в функции init
    var layerRuler = new OpenLayers.Layer.Vector("Measurements");

    var linemeasureStyles = {
        "Point": {
            pointRadius: 4,
            graphicName: "square",
            fillColor: "white",
            fillOpacity: 1,
            strokeWidth: 1,
            strokeOpacity: 1,
            strokeColor: "#333333"
        },
        "Line": {
            strokeColor: "#FF0000",
            strokeOpacity: 0.3,
            strokeWidth: 3,
            strokeLinecap: "square"
        }
    };
    var lineStyle = new OpenLayers.Style();
    lineStyle.addRules([
        new OpenLayers.Rule({
            symbolizer: linemeasureStyles
        })]);
    var linemeasureStyleMap = new OpenLayers.StyleMap({
        "default": lineStyle
    });
    length = new OpenLayers.Control.Measure(OpenLayers.Handler.Path, {
        displaySystem: "english",
        geodesic: true,
        persist: true,
        handlerOptions: {
            layerOptions: {
                styleMap: linemeasureStyleMap
            }
        },
        textNodes: null,
        callbacks: {
            create: function () {
                this.textNodes = [];
                layerRuler.removeFeatures(layerRuler.features);
                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(2) + " " + 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: "#FF0000",
                            fontSize: "14px",
                            fontFamily: "Arial",
                            fontWeight: "bold",
                            labelAlign: "cm"
                        });
                    this.textNodes.push(textNode);
                    layerRuler.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
                });
            }
        }
    });

    length.events.on({
        "measure": handleMeasurements,
        "measurepartial": handleMeasurements
    });

    map.addControl(length);
Функция непосредственно для измерения

Код: Выделить всё

function handleMeasurements(event) {
    var geometry = event.geometry;
    var units = event.units;
    var order = event.order;
    var measure = event.measure;
    //var element = document.getElementById("output");
    var acres;
    var out = "";
    if (order === 1) {
        out += measure.toFixed(2) + " " + units;
    } else if (order === 2 && units === "ft" && measure >= 43560) {
        acres = measure / 43560;
        out += acres.toFixed(2) + " acres";
    } else {
        out += measure.toFixed(2) + " " + units + "<sup>2</" + "sup>";
    }
    //element.innerHTML = "&nbsp;&nbsp;" + out;
}
novice
Гуру
Сообщения: 527
Зарегистрирован: 21 окт 2012, 00:17
Репутация: 15
Ваше звание: developer

Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло

Сообщение novice »

рисунок с проблемой: прозрачная линия с пройденным расстоянием есть, а между узлами нет пройденного расстояния .
Вложения
ПроблемаНетТекстаМеждуУзлами.JPG
ПроблемаНетТекстаМеждуУзлами.JPG (15.45 КБ) 12082 просмотра
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло

Сообщение Denis Rykov »

Разбираться в вашем коде не буду. Вот набросал по-быстрому демо, в котором показано как настроить стиль узлов линейки и вывести к ним подписи. Добавил в рецепты.
Spatial is now, more than ever, just another column- The Geometry Column.
novice
Гуру
Сообщения: 527
Зарегистрирован: 21 окт 2012, 00:17
Репутация: 15
Ваше звание: developer

Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло

Сообщение novice »

Спасибо! а можете, пожалуйста, добавить в пример: подписи единиц измерения около отмеренного расстояния - км или метры, при измерении вблизи добавить вывод растояния в метрах, а то всегда нули. И удаление пройденного растояния только после того, как начинаем новое измерение, а то после двойного щелчка слой с линейкой очищается и нигде нет информации об отмеренном расстоянии.

а можно добавить рисунок на месте узла?
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло

Сообщение Denis Rykov »

Чтобы линия не исчезала, существует специальное свойство persist. Слой же узловых точек придется обнулять вручную. Можно и рисунки, для этого поменяйте стиль слоя узловых точек (доки). Демо обновил.
Spatial is now, more than ever, just another column- The Geometry Column.
novice
Гуру
Сообщения: 527
Зарегистрирован: 21 окт 2012, 00:17
Репутация: 15
Ваше звание: developer

Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло

Сообщение novice »

Спасибо! заметил небольшой баг - при смене инструмента остаются надписи на карте, добавил в measure_control

Код: Выделить всё

            eventListeners: {
                'deactivate': function(e) {
                    config.layer_ruler.removeAllFeatures();
                }
            },
Но остается проблема с полигоном. Если повесить очистку на deactivate, то полигон исчезает сразу после отрисовки. Можно конечно при нажатии каждой кнопки на панели писать config.overlay.removeAllFeatures(), но это не очень хорошо.
Подскажите, пожалуйста, как правильно очистить слой полигонов при переклике на другой контрол. Тип контрола с полигонами - OpenLayers.Control.TYPE_TOOL
Вложения
ПроблемаСПолигоном.JPG
ПроблемаСПолигоном.JPG (17.18 КБ) 11897 просмотров
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло

Сообщение Denis Rykov »

Не понял проблему, на моем последнем демо она воспроизводится? Опишите по шагам.
Spatial is now, more than ever, just another column- The Geometry Column.
novice
Гуру
Сообщения: 527
Зарегистрирован: 21 окт 2012, 00:17
Репутация: 15
Ваше звание: developer

Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло

Сообщение novice »

Проблема с остающимися записями на демо не воспроизводится, т.к. она появилась в процессе изменения кода.

Но одновременно на карте есть и линейка, и полигон, как это исправить? (так чтобы при переклике на другую кнопку полигон исчезал, но код написать в кнопке рисования полигона)
Вложения
ПроблемаСПолигономВеб.JPG
ПроблемаСПолигономВеб.JPG (55.47 КБ) 11883 просмотра
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло

Сообщение Denis Rykov »

Повесить на событие deactivate контрола рисования полигонов функцию очистки слоя?

[ Сообщение с мобильного устройства ]
Spatial is now, more than ever, just another column- The Geometry Column.
novice
Гуру
Сообщения: 527
Зарегистрирован: 21 окт 2012, 00:17
Репутация: 15
Ваше звание: developer

Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло

Сообщение novice »

в таком случае полигон исчезает не успев появиться
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло

Сообщение Denis Rykov »

Это потому что в featureAdded стоит draw_control.deactivate(). Хотел бы отметить, что количество различных комбинаций всевозможных поведений карты можно придумать огромное множество, я показал вам как все это работает в OpenLayers, дальше уже сами комбинируйте, принципиально ничего нового.
Spatial is now, more than ever, just another column- The Geometry Column.
novice
Гуру
Сообщения: 527
Зарегистрирован: 21 окт 2012, 00:17
Репутация: 15
Ваше звание: developer

Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло

Сообщение novice »

спасибо! а можно как-то в IDEA(или Aptana) отключить подсказки по части фреймворков. Т.е. отключить, например, все кроме OpenLayers?
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло

Сообщение Denis Rykov »

Не в курсе, так как ни тем ни другим не пользуюсь.
Spatial is now, more than ever, just another column- The Geometry Column.
Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость