Allow minimum distance between POI and minimum settlement to be overridden

This commit is contained in:
Ray Miller 2020-07-14 09:15:08 +01:00
parent 4ae3bcbd37
commit f0b45fd4c6
2 changed files with 30 additions and 5 deletions

View file

@ -19,9 +19,11 @@ import (
func main() { func main() {
log.SetFlags(0) log.SetFlags(0)
stopNames := flag.String("stops", "", "Source for refreshment stops") stopNames := flag.String("stops", "", "Source for refreshment stops")
minDist := flag.Float64("min-dist", 0.2, "Minimum distance (km) between points of interest")
minSettlement := flag.String("min-settlement", "Other Settlement", "Exclude populated places smaller than this (City, Town, Village, Hamlet, Other Settlement)")
flag.Parse() flag.Parse()
if flag.NArg() != 1 { if flag.NArg() != 1 {
log.Fatal("Usage: %s [--stops=ctccambridge|cyclingmaps] GPX_FILE_OR_DIRECTORY") log.Fatal("Usage: %s [--stops=ctccambridge|cyclingmaps] [--min-dist X] [--min-settlement S] GPX_FILE_OR_DIRECTORY")
} }
inFile := flag.Arg(0) inFile := flag.Arg(0)
info, err := os.Stat(inFile) info, err := os.Stat(inFile)
@ -40,6 +42,8 @@ func main() {
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
gs.SetMinDistance(*minDist)
gs.SetMinSettlement(*minSettlement)
if info.IsDir() { if info.IsDir() {
err = summarizeDirectory(gs, stops, inFile) err = summarizeDirectory(gs, stops, inFile)
} else { } else {

View file

@ -13,9 +13,19 @@ import (
"github.com/ray1729/gpx-utils/pkg/cafes" "github.com/ray1729/gpx-utils/pkg/cafes"
) )
var populatedPlaceRank = map[string]int{
"City": 5,
"Town": 4,
"Village": 3,
"Hamlet": 3,
"Other Settlement": 1,
}
type GPXSummarizer struct { type GPXSummarizer struct {
poi *rtreego.Rtree poi *rtreego.Rtree
trans osgb.CoordinateTransformer trans osgb.CoordinateTransformer
minDist float64
minSettlementRank int
} }
func NewGPXSummarizer() (*GPXSummarizer, error) { func NewGPXSummarizer() (*GPXSummarizer, error) {
@ -27,7 +37,15 @@ func NewGPXSummarizer() (*GPXSummarizer, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &GPXSummarizer{poi: rt, trans: trans}, nil return &GPXSummarizer{poi: rt, trans: trans, minDist: 0.2, minSettlementRank: 1}, nil
}
func (gs *GPXSummarizer) SetMinSettlement(t string) {
gs.minSettlementRank = populatedPlaceRank[t]
}
func (gs *GPXSummarizer) SetMinDistance(d float64) {
gs.minDist = d
} }
func distance(p1, p2 rtreego.Point) float64 { func distance(p1, p2 rtreego.Point) float64 {
@ -116,7 +134,10 @@ func (gs *GPXSummarizer) SummarizeTrack(r io.Reader, stops *rtreego.Rtree) (*Tra
s.Distance += distance(thisPoint, prevPoint) s.Distance += distance(thisPoint, prevPoint)
dE += thisPoint[0] - start[0] dE += thisPoint[0] - start[0]
dN += thisPoint[1] - start[1] dN += thisPoint[1] - start[1]
if nn.Contains(thisPoint) && nn.Name != prevPlace && distance(thisPoint, prevPlacePoint) > 0.2 { if nn.Contains(thisPoint) &&
nn.Name != prevPlace &&
distance(thisPoint, prevPlacePoint) > gs.minDist &&
populatedPlaceRank[nn.Type] >= gs.minSettlementRank {
s.PointsOfInterest = append(s.PointsOfInterest, POI{Name: nn.Name, Type: nn.Type, Distance: s.Distance}) s.PointsOfInterest = append(s.PointsOfInterest, POI{Name: nn.Name, Type: nn.Type, Distance: s.Distance})
prevPlace = nn.Name prevPlace = nn.Name
prevPlacePoint = thisPoint prevPlacePoint = thisPoint