2 votes

Comment convertir les coordonnées d'un point dans une base de données en point struct GoLang

CurrentCoordinates  []uint8 `json:"current_coordinates"`

type Points struct {
    Lat     float64    `json:"lat"`
    Lng     float64    `json:"lng"`
}

Les données de la colonne DB sont les suivantes : POINT(6.887035 79.883757)

A partir de DB, je l'ai transformé en []uint8, puis le résultat est : [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]

Quelqu'un sait-il comment convertir ces données en coordonnées ?

2voto

icza Points 3857

Les coordonnées sont stockées à la fin de votre tranche, elles ont toutes deux 8 octets qui sont les octets codés en petit-endian de l'élément IEEE 754 en double précision des nombres à virgule flottante.

Vous pouvez utiliser le encoding/binary pour obtenir les données en virgule flottante des coordonnées sous la forme d'un fichier uint64 et vous pouvez utiliser math.Float64frombits() pour "convertir" ces données en float64 type.

Voici comment les décoder :

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)

Cela produira un résultat (essayez-le sur l'écran Go Playground ):

6.887035 79.883757

Le début de vos données peut être un SRID (identifiant de référence spatiale) et/ou une sorte de distance/précision pour les recherches, en fonction de la base de données que vous utilisez.

Vous pouvez également créer un io.Reader lecture de votre tranche à l'aide de bytes.NewReader() et utiliser le binary.Read() fonction :

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)

Le résultat sera le même. Essayez celui-ci sur le Go Playground .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X