def append_point(pt)
      last_pt = @points[-1]
      if pt.time
        @earliest_point = pt if @earliest_point.nil? || (pt.time < @earliest_point.time)
        @latest_point = pt if @latest_point.nil? || (pt.time > @latest_point.time)
      else
        # when no time information in data, we consider the points are ordered
        @earliest_point = @points[0]
        @latest_point = pt
      end

      if pt.elevation
        @lowest_point = pt if @lowest_point.nil? || (pt.elevation < @lowest_point.elevation)
        @highest_point = pt if @highest_point.nil? || (pt.elevation > @highest_point.elevation)
      end
      @bounds.min_lat = pt.lat if pt.lat < @bounds.min_lat
      @bounds.min_lon = pt.lon if pt.lon < @bounds.min_lon
      @bounds.max_lat = pt.lat if pt.lat > @bounds.max_lat
      @bounds.max_lon = pt.lon if pt.lon > @bounds.max_lon
      if last_pt
        @distance += haversine_distance(last_pt, pt)
        @duration += pt.time - last_pt.time if pt.time && last_pt.time
      end
      @points << pt
    end
def append_point(pt)
      last_pt = @points[-1]
      if pt.time
        @earliest_point = pt if @earliest_point.nil? || (pt.time < @earliest_point.time)
        @latest_point = pt if @latest_point.nil? || (pt.time > @latest_point.time)
      else
        # when no time information in data, we consider the points are ordered
        @earliest_point = @points[0]
        @latest_point = pt
      end

      if pt.elevation
        @lowest_point = pt if @lowest_point.nil? || (pt.elevation < @lowest_point.elevation)
        @highest_point = pt if @highest_point.nil? || (pt.elevation > @highest_point.elevation)
      end
      @bounds.min_lat = pt.lat if pt.lat < @bounds.min_lat
      @bounds.min_lon = pt.lon if pt.lon < @bounds.min_lon
      @bounds.max_lat = pt.lat if pt.lat > @bounds.max_lat
      @bounds.max_lon = pt.lon if pt.lon > @bounds.max_lon
      if last_pt
        @distance += haversine_distance(last_pt, pt)
        @duration += pt.time - last_pt.time if pt.time && last_pt.time
      end
      @points << pt
    end
If a XML::Node object is passed-in, this will initialize a new
 Segment based on its contents.  Otherwise, a blank Segment is created.
 Tack on a point to this Segment.  All meta-data will be updated.