code: function(start,end,properties) {
      if (!start || start.x === undefined || start.y === undefined) {
          throw new Error("GreatCircle constructor expects two args: start and end objects with x and y properties");
      }
      if (!end || end.x === undefined || end.y === undefined) {
          throw new Error("GreatCircle constructor expects two args: start and end objects with x and y properties");
      }
      this.start = new Coord(start.x,start.y);
      this.end = new Coord(end.x,end.y);
      this.properties = properties || {};
  
      var w = this.start.x - this.end.x;
      var h = this.start.y - this.end.y;
      var z = Math.pow(Math.sin(h / 2.0), 2) +
                  Math.cos(this.start.y) *
                     Math.cos(this.end.y) *
                       Math.pow(Math.sin(w / 2.0), 2);
      this.g = 2.0 * Math.asin(Math.sqrt(z));
  
      if (this.g == Math.PI) {
          throw new Error('it appears ' + start.view() + ' and ' + end.view() + " are 'antipodal', e.g diametrically opposite, thus there is no single route but rather infinite");
      } else if (isNaN(this.g)) {
          throw new Error('could not calculate great circle between ' + start + ' and ' + end);
      }
  }
docs: /*
  http://en.wikipedia.org/wiki/Great-circle_distance