001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.data.gpx; 003 004 import java.util.ArrayList; 005 import java.util.Collection; 006 import java.util.Collections; 007 008 import org.openstreetmap.josm.data.Bounds; 009 010 public class ImmutableGpxTrackSegment implements GpxTrackSegment { 011 012 private final Collection<WayPoint> wayPoints; 013 private final Bounds bounds; 014 private final double length; 015 016 public ImmutableGpxTrackSegment(Collection<WayPoint> wayPoints) { 017 this.wayPoints = Collections.unmodifiableCollection(new ArrayList<WayPoint>(wayPoints)); 018 this.bounds = calculateBounds(); 019 this.length = calculateLength(); 020 } 021 022 private Bounds calculateBounds() { 023 Bounds result = null; 024 for (WayPoint wpt: wayPoints) { 025 if (result == null) { 026 result = new Bounds(wpt.getCoor()); 027 } else { 028 result.extend(wpt.getCoor()); 029 } 030 } 031 return result; 032 } 033 034 private double calculateLength() { 035 double result = 0.0; // in meters 036 WayPoint last = null; 037 for (WayPoint tpt : wayPoints) { 038 if(last != null){ 039 Double d = last.getCoor().greatCircleDistance(tpt.getCoor()); 040 if(!d.isNaN() && !d.isInfinite()) { 041 result += d; 042 } 043 } 044 last = tpt; 045 } 046 return result; 047 } 048 049 public Bounds getBounds() { 050 if (bounds == null) 051 return null; 052 else 053 return new Bounds(bounds); 054 } 055 056 public Collection<WayPoint> getWayPoints() { 057 return wayPoints; 058 } 059 060 public double length() { 061 return length; 062 } 063 064 public int getUpdateCount() { 065 return 0; 066 } 067 068 }