CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/builder/components/modals/add-basemap/nasa/nasa-model.js

Summary

Maintainability
B
4 hrs
Test Coverage
var _ = require('underscore');
var Backbone = require('backbone');
var moment = require('moment');
var NASAView = require('./nasa-view');
var CustomBaselayerModel = require('builder/data/custom-baselayer-model');

var TYPES = {
  day: {
    url: 'http://map1.vis.earthdata.nasa.gov/wmts-webmerc/MODIS_Terra_CorrectedReflectance_TrueColor/default/<%- date %>/GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpeg',
    limit: '2012-05-01',
    default: '2012-05-01',
    attribution: '<a href="http://earthdata.nasa.gov/gibs" target="_blank">NASA EOSDIS GIBS</a>',
    name: 'NASA Terra',
    maxZoom: 9,
    minZoom: 1
  },
  night: {
    url: 'http://map1.vis.earthdata.nasa.gov/wmts-webmerc/VIIRS_CityLights_2012/default/<%- date %>/GoogleMapsCompatible_Level8/{z}/{y}/{x}.jpeg',
    limit: '2012-05-01',
    default: '2012-05-02',
    attribution: '<a href="http://earthdata.nasa.gov/gibs" target="_blank">NASA EOSDIS GIBS</a>',
    name: 'NASA Earth at night',
    maxZoom: 8,
    minZoom: 1
  }
};

/**
 * View model for NASA tab content.
 */

module.exports = Backbone.Model.extend({

  defaults: {
    name: 'nasa',
    label: 'NASA',
    layer: undefined, // gets set on dayOrNight/date changes
    layerType: 'day',
    date: undefined, // for date picker
    current: undefined,
    format: 'Y-m-d' // YYYY-MM-DD
  },

  initialize: function () {
    this._initBinds();
  },

  createView: function (opts) {
    if (!opts.submitButton) throw new Error('submitButton is required');

    this._submitButton = opts.submitButton;

    var utc = new Date().getTimezoneOffset();
    var today = moment(new Date()).utcOffset(utc).format('YYYY-MM-DD');
    var yesterday = moment(new Date()).utcOffset(utc).subtract(1, 'days').format('YYYY-MM-DD');

    this.set({
      current: today,
      date: yesterday
    });

    return new NASAView({
      model: this,
      submitButton: this._submitButton
    });
  },

  hasAlreadyAddedLayer: function (userLayers) {
    var urlTemplate = this.get('layer').get('urlTemplate');
    return _.any(userLayers.isCustomCategory(), function (customLayer) {
      return customLayer.get('urlTemplate') === urlTemplate;
    });
  },

  _initBinds: function () {
    this.bind('change:date change:layerType', this._onChange, this);
  },

  _onChange: function () {
    var dateStr = this.get('date');
    var layerType = this.get('layerType');

    var url = _.template(TYPES[layerType].url)({
      date: dateStr
    });

    var name = TYPES[layerType].name;

    if (layerType === 'day') {
      name = name + ' ' + dateStr;
    }

    var layer = new CustomBaselayerModel({
      urlTemplate: url,
      attribution: TYPES[layerType].attribution,
      maxZoom: TYPES[layerType].maxZoom,
      minZoom: TYPES[layerType].minZoom,
      name: name,
      category: 'NASA',
      type: 'Tiled'
    });
    layer.set('className', layer._generateClassName(url));

    this.set('layer', layer);
  }

});