yagoferrer/map-tools

View on GitHub
lib/addFeature.ts

Summary

Maintainability
A
3 hrs
Test Coverage
/// <reference path="typings/tsd.d.ts"/>

interface featureOption {
  filters?: {};
  style: {};
}

interface TopoJsonOption {
  filters:string[];
  object:string;
  style: {
    fillOpacity?: number;
    strokeColor: string;
    strokeWeight: number;
  }
}

interface Feature {
  geometry: {};
  id: string;
  properties: {};
  type: string;
}

interface GeoJsonData {
  features: Feature[];
  metadata: {};
  type: string;
}

var topojson = require('topojson');
import utils = require('./utils');
import addFilter = require('./addFilter');

class AddFeature {

  addFilter;

  constructor(public that) {

    var addFilterInstance = new addFilter(that, 'json');
    this.addFilter = function(filters) {
      return addFilterInstance.addFilter(filters);
    }
  }

  /**
   * Adds GeoJSON Feature Options like: style
   * @param features
   * @param options
   * @private
   */
  addFeatureOptions(features:{}[], options?:featureOption):void {

    var feature, x;
    for (x in features) {
      if (features.hasOwnProperty(x)) {
        feature = features[x];

        var uid = utils.createUid();
        feature.uid = uid;

        feature.data = {uid: uid};

        feature.forEachProperty(function(value, key) {
          feature.data[key] = value;
        });

        if (options) {
          if (options.filters) {

            // Add filters if not defined.
            if (!this.that.json.filter) {
              this.addFilter(options.filters);
            }

            this.that.json.crossfilter.add([feature]);
          }

          if (options.style) {
            this.that.instance.data.overrideStyle(feature, options.style);
          }
        }



        this.that.json.all[feature.data.uid] = feature;
      }
    }
  }


  /**
   * Adds a Topo JSON file into a Map
   * @param data The parsed JSON File
   * @param options
   */

  public addTopoJson(data, options:TopoJsonOption[]):{}[] {
    var item, geoJson, features, x;
    for (x in options) {
      if (options.hasOwnProperty(x)) {
        item = options[x];
        geoJson = topojson.feature(data, data.objects[item.object]);
        features = this.that.instance.data.addGeoJson(geoJson);
        this.addFeatureOptions(features, item);
        mapTools.maps[this.that.id].json.all[item.object] = features;
      }
    }
    return features;
  }

  public addGeoJson(data:GeoJsonData, options) {
    var features = this.that.instance.data.addGeoJson(data, options);
    this.addFeatureOptions(features, options);
    return features;
  }

}

export = AddFeature;