package org.opentripplanner.profile; import com.google.common.base.Objects; import com.google.common.collect.HashMultimap; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; import com.google.common.collect.Lists; import org.onebusaway.gtfs.model.Stop; import org.opentripplanner.common.geometry.SphericalDistanceLibrary; import org.opentripplanner.routing.graph.GraphIndex; import org.opentripplanner.routing.vertextype.TransitStop; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; import java.util.Map; /** * Groups stops by geographic proximity and name similarity. * This will at least half the number of distinct stop places. In profile routing this means a lot less branching * and a lot less transfers to consider. * * It seems to work quite well for both the Washington DC region and Portland. Locations outside the US would require * additional stop name normalizer modules. */ public class StopCluster { private static final Logger LOG = LoggerFactory.getLogger(StopCluster.class); public final String id; public final String name; public double lon; public double lat; public final List<Stop> children = Lists.newArrayList(); public StopCluster(String id, String name) { this.id = id; this.name = name; } public void computeCenter() { double lonSum = 0, latSum = 0; for (Stop stop : children) { lonSum += stop.getLon(); latSum += stop.getLat(); } lon = lonSum / children.size(); lat = latSum / children.size(); } @Override public String toString() { return name; } }