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 .