Страница 1 из 2
OpenLayers. Линейка с масшт-ми подписями под каждым узлом.
Добавлено: 05 июн 2013, 18:56
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();
...
}
Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло
Добавлено: 05 июн 2013, 19:48
Denis Rykov
Посмотрите
пример и
код. Похоже, это как раз то что нужно.
Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло
Добавлено: 06 июн 2013, 08:52
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 = " " + out;
}
Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло
Добавлено: 08 июн 2013, 13:16
novice
рисунок с проблемой: прозрачная линия с пройденным расстоянием есть, а между узлами нет пройденного расстояния .
Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло
Добавлено: 09 июн 2013, 23:42
Denis Rykov
Разбираться в вашем коде не буду. Вот набросал по-быстрому
демо, в котором показано как настроить стиль узлов линейки и вывести к ним подписи. Добавил в
рецепты.
Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло
Добавлено: 10 июн 2013, 09:51
novice
Спасибо! а можете, пожалуйста, добавить в пример: подписи единиц измерения около отмеренного расстояния - км или метры, при измерении вблизи добавить вывод растояния в метрах, а то всегда нули. И удаление пройденного растояния только после того, как начинаем новое измерение, а то после двойного щелчка слой с линейкой очищается и нигде нет информации об отмеренном расстоянии.
а можно добавить рисунок на месте узла?
Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло
Добавлено: 10 июн 2013, 11:04
Denis Rykov
Чтобы линия не исчезала, существует специальное свойство
persist. Слой же узловых точек придется обнулять вручную. Можно и рисунки, для этого поменяйте стиль слоя узловых точек (
доки).
Демо обновил.
Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло
Добавлено: 10 июн 2013, 11:47
novice
Спасибо! заметил небольшой баг - при смене инструмента остаются надписи на карте, добавил в measure_control
Код: Выделить всё
eventListeners: {
'deactivate': function(e) {
config.layer_ruler.removeAllFeatures();
}
},
Но остается проблема с полигоном. Если повесить очистку на deactivate, то полигон исчезает сразу после отрисовки. Можно конечно при нажатии каждой кнопки на панели писать config.overlay.removeAllFeatures(), но это не очень хорошо.
Подскажите, пожалуйста, как правильно очистить слой полигонов при переклике на другой контрол. Тип контрола с полигонами - OpenLayers.Control.TYPE_TOOL
Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло
Добавлено: 10 июн 2013, 16:48
Denis Rykov
Не понял проблему, на моем последнем
демо она воспроизводится? Опишите по шагам.
Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло
Добавлено: 10 июн 2013, 17:15
novice
Проблема с остающимися записями на демо не воспроизводится, т.к. она появилась в процессе изменения кода.
Но одновременно на карте есть и линейка, и полигон, как это исправить? (так чтобы при переклике на другую кнопку полигон исчезал, но код написать в кнопке рисования полигона)
Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло
Добавлено: 10 июн 2013, 18:44
Denis Rykov
Повесить на событие deactivate контрола рисования полигонов функцию очистки слоя?
[ Сообщение с мобильного устройства ]
Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло
Добавлено: 10 июн 2013, 18:52
novice
в таком случае полигон исчезает не успев появиться
Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло
Добавлено: 10 июн 2013, 19:09
Denis Rykov
Это потому что в featureAdded стоит draw_control.deactivate(). Хотел бы отметить, что количество различных комбинаций всевозможных поведений карты можно придумать огромное множество, я показал вам как все это работает в OpenLayers, дальше уже сами комбинируйте, принципиально ничего нового.
Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло
Добавлено: 11 июн 2013, 08:47
novice
спасибо! а можно как-то в IDEA(или Aptana) отключить подсказки по части фреймворков. Т.е. отключить, например, все кроме OpenLayers?
Re: OpenLayers. Линейка с масшт-ми подписями под каждым узло
Добавлено: 11 июн 2013, 09:08
Denis Rykov
Не в курсе, так как ни тем ни другим не пользуюсь.