tzf

package module
v0.8.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 30, 2022 License: MIT Imports: 7 Imported by: 12

README

TZF: a timezone finder for Go&Python. Go Reference PyPI

Quick Start

Go
import (
	"fmt"

	"github.com/ringsaturn/tzf"
	tzfrel "github.com/ringsaturn/tzf-rel"
	"github.com/ringsaturn/tzf/pb"
	"google.golang.org/protobuf/proto"
)
Use lite/full data

The full data(~80MB) could work anywhere but requires more memory usage.

The lite data(~10MB) doesn't work well in some edge places.

You can see ranges that results diff in this gist.

Use compress data

If a little longer init time is acceptable, the compressed data(~5MB) which come from lite data will be more friendly for binary distribution.

input := &pb.Timezones{}

// Lite data, about 10MB
dataFile := tzfrel.LiteData

// Full data, about 80MB
// dataFile := tzfrel.FullData

err := proto.Unmarshal(dataFile, input)
if err != nil {
	panic(err)
}
finder, err := tzf.NewFinderFromPB(input)
if err != nil {
	panic(err)
}
input := &pb.CompressedTimezones{}

// Compress data, about 5MB
dataFile := tzfrel.LiteCompressData

err := proto.Unmarshal(dataFile, input)
if err != nil {
	panic(err)
}
finder, err := tzf.NewFinderFromCompressed(input)
if err != nil {
	panic(err)
}
fmt.Println(finder.GetTimezoneName(111.8674, 34.4200)) // Output: Asia/Shanghai
fmt.Println(finder.GetTimezoneName(-97.8674, 34.4200)) // Output: America/Chicago
fmt.Println(finder.GetTimezoneName(121.3547, 31.1139)) // Output: Asia/Shanghai
fmt.Println(finder.GetTimezoneName(139.4382, 36.4432)) // Output: Asia/Tokyo
fmt.Println(finder.GetTimezoneName(24.5212, 50.2506))  // Output: Europe/Kyiv
fmt.Println(finder.GetTimezoneName(-0.9671, 52.0152))  // Output: Europe/London
fmt.Println(finder.GetTimezoneName(-4.5706, 46.2747))  // Output: Etc/GMT
fmt.Println(finder.GetTimezoneName(111.9781, 45.0182)) // Output: Asia/Shanghai
fmt.Println(finder.GetTimezoneName(-73.7729, 38.3530)) // Output: Etc/GMT+5
fmt.Println(finder.GetTimezoneName(114.1594, 22.3173)) // Output: Asia/Hong_Kong
Python
pip install tzfpy
>>> from tzfpy import get_tz
>>> print(get_tz(121.4737, 31.2305))
Asia/Shanghai

Python binding source codes: https://github.com/ringsaturn/tzf/tree/main/python

Cli Tool
go install github.com/ringsaturn/tzf/cmd/tzf@latest
tzf -lng 116.3883 -lat 39.9289

Data

Original data download from https://github.com/evansiroky/timezone-boundary-builder.

Preprocessed probuf data can get from https://github.com/ringsaturn/tzf-rel which has Go's embed support.

graph TD
    D[Probuf based Bin file]
    H[Polygon search component]
    D --> |Reduce via cmd/reducePolygon|D
    A[Raw timezone boundary JSON file] --> |Convert via cmd/tzjson2pb|D
    D --> H
    H --> GetTimezone

Thanks

Documentation

Overview

Package tzf is a package convert (lng,lat) to timezone.

Inspired by timezonefinder https://github.com/jannikmi/timezonefinder, fast python package for finding the timezone of any point on earth (coordinates) offline.

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Finder

type Finder struct {
	// contains filtered or unexported fields
}

Finder is based on point-in-polygon search algo.

Memeory will use about 100MB if lite data and 1G if full data. Performance is very stable and very accuate.

func NewFinderFromCompressed added in v0.8.0

func NewFinderFromCompressed(input *pb.CompressedTimezones) (*Finder, error)

func NewFinderFromPB

func NewFinderFromPB(input *pb.Timezones) (*Finder, error)

func NewFinderFromRawJSON added in v0.2.0

func NewFinderFromRawJSON(input *convert.BoundaryFile) (*Finder, error)

func (*Finder) GetTimezone added in v0.3.0

func (f *Finder) GetTimezone(lng float64, lat float64) (*pb.Timezone, error)

func (*Finder) GetTimezoneLoc

func (f *Finder) GetTimezoneLoc(lng float64, lat float64) (*time.Location, error)
Example
package main

