Golang Go语言中 请问 gorm 如何实现 根据经纬度换算距离 并排序
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
扔到 postgits 里,用 gist 索引,速度杠杠滴
更多关于Golang Go语言中 请问 gorm 如何实现 根据经纬度换算距离 并排序的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
用 PostGIS
我用的是 mysql,请教一下 详细步骤
我用的是 mysql,请教一下 详细步骤
写原生 sql 吧,你这种场景没有几个 orm 可以帮忙处理吧?
用 redis geo 类型存储
在Go语言中,使用GORM实现根据经纬度换算距离并排序,可以通过以下步骤完成:
-
定义结构体:首先,确保你的数据库模型中包含经纬度字段。例如:
type Location struct { ID uint Name string Latitude float64 Longitude float64 }
-
计算距离:使用Haversine公式计算两个点之间的距离。你可以在查询结果之后,用Go代码计算每个点到目标点的距离。
-
排序:根据计算出的距离进行排序。
示例代码如下:
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)
}
}
注意:实际应用中,建议优化计算过程,例如在数据库层面进行预处理,或使用缓存减少计算量。