如何将数据库中的点坐标转换为点结构 GoLang

CurrentCoordinates  []uint8 `json:"current_coordinates"`
type Points struct {
    Lat     float64    `json:"lat"`
    Lng     float64    `json:"lng"`
}

DB列的数据为:POINT(6.887035 79.883757)

从DB中,我把它转换成[]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] 。

有谁知道如何将其转换为坐标?

解决方案:

坐标存储在你的片子的最后,都有8个字节,这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)

这将输出(在 去游乐场):

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)

这也会有同样的输出。试试这个 去游乐场.

给TA打赏
共{{data.count}}人
人已打赏
未分类

根据公式生成最多X个数值。

2022-9-8 20:43:36

未分类

Laravel在accessor上的平均价值

2022-9-8 20:43:38

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索