37 lines
1.0 KiB
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
|
|
}
|