blob: f8d40f9cce96907a6742c5632cb7b59bf13b4c4e [file] [log] [blame]
Simon Hunt7ac7be92015-01-06 10:47:56 -08001/*
2 * Copyright 2015 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/*
18 ONOS GUI -- SVG -- Map Service
Simon Hunt7ac7be92015-01-06 10:47:56 -080019 */
Simon Huntf044d8a2015-01-07 17:53:04 -080020
21/*
Simon Huntf8173382015-01-13 14:12:09 -080022 The Map Service provides a simple API for loading geographical maps into
23 an SVG layer. For example, as a background to the Topology View.
Simon Huntf044d8a2015-01-07 17:53:04 -080024
Simon Huntac4c6f72015-02-03 19:50:53 -080025 e.g. var promise = MapService.loadMapInto(svgLayer, '*continental-us');
Simon Huntf044d8a2015-01-07 17:53:04 -080026
Simon Huntf8173382015-01-13 14:12:09 -080027 The Map Service makes use of the GeoDataService to load the required data
Simon Hunta7b6a6b2015-01-13 19:53:09 -080028 from the server and to create the appropriate geographical projection.
29
Simon Huntac4c6f72015-02-03 19:50:53 -080030 A promise is returned to the caller, which is resolved with the
31 map projection once created.
Simon Huntf8173382015-01-13 14:12:09 -080032*/
Simon Huntf044d8a2015-01-07 17:53:04 -080033
Simon Hunt7ac7be92015-01-06 10:47:56 -080034(function () {
35 'use strict';
36
Simon Huntf044d8a2015-01-07 17:53:04 -080037 // injected references
Simon Huntac4c6f72015-02-03 19:50:53 -080038 var $log, $q, fs, gds;
39
Simon Hunt2362b072015-06-11 20:08:22 -070040 // NOTE: This method assumes the datafile has exactly the map data
41 // that you want to load; for example id="*continental_us"
42 // mapping to ~/data/map/continental_us.topojson contains
43 // exactly the paths for the continental US.
44
Simon Huntac4c6f72015-02-03 19:50:53 -080045 function loadMapInto(mapLayer, id, opts) {
46 var promise = gds.fetchTopoData(id),
47 deferredProjection = $q.defer();
48
49 if (!promise) {
50 $log.warn('Failed to load map: ' + id);
51 return false;
52 }
53
54 promise.then(function () {
55 var gen = gds.createPathGenerator(promise.topodata, opts);
56
57 deferredProjection.resolve(gen.settings.projection);
58
59 mapLayer.selectAll('path')
60 .data(gen.geodata.features)
61 .enter()
62 .append('path')
63 .attr('d', gen.pathgen);
64 });
65 return deferredProjection.promise;
66 }
67
Simon Hunt2362b072015-06-11 20:08:22 -070068 // ---
69
70 // NOTE: This method uses the countries.topojson data file, and then
71 // filters the results based on the supplied options.
72 // Usage:
73 // promise = loadMapRegionInto(svgGroup, {
74 // countryFilter: function (country) {
75 // return country.properties.continent === 'South America';
76 // }
77 // });
78
79 function loadMapRegionInto(mapLayer, filterOpts) {
80 var promise = gds.fetchTopoData("*countries"),
81 deferredProjection = $q.defer();
82
83 if (!promise) {
84 $log.warn('Failed to load countries TopoJSON data');
85 return false;
86 }
87
88 promise.then(function () {
89 var width = 1000,
90 height = 1000,
91 proj = d3.geo.mercator().translate([width/2, height/2]),
92 pathGen = d3.geo.path().projection(proj),
93 data = promise.topodata,
94 features = topojson.feature(data, data.objects.countries).features,
95 country = features.filter(filterOpts.countryFilter),
96 countryFeature = {
97 type: 'FeatureCollection',
98 features: country
99 },
100 path = d3.geo.path().projection(proj);
101
102 gds.rescaleProjection(proj, 0.95, 1000, path, countryFeature);
103
104 deferredProjection.resolve(proj);
105
106 mapLayer.selectAll('path.country')
107 .data([countryFeature])
108 .enter()
109 .append('path').classed('country', true)
110 .attr('d', pathGen);
111 });
112 return deferredProjection.promise;
113 }
Simon Hunt7ac7be92015-01-06 10:47:56 -0800114
115 angular.module('onosSvg')
Simon Huntac4c6f72015-02-03 19:50:53 -0800116 .factory('MapService', ['$log', '$q', 'FnService', 'GeoDataService',
117 function (_$log_, _$q_, _fs_, _gds_) {
Simon Hunt7ac7be92015-01-06 10:47:56 -0800118 $log = _$log_;
Simon Huntac4c6f72015-02-03 19:50:53 -0800119 $q = _$q_;
Simon Huntf044d8a2015-01-07 17:53:04 -0800120 fs = _fs_;
Simon Hunta7b6a6b2015-01-13 19:53:09 -0800121 gds = _gds_;
Simon Hunt404e54c2015-01-09 11:58:49 -0800122
Simon Hunt7ac7be92015-01-06 10:47:56 -0800123 return {
Simon Hunt2362b072015-06-11 20:08:22 -0700124 loadMapRegionInto: loadMapRegionInto,
Simon Hunt404e54c2015-01-09 11:58:49 -0800125 loadMapInto: loadMapInto
Simon Hunt7ac7be92015-01-06 10:47:56 -0800126 };
127 }]);
128
129}());