Skip to content

Instantly share code, notes, and snippets.

@noxecane
Created September 20, 2020 16:35
Show Gist options
  • Save noxecane/90b9551a1a389fb69a50fe72d329e1ae to your computer and use it in GitHub Desktop.
Save noxecane/90b9551a1a389fb69a50fe72d329e1ae to your computer and use it in GitHub Desktop.
Postgres SQL type for postgis
package gis
import (
"bytes"
"database/sql/driver"
"encoding/binary"
"encoding/hex"
"fmt"
)
type Point [2]float64
func (p *Point) String() string {
return fmt.Sprintf("SRID=4326;POINT(%v %v)", p[0], p[1])
}
// Scan implements the sql.Scanner interface.
func (p *Point) Scan(val interface{}) error {
b, err := hex.DecodeString(string(val.([]uint8)))
if err != nil {
return err
}
r := bytes.NewReader(b)
var wkbByteOrder uint8
if err := binary.Read(r, binary.LittleEndian, &wkbByteOrder); err != nil {
return err
}
var byteOrder binary.ByteOrder
switch wkbByteOrder {
case 0:
byteOrder = binary.BigEndian
case 1:
byteOrder = binary.LittleEndian
default:
return fmt.Errorf("Invalid byte order %d", wkbByteOrder)
}
var wkbGeometryType uint64
if err := binary.Read(r, byteOrder, &wkbGeometryType); err != nil {
return err
}
if err := binary.Read(r, byteOrder, p); err != nil {
return err
}
return nil
}
func (p Point) Value() (driver.Value, error) {
return p.String(), nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment