You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
4.4 KiB

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
}