results, err := rdb.GeoRadius("locations", longitude, latitude, &radius).Result() if err != nil { fmt.Println("GeoRadius error", err) return } //遍历结果并输出 for _, result := range results { locationName := result.Name longitude := result.Longitude latitude := result.Latitude fmt.Println(locationName, longitude, latitude) }取来经纬度=0
时间: 2024-04-06 14:33:15 浏览: 51
如果在遍历 `results` 数组时,获取到的经度和纬度值都为 0,可能是因为 Redis 中存储的地理位置信息数据存在问题,或者是在查询时没有指定正确的经度和纬度值。
建议你先使用 Redis 的 `GEOPOS` 命令来检查指定的地理位置集合中是否存在指定名称的元素,以及该元素的经度和纬度值是否正确。如果 `GEOPOS` 命令可以正常返回指定元素的经度和纬度值,那么可以排除 Redis 数据存在问题的可能性。
另外,在使用 `rdb.GeoRadius` 函数时,需要保证传入的经度和纬度值的数据类型正确。例如,经度和纬度值应该使用浮点数类型,而非整型。如果传入的经度和纬度值类型不正确,可能会导致查询结果出现异常。
你可以先检查 Redis 数据以及传入的经度和纬度值是否正确,看看是否能够解决这个问题。如果问题仍然存在,可以进一步调试代码,查看具体出现问题的地方。
相关问题
改进函数var rdb *redis.Client func initClient() (err error) { rdb = redis.NewClient(&redis.Options{ Addr: "127.0.0.1:6379", Password: "123456", // 密码 DB: 0, //PoolSize: 100, // 连接池大小 }) _, err = rdb.Ping().Result() return err } func main() { if err := initClient(); err != nil { fmt.Printf("init redis client failed, err:%v\n", err) return } fmt.Println("connect redis success...") locations := []*redis.GeoLocation{ {Name: "Beijing", Longitude: 116.404, Latitude: 39.915}, {Name: "Shanghai", Longitude: 121.473, Latitude: 31.230}, {Name: "Guangzhou", Longitude: 113.264, Latitude: 23.129}, } rdb.GeoAdd("locations", locations...) //设置中心点经纬度 longitude := 118.397128 latitude := 30.916527 //设置半径和单位(单位可以是米、千米、英里等) radius := redis.GeoRadiusQuery{ Radius: 1000, Unit: "km", } //调用GeoRadius函数并获取结果 results, err := rdb.GeoRadius("locations", longitude, latitude, &radius).Result() if err != nil { fmt.Println("GeoRadius error", err) return } //遍历结果并输出 for _, result := range results { locationName := result.Name locationDist := result.Dist locationCoord := result.GeoHash fmt.Println(locationName, locationDist, locationCoord) } // 释放相关资源 defer rdb.Close() }
你的改进函数中,将 Redis 客户端对象 `rdb` 定义为全局变量,并在 `initClient()` 函数中初始化,这样可以避免频繁地创建和销毁 Redis 客户端对象,从而提高程序的运行效率。此外,你还将 Redis 连接的信息(如 Redis 服务器的地址、密码等)封装到 `redis.Options` 结构体中,并通过 `redis.NewClient()` 方法来创建 Redis 客户端对象,这样代码更加简洁和易于维护。
在 `main()` 函数中,你首先调用 `initClient()` 函数来初始化 Redis 客户端对象 `rdb`,并检查初始化是否成功。然后,你通过 `rdb.GeoAdd()` 方法向 Redis 中添加了一些位置信息。接下来,你设置了一个中心点的经纬度坐标和一个查询半径和单位,然后调用 `rdb.GeoRadius()` 方法来获取符合查询条件的位置信息,并遍历结果将位置名称、距离和 GeoHash 值输出。最后,你通过 `defer` 语句释放了相关资源,避免程序运行结束后出现资源泄漏的情况。
这样改进后的代码结构更加清晰,可读性和可维护性都得到了提高。
results, err := rdb.GeoRadius("locations", longitude, latitude, &radius).Result()怎么在函数之后获取经纬度
在调用 `rdb.GeoRadius` 函数之后,我们可以通过遍历 `results` 数组来获取每个元素的经度和纬度值。
具体来说,`results` 数组中的每个元素都是一个包含名称、距离和坐标值的结构体。其中,坐标值是一个包含经度和纬度值的数组。我们可以通过访问该数组的第一个和第二个元素来获取元素的经度和纬度值。
以下是一个示例代码,用于遍历 `results` 数组并获取每个元素的经度和纬度值:
```go
results, err := rdb.GeoRadius("locations", longitude, latitude, &radius).Result()
if err != nil {
fmt.Println("GeoRadius error", err)
return
}
for _, result := range results {
locationName := result.Name
locationDist := result.Dist
longitude := result.Longitude
latitude := result.Latitude
// TODO: 处理获取到的经度和纬度值
}
```
在上面的代码中,我们遍历了 `results` 数组中的每个元素,并通过访问 `result.Longitude` 和 `result.Latitude` 字段来获取该元素的经度和纬度值。你可以根据实际需求,进一步处理获取到的经度和纬度值。
阅读全文