package ewkb

import "github.com/paulmach/orb/encoding/ewkb"

Index

Variables

var (
	// ErrUnsupportedDataType is returned by Scan methods when asked to scan
	// non []byte data from the database. This should never happen
	// if the driver is acting appropriately.
	ErrUnsupportedDataType = errors.New("wkb: scan value must be []byte")

	// ErrNotEWKB is returned when unmarshalling EWKB and the data is not valid.
	ErrNotEWKB = errors.New("wkb: invalid data")

	// ErrIncorrectGeometry is returned when unmarshalling EWKB data into the wrong type.
	// For example, unmarshaling linestring data into a point.
	ErrIncorrectGeometry = errors.New("wkb: incorrect geometry")

	// ErrUnsupportedGeometry is returned when geometry type is not supported by this lib.
	ErrUnsupportedGeometry = errors.New("wkb: unsupported geometry")
)
var DefaultByteOrder binary.ByteOrder = binary.LittleEndian

DefaultByteOrder is the order used for marshalling or encoding is none is specified.

var DefaultSRID int = 4326

DefaultSRID is set to 4326, a common SRID, which represents spatial data using longitude and latitude coordinates on the Earth's surface as defined in the WGS84 standard, which is also used for the Global Positioning System (GPS). This will be used by the encoder if non is specified.

Functions

func Marshal

func Marshal(geom orb.Geometry, srid int, byteOrder ...binary.ByteOrder) ([]byte, error)

Marshal encodes the geometry with the given byte order. An SRID of 0 will not be included in the encoding and the result will be a wkb encoding of the geometry.

func MarshalToHex

func MarshalToHex(geom orb.Geometry, srid int, byteOrder ...binary.ByteOrder) (string, error)

MarshalToHex will encode the geometry into a hex string representation of the binary ewkb.

func MustMarshal

func MustMarshal(geom orb.Geometry, srid int, byteOrder ...binary.ByteOrder) []byte

MustMarshal will encode the geometry and panic on error. Currently there is no reason to error during geometry marshalling.

func MustMarshalToHex

func MustMarshalToHex(geom orb.Geometry, srid int, byteOrder ...binary.ByteOrder) string

MustMarshalToHex will encode the geometry and panic on error. Currently there is no reason to error during geometry marshalling.

func Unmarshal

func Unmarshal(data []byte) (orb.Geometry, int, error)

Unmarshal will decode the type into a Geometry.

func Value

func Value(g orb.Geometry, srid int) driver.Valuer

Value will create a driver.Valuer that will EWKB the geometry into the database query.

db.Exec("INSERT INTO table (point_column) VALUES (?)", ewkb.Value(p, 4326))

func ValuePrefixSRID

func ValuePrefixSRID(g orb.Geometry, srid int) driver.Valuer

ValuePrefixSRID will create a driver.Valuer that will WKB the geometry but add the srid as a 4 byte prefix.

db.Exec("INSERT INTO table (point_column) VALUES (?)", ewkb.Value(p, 4326))

Types

type Decoder

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

Decoder can decoder WKB geometry off of the stream.

func NewDecoder

func NewDecoder(r io.Reader) *Decoder

NewDecoder will create a new EWKB decoder.

func (*Decoder) Decode

func (d *Decoder) Decode() (orb.Geometry, int, error)

Decode will decode the next geometry off of the stream.

type Encoder

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

An Encoder will encode a geometry as EWKB to the writer given at creation time.

func NewEncoder

func NewEncoder(w io.Writer) *Encoder

NewEncoder creates a new Encoder for the given writer.

func (*Encoder) Encode

func (e *Encoder) Encode(geom orb.Geometry, srid ...int) error

Encode will write the geometry encoded as EWKB to the given writer.

func (*Encoder) SetByteOrder

func (e *Encoder) SetByteOrder(bo binary.ByteOrder) *Encoder

SetByteOrder will override the default byte order set when the encoder was created.

func (*Encoder) SetSRID

func (e *Encoder) SetSRID(srid int) *Encoder

SetSRID will override the default srid.

type GeometryScanner

type GeometryScanner struct {
	SRID     int
	Geometry orb.Geometry
	Valid    bool // Valid is true if the geometry is not NULL
	// contains filtered or unexported fields
}

GeometryScanner is a thing that can scan in sql query results. It can be used as a scan destination:

var s wkb.GeometryScanner
err := db.QueryRow("SELECT latlon FROM foo WHERE id=?", id).Scan(&s)
...
if s.Valid {
  // use s.Geometry
  // use s.SRID
} else {
  // NULL value
}

func Scanner

func Scanner(g interface{}) *GeometryScanner

Scanner will return a GeometryScanner that can scan sql query results. The geometryScanner.Geometry attribute will be set to the value. If g is non-nil, it MUST be a pointer to an orb.Geometry type like a Point or LineString. In that case the value will be written to g and the Geometry attribute.

var p orb.Point
err := db.QueryRow("SELECT latlon FROM foo WHERE id=?", id).Scan(wkb.Scanner(&p))
...
// use p

If the value may be null check Valid first:

var point orb.Point
s := wkb.Scanner(&point)
err := db.QueryRow("SELECT latlon FROM foo WHERE id=?", id).Scan(s)
...
if s.Valid {
  // use p
} else {
  // NULL value
}

func ScannerPrefixSRID

func ScannerPrefixSRID(g interface{}) *GeometryScanner

ScannerPrefixSRID will scan ewkb data were the SRID is in the first 4 bytes of the data. Databases like mysql/mariadb use this as their raw format. This method should only be used when working with such a database.

var p orb.Point
err := db.QueryRow("SELECT latlon FROM foo WHERE id=?", id).Scan(wkb.PrefixSRIDScanner(&p))

However, it is recommended to covert to wkb explicitly using something like:

var srid int
var p orb.Point
err := db.QueryRow("SELECT ST_SRID(latlon), ST_AsBinary(latlon) FROM foo WHERE id=?", id).
	Scan(&srid, wkb.Scanner(&p))

https://dev.mysql.com/doc/refman/5.7/en/gis-data-formats.html

func (*GeometryScanner) Scan

func (s *GeometryScanner) Scan(d interface{}) error

Scan will scan the input []byte data into a geometry. This could be into the orb geometry type pointer or, if nil, the scanner.Geometry attribute.

Source Files

ewkb.go scanner.go

Version
v0.11.1 (latest)
Published
Jan 29, 2024
Platform
js/wasm
Imports
9 packages
Last checked
1 day ago

Tools for package owners.