package main import ( "context" "fmt" "github.com/go-redis/redis/v9" ) func main() { // 添加和获取信息 //geoAddGet() // 搜索地点成员 geoSearch() } func geoSearch() { opt, err := redis.ParseURL("redis://default:yourPassword@192.168.157.135:6379/0?dial_timeout=1") if err != nil { panic(err) } client := redis.NewClient(opt) ctx := context.Background() client.Del(ctx, "cities") cities := []*redis.GeoLocation{ {Name: "changsha", Longitude: 113.00000, Latitude: 28.21667}, {Name: "beijing", Longitude: 116.41667, Latitude: 39.91667}, {Name: "shanghai", Longitude: 121.43333, Latitude: 34.50000}, {Name: "guangzhou", Longitude: 113.23333, Latitude: 23.16667}, {Name: "shenzhen", Longitude: 114.06667, Latitude: 22.61667}, {Name: "tianjin", Longitude: 117.20000, Latitude: 39.13333}, {Name: "hangzhou", Longitude: 120.20000, Latitude: 30.26667}, {Name: "chengdu", Longitude: 104.06667, Latitude: 30.66667}, {Name: "xian", Longitude: 108.95000, Latitude: 34.26667}, {Name: "changchun", Longitude: 125.35000, Latitude: 43.88333}, {Name: "wulumuqi", Longitude: 87.68333, Latitude: 43.76667}, } client.GeoAdd(ctx, "cities", cities...).Result() // 搜索某个距离成员距离范围的其他成员 // 一,圆的范围,使用成员确定圆心 fmt.Println(client.GeoSearch(ctx, "cities", &redis.GeoSearchQuery{ Member: "hangzhou", Radius: 1000, RadiusUnit: "km", }).Result()) // 可以返回 坐标、距离和Hash fmt.Println(client.GeoSearchLocation(ctx, "cities", &redis.GeoSearchLocationQuery{ GeoSearchQuery: redis.GeoSearchQuery{ Member: "hangzhou", Radius: 1000, RadiusUnit: "km", }, WithCoord: true, WithDist: true, WithHash: true, }).Result()) // 二,圆的范围,使用坐标确定圆心 fmt.Println(client.GeoSearch(ctx, "cities", &redis.GeoSearchQuery{ Longitude: 120.20000, Latitude: 30.26667, Radius: 1000, RadiusUnit: "km", }).Result()) // 三,矩形的范围,使用坐标(成员)确定中心 fmt.Println(client.GeoSearch(ctx, "cities", &redis.GeoSearchQuery{ Member: "hangzhou", // OR //Longitude: 120.20000, //Latitude: 30.26667, // 宽高 BoxWidth: 1000, BoxHeight: 1000, BoxUnit: "km", }).Result()) // 四,搜素结果过滤 // 可以返回 坐标、距离和Hash fmt.Println(client.GeoSearchLocation(ctx, "cities", &redis.GeoSearchLocationQuery{ GeoSearchQuery: redis.GeoSearchQuery{ Member: "hangzhou", Radius: 1000, RadiusUnit: "km", }, WithCoord: true, WithDist: true, WithHash: true, }).Result()) fmt.Println(client.GeoSearchLocation(ctx, "cities", &redis.GeoSearchLocationQuery{ GeoSearchQuery: redis.GeoSearchQuery{ Member: "hangzhou", Radius: 1000, RadiusUnit: "km", //Sort: "DESC", // ASC, DESC Count: 2, CountAny: true, }, WithCoord: true, WithDist: true, WithHash: true, }).Result()) } func geoAddGet() { opt, err := redis.ParseURL("redis://default:yourPassword@192.168.157.135:6379/0?dial_timeout=1") if err != nil { panic(err) } client := redis.NewClient(opt) ctx := context.Background() //client.Del(ctx, "cities") // 添加 fmt.Println(client.GeoAdd(ctx, "cities", &redis.GeoLocation{ Name: "changsha", Longitude: 113.00001, Latitude: 28.21667, }).Result()) cities := []*redis.GeoLocation{ {Name: "changsha", Longitude: 113.00000, Latitude: 28.21667}, {Name: "beijing", Longitude: 116.41667, Latitude: 39.91667}, {Name: "shanghai", Longitude: 121.43333, Latitude: 34.50000}, {Name: "guangzhou", Longitude: 113.23333, Latitude: 23.16667}, {Name: "shenzhen", Longitude: 114.06667, Latitude: 22.61667}, {Name: "tianjin", Longitude: 117.20000, Latitude: 39.13333}, {Name: "hangzhou", Longitude: 120.20000, Latitude: 30.26667}, {Name: "chengdu", Longitude: 104.06667, Latitude: 30.66667}, {Name: "xian", Longitude: 108.95000, Latitude: 34.26667}, {Name: "changchun", Longitude: 125.35000, Latitude: 43.88333}, {Name: "wulumuqi", Longitude: 87.68333, Latitude: 43.76667}, } fmt.Println(client.GeoAdd(ctx, "cities", cities...).Result()) // 获取信息 // 获取坐标 poses, _ := client.GeoPos(ctx, "cities", "changsha", "beijing").Result() for _, pos := range poses { fmt.Println(pos) } // 获取 geohash 位置 fmt.Println(client.GeoHash(ctx, "cities", "changsha", "beijing").Result()) // 获取距离 fmt.Println(client.GeoDist(ctx, "cities", "changsha", "beijing", "km").Result()) // m km mi ft }