Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/hailocab/Go-geoindex
Go native library for fast point tracking and K-Nearest queries
https://github.com/hailocab/Go-geoindex
Last synced: 20 days ago
JSON representation
Go native library for fast point tracking and K-Nearest queries
- Host: GitHub
- URL: https://github.com/hailocab/Go-geoindex
- Owner: hailocab
- License: mit
- Created: 2015-01-22T12:26:17.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2018-02-20T21:58:39.000Z (over 6 years ago)
- Last Synced: 2024-10-07T09:11:49.125Z (about 1 month ago)
- Language: Go
- Homepage:
- Size: 53.7 KB
- Stars: 355
- Watchers: 64
- Forks: 49
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Geo Index
Geo Index library
## Overview
Splits the earth surface in a grid. At each cell we can store data, such as list of points, count of points, etc. It can do KNearest and Range queries. For more detailed description check https://sudo.hailoapp.com/services/2015/02/18/geoindex/ .
### Demo
http://go-geoindex.appspot.com/static/nearest.html - Click to select the nearest points.
http://go-geoindex.appspot.com/static/cluster.html - A map with 100K points around the world. Zoom in and out to cluster.
### API
```go
type Driver struct {
lat float64
lon float64
id string
canAcceptJobs bool
}// Implement Point interface
func (d *Driver) Lat() float64 { return d.lat }
func (d *Driver) Lon() float64 { return d.lon }
func (d *Driver) Id() string { return d.id }// create points index with resolution (cell size) 0.5 km
index := NewPointsIndex(Km(0.5))// Adds a point in the index, if a point with the same id exists it's removed and the new one is added
index.Add(&Driver{"id1", lat, lng, true})
index.Add(&Driver{"id2", lat, lng, false})// Removes a point from the index by id
index.Remove("id1")// get the k-nearest points to a point, within some distance
points := index.KNearest(&GeoPoint{id, lat, lng}, 5, Km(5), func(p Point) bool {
return p.(* Driver).canAcceptJobs
})// get the points within a range on the map
points := index.Range(topLeftPoint, bottomRightPoint)
```### Index types
There are several index types
```go
NewPointsIndex(Km(0.5)) // Creates index that maintains points
NewExpiringPointsIndex(Km(0.5), Minutes(5)) // Creates index that expires the points after some interval
NewCountIndex(Km(0.5)) // Creates index that maintains counts of the points in each cell
NewExpiringCountIndex(Km(0.5), Minutes(15)) // Creates index that maintains expiring count
NewClusteringIndex() // index that clusters the points at different zoom levels, so we can create maps
NewExpiringClusteringIndex(Minutes(15)) // index that clusters and expires the points at different zoom levels
// so we can create real time maps of customer request, etc in the driver app
```### Performance Benchmarks
BenchmarkClusterIndexAdd 500000 5395 ns/op
BenchmarkClusterIndexStreetRange 100000 22207 ns/op
BenchmarkClusterIndexCityRange 100000 16389 ns/op
BenchmarkClusterIndexEuropeRange 50000 36559 ns/opBenchmarkExpiringClusterIndexAdd 300000 7124 ns/op
BenchmarkExpiringClusterIndexStreetRange 50000 27030 ns/op
BenchmarkExpiringClusterIndexCityRange 100000 22185 ns/op
BenchmarkExpiringClusterIndexEuropeRange 30000 52080 ns/opBenchmarkCountIndexAdd 1000000 1670 ns/op
BenchmarkCountIndexCityRange 100000 20325 ns/opBenchmarkExpiringCountIndexAdd 500000 2808 ns/op
BenchmarkExpiringCountIndexRange 50000 35791 ns/opBenchmarkPointIndexRange 100000 15945 ns/op
BenchmarkPointIndexAdd 1000000 2416 ns/op
BenchmarkPointIndexKNearest 100000 13788 ns/opBenchmarkExpiringPointIndexAdd 500000 4324 ns/op
BenchmarkExpiringPointIndexKNearest 100000 15638 ns/op
BenchmarkExpiringPointIndexRange 100000 20386 ns/op