/* * Copyright 2015 Open Networking Laboratory * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* ONOS GUI -- SVG -- Map Service */ /* The Map Service provides a simple API for loading geographical maps into an SVG layer. For example, as a background to the Topology View. e.g. var promise = MapService.loadMapInto(svgLayer, '*continental-us'); The Map Service makes use of the GeoDataService to load the required data from the server and to create the appropriate geographical projection. A promise is returned to the caller, which is resolved with the map projection once created. */ (function () { 'use strict'; // injected references var $log, $q, fs, gds; // NOTE: This method assumes the datafile has exactly the map data // that you want to load; for example id="*continental_us" // mapping to ~/data/map/continental_us.topojson contains // exactly the paths for the continental US. function loadMapInto(mapLayer, id, opts) { var promise = gds.fetchTopoData(id), deferredProjection = $q.defer(); if (!promise) { $log.warn('Failed to load map: ' + id); return false; } promise.then(function () { var gen = gds.createPathGenerator(promise.topodata, opts); deferredProjection.resolve(gen.settings.projection); mapLayer.selectAll('path') .data(gen.geodata.features) .enter() .append('path') .attr('d', gen.pathgen); }); return deferredProjection.promise; } // --- // NOTE: This method uses the countries.topojson data file, and then // filters the results based on the supplied options. // Usage: // promise = loadMapRegionInto(svgGroup, { // countryFilter: function (country) { // return country.properties.continent === 'South America'; // } // }); function loadMapRegionInto(mapLayer, filterOpts) { var promise = gds.fetchTopoData("*countries"), deferredProjection = $q.defer(); if (!promise) { $log.warn('Failed to load countries TopoJSON data'); return false; } promise.then(function () { var width = 1000, height = 1000, proj = d3.geo.mercator().translate([width/2, height/2]), pathGen = d3.geo.path().projection(proj), data = promise.topodata, features = topojson.feature(data, data.objects.countries).features, country = features.filter(filterOpts.countryFilter), countryFeature = { type: 'FeatureCollection', features: country }, path = d3.geo.path().projection(proj); gds.rescaleProjection(proj, 0.95, 1000, path, countryFeature); deferredProjection.resolve(proj); mapLayer.selectAll('path.country') .data([countryFeature]) .enter() .append('path').classed('country', true) .attr('d', pathGen); }); return deferredProjection.promise; } angular.module('onosSvg') .factory('MapService', ['$log', '$q', 'FnService', 'GeoDataService', function (_$log_, _$q_, _fs_, _gds_) { $log = _$log_; $q = _$q_; fs = _fs_; gds = _gds_; return { loadMapRegionInto: loadMapRegionInto, loadMapInto: loadMapInto }; }]); }());