Как преобразовать координату точки в базе данных в структуру точки GoLang - PullRequest
2 голосов
/ 24 апреля 2020
CurrentCoordinates  []uint8 `json:"current_coordinates"`
type Points struct {
    Lat     float64    `json:"lat"`
    Lng     float64    `json:"lng"`
}

Столбец БД содержит данные в виде: POINT (6.887035 79.883757)

Из БД я получил его в [] uint8, затем результат: [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]

Кто-нибудь знает, как преобразовать это в координаты?

1 Ответ

1 голос
/ 24 апреля 2020

Координаты хранятся в конце вашего среза, оба имеют 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 Детская площадка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...