1
0
Fork 0
fgdata/Nasal/canvas/map/GRID.lcontroller

104 lines
2.9 KiB
Text
Raw Normal View History

2017-10-15 20:54:05 +00:00
# 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;
};