GitHunt
WI

Willyham/hashfill

Fill geofences with geohashes

GoDoc Go Report Card

Usage

Hashfill is a library for computing the set of geohashes which are contained by a geofence. It can either produce a set
of hashes which are completely contained or one which also includes where the boundaries intersect. It currently operates on
geom.Polygon objects from the https://github.com/twpayne/go-geom pacakge. Converting from geojson is simple and this
package may offer a utility in the future.

func readFileAsGeometry(t *testing.T, file string) (*geom.Polygon, error) {
	data, err := ioutil.ReadFile(file)
	if err != nil {
		return nil, err
	}

	poly := new(geom.T)
	err = geojson.Unmarshal(data, poly)
	if err != nil {
		return nil, err
	}

	return nil, (*poly).(*geom.Polygon)
}

geofence := readFileAsGeometry("testdata/regents.geojson")
filler := hashfill.NewRecursiveFiller(
  hashfill.WithMaxPrecision(8),
)

hashes, err := filler.Fill(geofence, hashfill.FillIntersects)

Would result in something that could be visualized as:

Installation

This library depends on headers from the geos library. You can install with brew install geos or dnf install geos-devel on RPM based linux distros.

Options

  • WithMaxPrecision - Sets the max hash precision the algorithm will generate hashes for.
  • WithFixedPrecision - Causes the fully contained geohashes to still be divided into the hashes of the max precision.
  • WithPredicates - Can be used to supply your own functions for Intersect and Contains rather than the built in ones.

Improvements

TODO:

  • [] Fix bug in geofences with holes.
  • [] Corner based check optimisations (+ hybrid)
  • [] Cache poly to geom operation in predicates.
  • [] Add benchmarks

Languages

Go100.0%

Contributors

MIT License
Created November 10, 2017
Updated January 28, 2026
Willyham/hashfill | GitHunt