aboutsummaryrefslogtreecommitdiff
path: root/mountain_pass/detection.go
diff options
context:
space:
mode:
Diffstat (limited to 'mountain_pass/detection.go')
-rw-r--r--mountain_pass/detection.go30
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 {