diff options
Diffstat (limited to 'mountain_pass/detection.go')
| -rw-r--r-- | mountain_pass/detection.go | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/mountain_pass/detection.go b/mountain_pass/detection.go index 09792e3..139bc60 100644 --- a/mountain_pass/detection.go +++ b/mountain_pass/detection.go @@ -29,8 +29,8 @@ func LoadMountainPasses(db *sql.DB) ([]MountainPass, error) { return loadMountainPasses(db, nil) } -func LoadMountainPassesAroundRide(db *sql.DB, route ride.Ride, marginM float64) ([]MountainPass, error) { - return loadMountainPasses(db, rideBounds(route, marginM)) +func LoadMountainPassesAroundRide(db *sql.DB, routeCoords []geodist.Coord, marginM float64) ([]MountainPass, error) { + return loadMountainPasses(db, rideBounds(routeCoords, marginM)) } type coordinateBounds struct { @@ -40,11 +40,11 @@ type coordinateBounds struct { maxLongitude float64 } -func rideBounds(route ride.Ride, marginM float64) *coordinateBounds { - minLatitude, maxLatitude := route.Coord(0).Lat, route.Coord(0).Lat - minLongitude, maxLongitude := route.Coord(0).Lon, route.Coord(0).Lon - for index := 1; index < route.Len(); index++ { - coordinate := route.Coord(index) +func rideBounds(coords []geodist.Coord, marginM float64) *coordinateBounds { + minLatitude, maxLatitude := coords[0].Lat, coords[0].Lat + minLongitude, maxLongitude := coords[0].Lon, coords[0].Lon + for index := 1; index < len(coords); index++ { + coordinate := coords[index] minLatitude = math.Min(minLatitude, coordinate.Lat) maxLatitude = math.Max(maxLatitude, coordinate.Lat) minLongitude = math.Min(minLongitude, coordinate.Lon) @@ -95,13 +95,13 @@ func loadMountainPasses(db *sql.DB, bounds *coordinateBounds) ([]MountainPass, e return mountainPasses, rows.Err() } -func DetectCrossings(ride ride.Ride, passes []MountainPass, radiusM, elevationToleranceM float64) []Crossing { +func DetectCrossings(coords []geodist.Coord, distances, elevations []float64, passes []MountainPass, radiusM, elevationToleranceM float64) []Crossing { crossings := make([]Crossing, 0) for _, mountainPass := range passes { if mountainPass.Coord == nil { continue } - crossing, found := nearestCrossing(ride, mountainPass) + crossing, found := nearestCrossing(coords, distances, elevations, mountainPass) if found && crossing.DistanceToM <= radiusM && crossing.ElevationDiff <= elevationToleranceM { crossings = append(crossings, crossing) } @@ -138,16 +138,16 @@ func MatchClimb(climb ride.Climb, passes []MountainPass, radiusM, elevationToler return best, found } -func nearestCrossing(ride ride.Ride, mountainPass MountainPass) (Crossing, bool) { +func nearestCrossing(coords []geodist.Coord, distances, elevations []float64, mountainPass MountainPass) (Crossing, bool) { best := Crossing{Pass: mountainPass, DistanceToM: 1e18} - for i := 0; i < ride.Len(); i++ { - distanceKm, _ := geodist.HaversineDistance(ride.Coord(i), *mountainPass.Coord) + for i := 0; i < len(coords); i++ { + distanceKm, _ := geodist.HaversineDistance(coords[i], *mountainPass.Coord) distanceM := distanceKm * 1000 if distanceM < best.DistanceToM { best.DistanceToM = distanceM - best.RideDistanceM = ride.DistanceM(i) - best.RideElevation = ride.ElevationM(i) - best.ElevationDiff = absFloat64(ride.ElevationM(i) - float64(mountainPass.Elevation)) + best.RideDistanceM = distances[i] + best.RideElevation = elevations[i] + best.ElevationDiff = absFloat64(elevations[i] - float64(mountainPass.Elevation)) } } if best.DistanceToM > 1e17 { |
