Помогите, пожалуйста, понять, почему текст с пройденным расстоянием не отображается на виджете карты между узлами.
Для линейки ранее был написан код.
Код: Выделить всё
// кнопка по нажатию на которую происходит начало измерений. написано в 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;
}