carpool-service/tiles/grid.go

37 lines
1.0 KiB
Go

package tiles
import (
"github.com/paulmach/orb"
)
// GridId defines the position of a tile
// It follows the Valhalla way of handling tiles : https://github.com/Telenav/open-source-spec/blob/master/valhalla/doc/valhalla-tiles-basic.md
type GridId uint64
const tilesize float64 = 1.0
// PointGridId returns the id on the grid for a given point
func PointGridId(point orb.Point) GridId {
width := int64(360 / tilesize)
gridid := GridId(int64((point.Lat()+90)/tilesize)*width + int64((point.Lon()+180)/tilesize))
return gridid
}
// LineStringGridIds returns the list of ids on the grid the linestring goes through.
// In some really specific cases on tile edges, this could be unaccurate if the polyline was too much simplified
func LineStringGridIds(linestring orb.LineString) []GridId {
results := []GridId{}
gidmap := map[int64]bool{}
for _, p := range linestring {
gid := PointGridId(p)
if _, ok := gidmap[int64(gid)]; !ok {
gidmap[int64(gid)] = true
results = append(results, gid)
}
}
return results
}