Add support for markers that don't rotate but have a heading arrow.

Use it for balloons.
This commit is contained in:
Oliver Jowett 2016-08-29 12:38:00 +01:00 committed by Carlos Salaverria
parent b04aec0ea1
commit d7f7ffa70a
2 changed files with 71 additions and 10 deletions

View file

@ -111,6 +111,17 @@ var _c130 = {
path: "m 31,1 1,0 1,1 1,2 0,8 3,0 0,-3 1,-1 1,1 0,3 6,0 0,-3 1,-1 1,1 0,3 10,1 0,2 -1,1 -17,3 -5,0 0,10 -1,1 8,2 0,1 -1,1 -8,0 -1,1 -1,-1 -8,0 -1,-1 0,-1 8,-2 -1,-1 0,-10 -5,0 -17,-3 -1,-1 0,-2 10,-1 0,-3 1,-1 1,1 0,3 6,0 0,-3 1,-1 1,1 0,3 3,0 0,-8 1,-2 1,-1 z" path: "m 31,1 1,0 1,1 1,2 0,8 3,0 0,-3 1,-1 1,1 0,3 6,0 0,-3 1,-1 1,1 0,3 10,1 0,2 -1,1 -17,3 -5,0 0,10 -1,1 8,2 0,1 -1,1 -8,0 -1,1 -1,-1 -8,0 -1,-1 0,-1 8,-2 -1,-1 0,-10 -5,0 -17,-3 -1,-1 0,-2 10,-1 0,-3 1,-1 1,1 0,3 6,0 0,-3 1,-1 1,1 0,3 3,0 0,-8 1,-2 1,-1 z"
}; };
var _balloon = {
key: "balloon",
scale: 0.50,
size: [64, 64],
anchor: [32, 32],
path: "m 27,1 10,0 3,1 3,1 1,1 2,1 6,6 1,2 1,1 1,3 1,3 0,10 -1,3 -1,3 -1,1 -1,2 -6,6 -2,1 -1,1 -2,1 -2,1 -2,8 -1,0 2,-8 -3,1 -6,0 -3,-1 2,8 9,0 0,6 -10,0 0,-6 -2,-8 -2,-1 -2,-1 -1,-1 -2,-1 -6,-6 -1,-2 -1,-1 -1,-3 -1,-3 0,-10 1,-3 1,-3 1,-1 1,-2 6,-6 2,-1 1,-1 3,-1 3,-1 z",
noRotate: true,
markerRadius: 32
};
// by Oliver Jowett <oliver@mutability.co.uk> // by Oliver Jowett <oliver@mutability.co.uk>
// licensed under CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/) // licensed under CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/)
var _a380 = { var _a380 = {
@ -210,7 +221,9 @@ var CategoryIcons = {
size : [64, 64], size : [64, 64],
anchor : [22, 32], anchor : [22, 32],
path : _rotorcraft_svg path : _rotorcraft_svg
} },
"B2" : _balloon
}; };
var DefaultIcon = { var DefaultIcon = {

View file

@ -39,6 +39,8 @@ function PlaneObject(icao) {
this.marker = null; this.marker = null;
this.markerStyle = null; this.markerStyle = null;
this.markerIcon = null; this.markerIcon = null;
this.markerStaticStyle = null;
this.markerStaticIcon = null;
this.markerStyleKey = null; this.markerStyleKey = null;
this.markerSvgKey = null; this.markerSvgKey = null;
this.filter = {}; this.filter = {};
@ -311,25 +313,61 @@ PlaneObject.prototype.updateIcon = function() {
if (this.markerStyle === null || this.markerIcon === null || this.markerSvgKey != svgKey) { if (this.markerStyle === null || this.markerIcon === null || this.markerSvgKey != svgKey) {
//console.log(this.icao + " new icon and style " + this.markerSvgKey + " -> " + svgKey); //console.log(this.icao + " new icon and style " + this.markerSvgKey + " -> " + svgKey);
this.markerIcon = new ol.style.Icon({ var icon = new ol.style.Icon({
anchor: baseMarker.anchor, anchor: baseMarker.anchor,
anchorXUnits: 'pixels', anchorXUnits: 'pixels',
anchorYUnits: 'pixels', anchorYUnits: 'pixels',
scale: baseMarker.scale, scale: baseMarker.scale,
imgSize: baseMarker.size, imgSize: baseMarker.size,
src: svgPathToURI(baseMarker.path, baseMarker.size, outline, weight, col), src: svgPathToURI(baseMarker.path, baseMarker.size, outline, weight, col),
rotation: rotation * Math.PI / 180.0, rotation: (baseMarker.noRotate ? 0 : rotation * Math.PI / 180.0),
opacity: opacity opacity: opacity,
rotateWithView: (baseMarker.noRotate ? false : true)
}); });
if (baseMarker.noRotate) {
// the base marker won't be rotated
this.markerStaticIcon = icon;
this.markerStaticStyle = new ol.style.Style({
image: this.markerStaticIcon
});
// create an arrow that we will rotate around the base marker
// to indicate heading
var offset = baseMarker.markerRadius * baseMarker.scale + 6;
var size = offset * 2;
var arrowPath = "M " + offset + ",0 m 4,4 -8,0 4,-4 z";
this.markerIcon = new ol.style.Icon({
anchor: [offset, offset],
anchorXUnits: 'pixels',
anchorYUnits: 'pixels',
scale: 1.0,
imgSize: [size, size],
src: svgPathToURI(arrowPath, [size, size], outline, 1, outline),
rotation: rotation * Math.PI / 180.0,
opacity: opacity,
rotateWithView: true
});
this.markerStyle = new ol.style.Style({
image: this.markerIcon
});
} else {
this.markerIcon = icon;
this.markerStyle = new ol.style.Style({
image: this.markerIcon
});
this.markerStaticIcon = null;
this.markerStaticStyle = new ol.style.Style({});
}
this.markerStyleKey = styleKey; this.markerStyleKey = styleKey;
this.markerSvgKey = svgKey; this.markerSvgKey = svgKey;
this.markerStyle = new ol.style.Style({
image: this.markerIcon
});
if (this.marker !== null) { if (this.marker !== null) {
this.marker.setStyle(this.markerStyle); this.marker.setStyle(this.markerStyle);
this.markerStatic.setStyle(this.markerStaticStyle);
} }
} }
@ -337,6 +375,9 @@ PlaneObject.prototype.updateIcon = function() {
//console.log(this.icao + " new rotation"); //console.log(this.icao + " new rotation");
this.markerIcon.setRotation(rotation * Math.PI / 180.0); this.markerIcon.setRotation(rotation * Math.PI / 180.0);
this.markerIcon.setOpacity(opacity); this.markerIcon.setOpacity(opacity);
if (this.staticIcon) {
this.staticIcon.setOpacity(opacity);
}
this.markerStyleKey = styleKey; this.markerStyleKey = styleKey;
} }
@ -417,8 +458,9 @@ PlaneObject.prototype.updateTick = function(receiver_timestamp, last_timestamp)
PlaneObject.prototype.clearMarker = function() { PlaneObject.prototype.clearMarker = function() {
if (this.marker) { if (this.marker) {
PlaneIconFeatures.remove(this.marker); PlaneIconFeatures.remove(this.marker);
PlaneIconFeatures.remove(this.markerStatic);
/* FIXME google.maps.event.clearListeners(this.marker, 'click'); */ /* FIXME google.maps.event.clearListeners(this.marker, 'click'); */
this.marker = null; this.marker = this.markerStatic = null;
} }
}; };
@ -433,12 +475,18 @@ PlaneObject.prototype.updateMarker = function(moved) {
if (this.marker) { if (this.marker) {
if (moved) { if (moved) {
this.marker.setGeometry(new ol.geom.Point(ol.proj.fromLonLat(this.position))); this.marker.setGeometry(new ol.geom.Point(ol.proj.fromLonLat(this.position)));
this.markerStatic.setGeometry(new ol.geom.Point(ol.proj.fromLonLat(this.position)));
} }
} else { } else {
this.marker = new ol.Feature(new ol.geom.Point(ol.proj.fromLonLat(this.position))); this.marker = new ol.Feature(new ol.geom.Point(ol.proj.fromLonLat(this.position)));
this.marker.hex = this.icao; this.marker.hex = this.icao;
this.marker.setStyle(this.markerStyle); this.marker.setStyle(this.markerStyle);
PlaneIconFeatures.push(this.marker); PlaneIconFeatures.push(this.marker);
this.markerStatic = new ol.Feature(new ol.geom.Point(ol.proj.fromLonLat(this.position)));
this.markerStatic.hex = this.icao;
this.markerStatic.setStyle(this.markerStaticStyle);
PlaneIconFeatures.push(this.markerStatic);
} }
}; };