add flight paths example
This commit is contained in:
parent
27113d2462
commit
42f0700a00
4 changed files with 198 additions and 0 deletions
16
examples/flight_paths/css/example.css
Normal file
16
examples/flight_paths/css/example.css
Normal file
|
@ -0,0 +1,16 @@
|
|||
body {
|
||||
margin: 0;
|
||||
}
|
||||
.label {
|
||||
position: absolute;
|
||||
width: 126px;
|
||||
height: 14px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.75);
|
||||
border-radius: 4px;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
font-family: Lucida Grande; sans-serif;
|
||||
font-size: 11px;
|
||||
text-align: center;
|
||||
color: rgb(255, 255, 255);
|
||||
box-shadow: 0 0 1px rgb(0, 0, 0);
|
||||
}
|
13
examples/flight_paths/index.html
Normal file
13
examples/flight_paths/index.html
Normal file
|
@ -0,0 +1,13 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Flight Paths</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||
<link rel="shortcut icon" type="image/png" href="../../source/Ox.UI/png/icon16.png"/>
|
||||
<link rel="stylesheet" type="text/css" href="css/example.css"/>
|
||||
<script type="text/javascript" src="../../dev/Ox.js"></script>
|
||||
<script type="text/javascript" src="js/example.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
BIN
examples/flight_paths/jpg/earth720.jpg
Normal file
BIN
examples/flight_paths/jpg/earth720.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 169 KiB |
169
examples/flight_paths/js/example.js
Normal file
169
examples/flight_paths/js/example.js
Normal file
|
@ -0,0 +1,169 @@
|
|||
/*
|
||||
In this example, we will draw flight paths on a world map. We'll use the Image
|
||||
module and some of the built-in Ox.js functions for dealing with geographic
|
||||
coordinates.
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
/*
|
||||
Include the image module.
|
||||
*/
|
||||
Ox.load('Image', function() {
|
||||
|
||||
/*
|
||||
This creates an image object from the specified source.
|
||||
*/
|
||||
Ox.Image('jpg/earth720.jpg', function(image) {
|
||||
|
||||
/*
|
||||
We want to map the route New York - London - Tokyo - Johannesburg -
|
||||
Sydney - Sao Paulo - New York.
|
||||
*/
|
||||
var airports = [
|
||||
{name: 'JFK', lat: 40.643841, lng: -73.782304},
|
||||
{name: 'LHR', lat: 51.480902, lng: -0.464773},
|
||||
{name: 'NRT', lat: 35.553457, lng: 139.76532},
|
||||
{name: 'JNB', lat: -26.140009, lng: 28.242781},
|
||||
{name: 'SYD', lat: -33.93567, lng: 151.164322},
|
||||
{name: 'GRU', lat: -23.62754, lng: -46.700821},
|
||||
],
|
||||
/*
|
||||
To get the width (and height) of the image, we call its
|
||||
<code>getSize</code> method.
|
||||
*/
|
||||
mapSize = image.getSize().width,
|
||||
/*
|
||||
Ox.getLine returns a line from one lat/lng pair to another, as an
|
||||
array of <code>Math.pow(2, precision) + 1</code> points.
|
||||
*/
|
||||
precision = 8,
|
||||
paths = airports.map(function(airport, i) {
|
||||
return Ox.getLine(
|
||||
airport,
|
||||
/*
|
||||
We make sure the last airport gets connected with the first
|
||||
one.
|
||||
*/
|
||||
airports[(i + 1) % airports.length],
|
||||
precision
|
||||
);
|
||||
});
|
||||
|
||||
/*
|
||||
Ox.getXYByLatLng takes a lat/lng pair and returns its x/y position on a
|
||||
1x1 Mercator position, <code>{x: 0, y: 0}</code> being the bottom left,
|
||||
<code>{x: 1, y: 1}</code> being the top right.
|
||||
*/
|
||||
function getXY(point) {
|
||||
var xy = Ox.getXYByLatLng(point);
|
||||
return [xy.x * mapSize, xy.y * mapSize];
|
||||
}
|
||||
|
||||
/*
|
||||
For each path, we have to check if it crosses the edge of the map that
|
||||
runs through the Pacific. Note that our test (a line crosses the edge
|
||||
if it spans more than 180 degrees longitude) is obviously incorrect,
|
||||
but works in our case, since all lines are sufficiently short.
|
||||
*/
|
||||
paths.forEach(function(path) {
|
||||
var parts = [path];
|
||||
Ox.loop(path.length - 1, function(i) {
|
||||
var lat, lng;
|
||||
if (Math.abs(path[i].lng - path[i + 1].lng) > 180) {
|
||||
/*
|
||||
We split the path in two parts.
|
||||
*/
|
||||
parts = [Ox.sub(path, 0, i + 1), Ox.sub(path, i + 1)];
|
||||
/*
|
||||
We get the lat/lng of the points where the line leaves
|
||||
and enters the map...
|
||||
*/
|
||||
lat = Ox.getCenter(path[i], path[i + 1]).lat;
|
||||
lng = path[i].lng < 0 ? [-180, 180] : [180, -180];
|
||||
/*
|
||||
... and append them to the end of the first part and the
|
||||
beginning of the second part.
|
||||
*/
|
||||
parts[0].push({lat: lat, lng: lng[0]});
|
||||
parts[1].unshift({lat: lat, lng: lng[1]});
|
||||
/*
|
||||
Returning false from Ox.loop is the equivalent of
|
||||
<code>break</code> in a <code>for</code> loop. Again, note
|
||||
that this assumes no path will cross the edge more than
|
||||
once.
|
||||
*/
|
||||
return false;
|
||||
}
|
||||
});
|
||||
/*
|
||||
We draw each part.
|
||||
*/
|
||||
parts.forEach(function(part) {
|
||||
image.drawPath(part.map(getXY), {color: 'white'});
|
||||
});
|
||||
});
|
||||
|
||||
/*
|
||||
Now lets add some markers.
|
||||
*/
|
||||
airports.forEach(function(airport, i) {
|
||||
/*
|
||||
<code>j</code> is the index of the next airport.
|
||||
*/
|
||||
var j = (i + 1) % airports.length,
|
||||
/*
|
||||
These are the options for the draw functions of the image. Some
|
||||
of the properties only apply to <code>drawPath</code>, some
|
||||
only to <code>drawText</code>, but we can pass all of them to
|
||||
both.
|
||||
*/
|
||||
options = {
|
||||
close: true,
|
||||
color: 'rgba(255, 255, 255, 0.75)',
|
||||
fill: 'rgba(0, 0, 0, 0.5)',
|
||||
font: 'bold 11px Lucida Grande, sans-serif',
|
||||
textAlign: 'center'
|
||||
},
|
||||
/*
|
||||
Ox.getDistance returns the distance, in meters, between two
|
||||
lat/lng pairs, and Ox.formatNumber adds thousands separators.
|
||||
*/
|
||||
text = airports[i].name + '-' + airports[j].name + ' '
|
||||
+ Ox.formatNumber(Math.round(
|
||||
Ox.getDistance(airports[i], airports[j]) / 1000
|
||||
)) + ' km',
|
||||
/*
|
||||
Ox.getCenter returns the midpoint between two lat/lng pairs.
|
||||
In our case, this is where we want to attach markers.
|
||||
*/
|
||||
xy = getXY(Ox.getCenter(airports[i], airports[j])),
|
||||
x = Math.round(xy[0]),
|
||||
y = Math.round(xy[1]);
|
||||
/*
|
||||
This is the marker...
|
||||
*/
|
||||
image.drawPath([
|
||||
[x, y],
|
||||
[x + 4, y - 16],
|
||||
[x + 64, y - 16],
|
||||
[x + 64, y - 32],
|
||||
[x - 64, y - 32],
|
||||
[x - 64, y - 16],
|
||||
[x - 4, y - 16]
|
||||
], options);
|
||||
/*
|
||||
... and this is the text.
|
||||
*/
|
||||
image.drawText(text, [x, y - 20], options);
|
||||
});
|
||||
|
||||
/*
|
||||
To get the dataURL for our image, we call its <code>src()</code>
|
||||
method, and to put it in the DOM, we use Ox.$, which is similar to
|
||||
jQuery's <code>$</code>.
|
||||
*/
|
||||
Ox.$('<img>').attr({src: image.src()}).appendTo(Ox.$('body'));
|
||||
|
||||
});
|
||||
|
||||
});
|
Loading…
Reference in a new issue