Add Lat/Lon grid MapStructure layer.
This commit is contained in:
parent
d84c527ca7
commit
4bd57492f4
2 changed files with 122 additions and 0 deletions
103
Nasal/canvas/map/GRID.lcontroller
Normal file
103
Nasal/canvas/map/GRID.lcontroller
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
# See: http://wiki.flightgear.org/MapStructure
|
||||||
|
# Class things:
|
||||||
|
var name = 'GRID';
|
||||||
|
var parents = [SymbolLayer.Controller];
|
||||||
|
var __self__ = caller(0)[0];
|
||||||
|
SymbolLayer.Controller.add(name, __self__);
|
||||||
|
SymbolLayer.add(name, {
|
||||||
|
parents: [MultiSymbolLayer],
|
||||||
|
type: name, # Symbol type
|
||||||
|
df_controller: __self__, # controller to use by default -- this one
|
||||||
|
df_options: { # default configuration options
|
||||||
|
granularity_lon: 0.25,
|
||||||
|
granularity_lat: 0.25,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var new = func(layer) {
|
||||||
|
var m = {
|
||||||
|
parents: [__self__],
|
||||||
|
layer: layer,
|
||||||
|
map: layer.map,
|
||||||
|
listeners: [],
|
||||||
|
last_lat: -999,
|
||||||
|
last_lon: -999,
|
||||||
|
last_range: -999,
|
||||||
|
last_result: [],
|
||||||
|
};
|
||||||
|
layer.searcher._equals = func(l,r) 0; # TODO: create model objects instead?
|
||||||
|
|
||||||
|
m.addVisibilityListener();
|
||||||
|
return m;
|
||||||
|
};
|
||||||
|
var del = func() {
|
||||||
|
foreach (var l; me.listeners)
|
||||||
|
removelistener(l);
|
||||||
|
};
|
||||||
|
|
||||||
|
var searchCmd = func() {
|
||||||
|
|
||||||
|
var lines = [];
|
||||||
|
var delta_lon = me.layer.options.granularity_lon;
|
||||||
|
var delta_lat = me.layer.options.granularity_lat;
|
||||||
|
|
||||||
|
# Find the nearest lat/lon line to the map position. If we were just displaying
|
||||||
|
# integer lat/lon lines, this would just be rounding.
|
||||||
|
var lat = delta_lat * math.round(me.layer.map.getLat() / delta_lat);
|
||||||
|
var lon = delta_lon * math.round(me.layer.map.getLon() / delta_lon);
|
||||||
|
var range = me.layer.map.getRange();
|
||||||
|
|
||||||
|
# Return early if no significant change in lat/lon/range - implies no additional
|
||||||
|
# grid lines required
|
||||||
|
if ((lat == me.last_lat) and (lon == me.last_lon) and (range == me.last_range)) return me.last_result;
|
||||||
|
|
||||||
|
# Determine number of degrees of lat/lon we need to display based on range
|
||||||
|
# 60nm = 1 degree latitude, degree range for longitude is dependent on latitude.
|
||||||
|
var lon_range = math.ceil(geo.Coord.new(me.layer.map.getPosCoord()).apply_course_distance(90.0, range * globals.NM2M).lon() - lon) * 2;
|
||||||
|
var lat_range = math.ceil(range/60.0) * 2;
|
||||||
|
|
||||||
|
for (var x = (lon - lon_range); x <= (lon + lon_range); x += delta_lon) {
|
||||||
|
var coords = [];
|
||||||
|
|
||||||
|
# We could do a simple line from start to finish, but depending on projection,
|
||||||
|
# the line may not be straight.
|
||||||
|
for (var y = (lat - lat_range); y <= (lat + lat_range); y += delta_lat) {
|
||||||
|
append(coords, {lon:x, lat:y});
|
||||||
|
}
|
||||||
|
|
||||||
|
append(lines, {
|
||||||
|
id: x,
|
||||||
|
type: "lon",
|
||||||
|
path: coords,
|
||||||
|
equals: func(o){
|
||||||
|
return (me.id == o.id and me.type == o.type); # We only display one line of each lat/lon
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
# Lines of latitude
|
||||||
|
for (var y = (lat - lat_range); y <= (lat + lat_range); y += delta_lat) {
|
||||||
|
var coords = [];
|
||||||
|
|
||||||
|
# We could do a simple line from start to finish, but depending on projection,
|
||||||
|
# the line may not be straight.
|
||||||
|
for (var x = (lon - lon_range); x <= (lon + lon_range); x += delta_lon) {
|
||||||
|
append(coords, {lon:x, lat:y});
|
||||||
|
}
|
||||||
|
|
||||||
|
append(lines, {
|
||||||
|
id: y,
|
||||||
|
type: "lat",
|
||||||
|
path: coords,
|
||||||
|
equals: func(o){
|
||||||
|
return (me.id == o.id and me.type == o.type); # We only display one line of each lat/lon
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
me.last_lat = lat;
|
||||||
|
me.last_lon = lon;
|
||||||
|
me.last_range = range;
|
||||||
|
me.last_result = lines;
|
||||||
|
|
||||||
|
return lines;
|
||||||
|
};
|
19
Nasal/canvas/map/GRID.symbol
Normal file
19
Nasal/canvas/map/GRID.symbol
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# See: http://wiki.flightgear.org/MapStructure
|
||||||
|
|
||||||
|
# Class things:
|
||||||
|
var name = 'GRID';
|
||||||
|
var parents = [LineSymbol];
|
||||||
|
var __self__ = caller(0)[0];
|
||||||
|
LineSymbol.makeinstance( name, __self__ );
|
||||||
|
|
||||||
|
SymbolLayer.get(name).df_style = { # style to use by default
|
||||||
|
line_width: 1,
|
||||||
|
color: [0.5,0.5,0.5],
|
||||||
|
dash_array: [5,15,5,15],
|
||||||
|
};
|
||||||
|
|
||||||
|
var init = func {
|
||||||
|
me.element.setColor(me.layer.style.color)
|
||||||
|
.setStrokeLineWidth(me.layer.style.line_width)
|
||||||
|
.setStrokeDashArray(me.layer.style.dash_array);
|
||||||
|
};
|
Loading…
Reference in a new issue