Координаты хранятся в конце вашего среза, оба имеют 8 байтов, которые представляют собой байты с прямым порядком байтов IEEE 754 с двойной точностью представления чисел с плавающей запятой.
Вы можете использовать пакет encoding/binary
для получения данных с плавающей запятой координат как uint64
, и вы можете использовать math.Float64frombits()
для "преобразования" этого данные для float64
типа.
Вот как вы можете их декодировать:
data := []byte{0, 0, 0, 0, 1, 1, 0, 0, 0, 35, 161, 45, 231, 82, 140, 27, 64, 28, 39, 133, 121, 143, 248, 83, 64}
d := binary.LittleEndian.Uint64(data[9:])
x := math.Float64frombits(d)
d = binary.LittleEndian.Uint64(data[17:])
y := math.Float64frombits(d)
fmt.Println(x, y)
Это выдаст (попробуйте на Go Playground ):
6.887035 79.883757
Начало ваших данных может быть SRID (идентификатор пространственной привязки) и / или какое-то расстояние / точность поиска, зависит от используемой вами базы данных.
В качестве альтернативы Вы можете создать чтение io.Reader
из своего среза, используя bytes.NewReader()
, и использовать функцию binary.Read()
:
data := []byte{0, 0, 0, 0, 1, 1, 0, 0, 0, 35, 161, 45, 231, 82, 140, 27, 64, 28, 39, 133, 121, 143, 248, 83, 64}
r := bytes.NewReader(data[9:])
var x, y float64
if err := binary.Read(r, binary.LittleEndian, &x); err != nil {
panic(err)
}
if err := binary.Read(r, binary.LittleEndian, &y); err != nil {
panic(err)
}
fmt.Println(x, y)
Это выдаст то же самое. Попробуйте это на Go Детская площадка .