import (
	"fmt"

	"github.com/ringsaturn/tzf"
	tzfrel "github.com/ringsaturn/tzf-rel"
	"github.com/ringsaturn/tzf/pb"
	"google.golang.org/protobuf/proto"
)

func main() {
	input := &pb.Timezones{}

	// Lite data, about 16.7MB
	dataFile := tzfrel.LiteData

	// Full data, about 83.5MB
	// dataFile := tzfrel.FullData

	if err := proto.Unmarshal(dataFile, input); err != nil {
		panic(err)
	}
	finder, _ := tzf.NewFinderFromPB(input)
	fmt.Println(finder.GetTimezoneLoc(116.6386, 40.0786))
}
Output:

Asia/Shanghai <nil>

func (*Finder) GetTimezoneName

func (f *Finder) GetTimezoneName(lng float64, lat float64) string
Example
package main

import (
	"fmt"

	"github.com/ringsaturn/tzf"
	tzfrel "github.com/ringsaturn/tzf-rel"
	"github.com/ringsaturn/tzf/pb"
	"google.golang.org/protobuf/proto"
)

func main() {
	input := &pb.Timezones{}

	// Lite data, about 16.7MB
	dataFile := tzfrel.LiteData

	// Full data, about 83.5MB
	// dataFile := tzfrel.FullData

	if err := proto.Unmarshal(dataFile, input); err != nil {
		panic(err)
	}
	finder, _ := tzf.NewFinderFromPB(input)
	fmt.Println(finder.GetTimezoneName(116.6386, 40.0786))
}
Output:

Asia/Shanghai

func (*Finder) GetTimezoneShapeByName added in v0.5.0

func (f *Finder) GetTimezoneShapeByName(name string) (*pb.Timezone, error)
Example
package main

import (
	"fmt"

	"github.com/ringsaturn/tzf"
	tzfrel "github.com/ringsaturn/tzf-rel"
	"github.com/ringsaturn/tzf/pb"
	"google.golang.org/protobuf/proto"
)

func main() {
	input := &pb.Timezones{}

	// Lite data, about 16.7MB
	dataFile := tzfrel.LiteData

	if err := proto.Unmarshal(dataFile, input); err != nil {
		panic(err)
	}
	finder, _ := tzf.NewFinderFromPB(input)
	pbtz, err := finder.GetTimezoneShapeByName("Asia/Shanghai")
	fmt.Printf("%v %v\n", pbtz.Name, err)
}
Output:

Asia/Shanghai <nil>

func (*Finder) GetTimezoneShapeByShift added in v0.5.0

func (f *Finder) GetTimezoneShapeByShift(shift int) ([]*pb.Timezone, error)
Example
package main

import (
	"fmt"
	"strings"

	"sort"

	"github.com/ringsaturn/tzf"
	tzfrel "github.com/ringsaturn/tzf-rel"
	"github.com/ringsaturn/tzf/pb"
	"google.golang.org/protobuf/proto"
)

func main() {
	input := &pb.Timezones{}

	// Lite data, about 16.7MB
	dataFile := tzfrel.LiteData

	if err := proto.Unmarshal(dataFile, input); err != nil {
		panic(err)
	}
	finder, _ := tzf.NewFinderFromPB(input)
	pbtzs, _ := finder.GetTimezoneShapeByShift(28800)

	pbnames := make([]string, 0)
	for _, pbtz := range pbtzs {
		pbnames = append(pbnames, pbtz.Name)
	}
	sort.Strings(pbnames)

	fmt.Println(strings.Join(pbnames, ","))
}
Output:

Asia/Brunei,Asia/Choibalsan,Asia/Hong_Kong,Asia/Irkutsk,Asia/Kuala_Lumpur,Asia/Kuching,Asia/Macau,Asia/Makassar,Asia/Manila,Asia/Shanghai,Asia/Singapore,Asia/Taipei,Asia/Ulaanbaatar,Australia/Perth,Etc/GMT-8

func (*Finder) TimezoneNames added in v0.6.2

func (f *Finder) TimezoneNames() []string

Directories

Path Synopsis
cmd
compresstzpb
CLI tool to reduce polygon filesize
CLI tool to reduce polygon filesize
geojson2tzpb
CLI tool to convert GeoJSON based Timezone boundary to tzf's Probuf format.
CLI tool to convert GeoJSON based Timezone boundary to tzf's Probuf format.
reducetzpb
CLI tool to reduce polygon filesize
CLI tool to reduce polygon filesize
tzf
tzf-cli tool for local query.
tzf-cli tool for local query.
python
tzfpy
TZF's Python binding
TZF's Python binding
Package reduce could reduce Polygon size both polygon lines and float precise.
Package reduce could reduce Polygon size both polygon lines and float precise.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL