Golang Go语言中 请问 gorm 如何实现 根据经纬度换算距离 并排序

发布于 1周前 作者 bupafengyu 来自 Go语言

Golang Go语言中 请问 gorm 如何实现 根据经纬度换算距离 并排序
type MapInfo struct {
ID int32 json:"id" gorm:"primary_key"
Name string json:"name" form:"name" validate:"required"
Longitude string json:"longitude" form:"longitude" validate:"required"
Latitude string json:"latitude" form:"latitude" validate:"required"
}


更多关于Golang Go语言中 请问 gorm 如何实现 根据经纬度换算距离 并排序的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

扔到 postgits 里,用 gist 索引,速度杠杠滴

更多关于Golang Go语言中 请问 gorm 如何实现 根据经纬度换算距离 并排序的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我用的是 mysql,请教一下 详细步骤

我用的是 mysql,请教一下 详细步骤

换数据库不值得,MySQL 也有空间扩展, 用空间类型+空间索引应该也是可以的。

写原生 sql 吧,你这种场景没有几个 orm 可以帮忙处理吧?

用 redis geo 类型存储

在Go语言中,使用GORM实现根据经纬度换算距离并排序,可以通过以下步骤完成:

  1. 定义结构体:首先,确保你的数据库模型中包含经纬度字段。例如:

    type Location struct {
        ID       uint
        Name     string
        Latitude float64
        Longitude float64
    }
    
  2. 计算距离:使用Haversine公式计算两个点之间的距离。你可以在查询结果之后,用Go代码计算每个点到目标点的距离。

  3. 排序:根据计算出的距离进行排序。

示例代码如下:

package main

import (
    "fmt"
    "math"
    "sort"
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)

// Haversine formula to calculate distance between two points
func haversine(lat1, lon1, lat2, lon2 float64) float64 {
    // 省略具体实现,可以自行查找公式
}

func main() {
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    // 省略数据库初始化和查询代码
    
    // 假设locations是查询到的Location切片
    // targetLat, targetLon 是目标点的经纬度
    // 使用自定义排序
    sort.Slice(locations, func(i, j int) bool {
        return haversine(locations[i].Latitude, locations[i].Longitude, targetLat, targetLon) < haversine(locations[j].Latitude, locations[j].Longitude, targetLat, targetLon)
    })

    // 打印排序后的结果
    for _, loc := range locations {
        fmt.Println(loc)
    }
}

注意:实际应用中,建议优化计算过程,例如在数据库层面进行预处理,或使用缓存减少计算量。

回到顶部