package com.schneeloch.bostonbusmap_library.data; import java.util.Collection; import java.util.SortedSet; import com.google.common.base.Joiner; import com.google.common.base.Optional; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import com.schneeloch.bostonbusmap_library.database.Schema; import com.schneeloch.bostonbusmap_library.math.Geometry; public class IntersectionLocation implements Location { /** * Used for makeGroupKey */ private static final int LOCATIONTYPE = 5; private final String name; private final float latitude; private final float longitude; private final float latitudeAsDegrees; private final float longitudeAsDegrees; private final PredictionView predictionView; private final ImmutableSet<String> nearbyRoutes; private final ImmutableSet<String> nearbyRouteTitles; private IntersectionLocation(Builder builder, TransitSourceTitles routeTitles) { this.name = builder.name; this.latitudeAsDegrees = builder.latitudeAsDegrees; this.longitudeAsDegrees = builder.longitudeAsDegrees; latitude = (float) (latitudeAsDegrees * Geometry.degreesToRadians); longitude = (float) (longitudeAsDegrees * Geometry.degreesToRadians); nearbyRoutes = builder.nearbyRoutes.build(); SortedSet<String> titles = Sets.newTreeSet(new RouteTitleComparator()); for (String tag : nearbyRoutes) { titles.add(routeTitles.getTitle(tag)); } nearbyRouteTitles = ImmutableSet.copyOf(titles); ImmutableCollection<Alert> nullAlerts = ImmutableList.of(); predictionView = new SimplePredictionView("", name, nullAlerts); } public static class Builder { private final String name; private final float latitudeAsDegrees; private final float longitudeAsDegrees; private final ImmutableSet.Builder<String> nearbyRoutes; public Builder(String name, float latitudeAsDegrees, float longitudeAsDegrees) { this.name = name; this.latitudeAsDegrees = latitudeAsDegrees; this.longitudeAsDegrees = longitudeAsDegrees; this.nearbyRoutes = ImmutableSet.builder(); } public void addRoute(String route) { nearbyRoutes.add(route); } public IntersectionLocation build(TransitSourceTitles routeTitles) { return new IntersectionLocation(this, routeTitles); } public double getLatitudeAsDegrees() { return latitudeAsDegrees; } public double getLongitudeAsDegrees() { return longitudeAsDegrees; } } @Override public GroupKey makeGroupKey() { return new StationaryGroupKey(this); } @Override public boolean hasHeading() { return false; } @Override public int getHeading() { return 0; } @Override public float getLatitudeAsDegrees() { return latitudeAsDegrees; } @Override public float getLongitudeAsDegrees() { return longitudeAsDegrees; } @Override public float distanceFrom(double centerLatitude, double centerLongitude) { return Geometry.computeCompareDistance(latitude, longitude, centerLatitude, centerLongitude); } @Override public double distanceFromInMiles(double centerLatAsRadians, double centerLonAsRadians) { return Geometry.computeDistanceInMiles(latitude, longitude, centerLatAsRadians, centerLonAsRadians); } @Override public Favorite isFavorite() { return Favorite.IsNotFavorite; } @Override public void makeSnippetAndTitle(RouteConfig selectedRoute, RouteTitles routeKeysToTitles, Locations locations) { // do nothing } @Override public void addToSnippetAndTitle(RouteConfig routeConfig, Location location, RouteTitles routeKeysToTitles, Locations locations) { // do nothing } @Override public PredictionView getPredictionView() { return predictionView; } @Override public boolean hasMoreInfo() { return false; } @Override public boolean hasFavorite() { return false; } @Override public boolean hasReportProblem() { return false; } public ImmutableSet<String> getNearbyRoutes() { return nearbyRoutes; } public ImmutableSet<String> getNearbyRouteTitles() { return nearbyRouteTitles; } public String getName() { return name; } @Override public boolean isIntersection() { return true; } @Override public Schema.Routes.SourceId getTransitSourceType() { return null; } @Override public boolean isUpdated() { // only relevant for stops return false; } @Override public boolean needsUpdating() { return false; } @Override public LocationType getLocationType() { return LocationType.Intersection; } @Override public Collection<String> getRoutes() { return nearbyRoutes; } @Override public Optional<String> getParent() { return Optional.absent(); } }