首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Redis 的 GEO 特性

Redis 的 GEO 特性

作者头像
魔王卷子
发布于 2019-06-02 05:10:37
发布于 2019-06-02 05:10:37
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

今天看文档,无意中发现了 Redis 的一个新功能。 Redis 在 3.2 版本实现了一个地理位置计算的特性。

版本要求

Redis 3.2 或者更新

添加和获取位置

geoadd (添加位置)

这个命令对于经纬度是有要求的:

  • 有效的经度从-180度到180度。
  • 有效的纬度从-85.05112878度到85.05112878度。

如果超出返回,那么命令就会返回一个错误.

添加命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GEOADD location-set longitude latitude name [longitude latitude name ...]

这个可以同时添加多个位置。其中 location-set 是存储地理位置的集合名称,longitudelatitudename 则是地理位置的精度、纬度、名字。

下面添加北京的地铁站的坐标:

添加单个位置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> geoadd subways 116.404269 39.906543 qianmen
(integer) 1

添加多个位置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> geoadd subways 116.409465 39.939578 nanluoguxiang 116.402549 39.944163 shichahai 116.315934 40.005471 yuanmingyuan 116.399279 40.007208 aolinpikegongyuan
(integer) 4

将坐标记录到位置集合之后,我们使用 geopos 命令来获取位置的名字和具体经纬度

获取命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GEOPOS location-set name [name ...]

比如说,如果我们想要获取圆明园、前门的经纬度,那么我们就可以执行以下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> geopos subways yuanmingyuan qianmen
1) 1) "116.31593316793441772"
   2) "40.00546983911101506"
2) 1) "116.40426903963088989"
   2) "39.90654220698316834"

计算两个点之前的距离

命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GEODIST location-set location-x location-y [unit]

可选参数 unit 用于指定计算距离时的单位,它的值为下面的一个:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。

比如我们要计算奥林匹克公园和圆明园的距离:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> geodist subways yuanmingyuan aolinpikegongyuan
"7103.4924"

如果我们指定单位为 km

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> geodist subways yuanmingyuan aolinpikegongyuan km
"7.1035"

获取指定范围内的元素

Redis 提供了两种方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GEORADIUS location-set longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count]

GEORADIUSBYMEMBER location-set location radius m|km|ft|mi [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count]

这两个命令都是用来查找特定范围地点的功能,但是指定中心点的方式不同:georadius 使用的是用户给定的经纬度,而 georadiusbymember 则使用存储在位置集合里面的某个地点作为中心点。

  • m|km|ft|mi 指定的是计算范围时的单位;
  • 如果给定了可选的 WITHCOORD , 那么命令在返回匹配的位置时会将位置的经纬度一并返回;
  • 如果给定了可选的 WITHDIST , 那么命令在返回匹配的位置时会将位置与中心点之间的距离一并返回;
  • 在默认情况下, GEORADIUS 和 GEORADIUSBYMEMBER 的结果是未排序的, ASC 可以让查找结果根据距离从近到远排序, 而 DESC 则可以让查找结果根据从远到近排序;
  • COUNT 参数指定要返回的结果数量。

命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:

  • ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
  • DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。

比如说我们要返回指定坐标的10km内的位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> georadius subways 116.403878 39.914942 10 km
1) "qianmen"
2) "nanluoguxiang"
3) "shichahai"

我们还需要获取位置与中心点的距离:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> georadius subways 116.403878 39.914942 10 km withdist
1) 1) "qianmen"
   2) "0.9349"
2) 1) "nanluoguxiang"
   2) "2.7812"
3) 1) "shichahai"
   2) "3.2521"

我们需要返回按照最远距离排序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> georadius subways 116.403878 39.914942 10 km withdist desc
1) 1) "shichahai"
   2) "3.2521"
2) 1) "nanluoguxiang"
   2) "2.7812"
3) 1) "qianmen"
   2) "0.9349"

我们只需要两个就够了,三个太多了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> georadius subways 116.403878 39.914942 10 km withdist desc count 2
1) 1) "shichahai"
   2) "3.2521"
2) 1) "nanluoguxiang"
   2) "2.7812"
127.0.0.1:6379> georadius subways 116.403878 39.914942 10 km withdist count 2
1) 1) "qianmen"
   2) "0.9349"
2) 1) "nanluoguxiang"
   2) "2.7812"

获取前门10km附近的位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> georadiusbymember subways qianmen 10 km
1) "qianmen"
2) "nanluoguxiang"
3) "shichahai"

我们只是需要将其坐标换成集合名称中的会员名称就好了,用法跟之前的georadius相同。

georadiusgeoradiusbymember执行的代价并不低,因此强烈建议为查询结果创建缓存。

geohash

这个会返回一个11个字符的geohash字符串,使用内部52位表示。返回的geohashes具有以下特性:

  • 他们可以缩短从右边的字符。它将失去精度,但仍将指向同一地区。
  • 它可以在 geohash.org 网站使用,网址http://geohash.org/。查询例子:http://geohash.org/sqdtr74hyu0.
  • 与类似的前缀字符串是附近,但相反的是不正确的,这是可能的,用不同的前缀字符串附近。

命令格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GEOHASH key member [member ...]

例如我要查询前门的geohash:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> geohash subways qianmen
1) "wx4g0bg02n0"

完了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-11-172,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
组件分享之前端组件——基于pdf.js在线预览PDF文件
近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组件。欢迎大家进行持续关注。
cn華少
2022/03/06
5.6K0
react-pdf预览在线PDF的使用
建议安装8.0.2版本的react-pdf,如果安装更高版本的可能出现一些浏览器的兼容性问题;
用户1174387
2024/09/15
5790
react-pdf预览在线PDF的使用
PDF.js实现个性化PDF渲染(文本复制)
这种实现方式优缺点都很明显: 优点:自带“打印”,“搜索”,“翻页”等功能,强大且实现方便。 缺点:不同浏览器的pdf工具样式不一,且无法满足个性化需求,比如:禁止打印,下载等。
庞小明
2019/05/25
10.8K0
Webview加载pdf遇到的一些坑及解决方法
有一天产品小王拿着电脑兴致勃勃的来到我的工位旁:“诶,小付,这里有个在线pdf预览的功能,你看下能不能做。”
coder_koala
2021/11/10
8.9K0
Webview加载pdf遇到的一些坑及解决方法
Vue 通过调用文件流实现 PDF 文件在线预览的方法
如果后端返回的是PDF文件在服务器上的路径,直接访问该路径即可在浏览器中预览PDF文件。例如,后端返回路径http://example.com/path/to/file.pdf,在前端可以通过如下方式实现预览:
小焱
2025/05/19
2.3K0
Vue 通过调用文件流实现 PDF 文件在线预览的方法
前端实现word、excel、pdf、ppt、mp4、图片、文本等文件的预览
找了网上的实现方案,效果看起来不错,放在下面的表格里,里面有一些是可以直接通过npm在vue中引入使用。
PHP开发工程师
2022/03/07
2.5K0
前端实现word、excel、pdf、ppt、mp4、图片、文本等文件的预览
超详细的vue3使用pdfjs教程
在项目开发中碰到一个需求是在页面中展示pdf预览功能,本人的项目使用的是vue3,实现pdf预览使用的是pdf预览神器 pdfjs
CherishTheYouth
2021/08/11
19.6K1
前端【vue】实现文档在线预览功能,在线预览pdf、word、xls、ppt等office文件
XDOC可以实现预览以DataURI表示的DOC文档,此外XDOC还可以实现文本、带参数文本、html文本、json文本、公文等在线预览,具体实现方法请看官方文档下面这种方式可以实现快速预览word但是对文件使用的编辑器可能会有一些限制
江一铭
2022/06/17
26K2
前端【vue】实现文档在线预览功能,在线预览pdf、word、xls、ppt等office文件
如何实现高性能的在线 PDF 预览
最近接到产品需求,用户需要在我们的站点上在线查看 PDF 文件,并且查看时,用户可以对 PDF 文件的进行旋转、缩放、跳转到指定页码等操作。
政采云前端团队
2020/06/04
6.9K0
如何实现高性能的在线 PDF 预览
PDF.js Electron Viewer
PDF.js 是基于 HTML5 解析与渲染 PDF 的 JavaScript 库,由 Mozilla 主导开源。
GoCoding
2021/12/17
12.4K0
PDF.js Electron Viewer
解决Android的WebView无法打开PDF的方案
最近自家产品开发使用中收到反馈,安卓内嵌网页无法打开PDF,而IOS可以打开。其实安卓无法打开分以下几种情况:
一冷
2023/07/12
4.7K0
解决Android的WebView无法打开PDF的方案
office文件 vue 预览_vue实现pdf文档在线预览功能
针对android系统不支持pdf文档在线预览,可通过引入pdf.js插件实现,其具体实现步骤如下
全栈程序员站长
2022/08/30
3.7K0
用微前端 qiankun 接入十几个子应用后,我遇到了这些问题
我们先用 vue-cli快速创建一个项目,作为主应用,这里把他取名为 main-app
winty
2023/12/19
9K3
用微前端 qiankun 接入十几个子应用后,我遇到了这些问题
vue整合pdfjs,实现pdf文件预览
pdf格式的文件浏览器是可以直接打开的。所以只需要返回pdf文件的文件流,就可以直接预览文件,通过这种方式打开,整个页面全是pdf的文件内容。需求是要求预览时,页面上要加上特定的标题格式,所以直接把文件流在浏览器打开的方式行不通。通过收集相关资料,找到pdfjs插件以支持文件的预览。
用户5166330
2019/04/16
12K2
vue整合pdfjs,实现pdf文件预览
终极解决远程预览pdf问题
pdf.js一个基于Html的工具类,熟悉pdf.js的朋友们很清楚,pdf.js帮助我们做了很多事。尤其金融类网站会产生很多的报表。需要在线预览。pdf.js绝对是我们的首选
啵啵肠
2023/11/28
7110
PDF在线预览实现:如何使用vue-pdf-embed实现前端PDF在线阅读
在本篇博客中介绍的vue-pdf-embed核心逻辑是获取pdf内容并将其每一页渲染到canvas画布上,以类似图片的方式展示出来。pdf作为本地资源放在项目中。
watermelo37
2025/01/22
1.7K0
PDF在线预览实现:如何使用vue-pdf-embed实现前端PDF在线阅读
手把手教你撸一个能生成抖音风格动图的gif制作平台
又到了一周一次的周总结, 笔者基于之前的开源项目 blink , 开发了一款能在线配置故障艺术, 并一键生成gif动图的平台, 这里暂时取名为QT. 接下来笔者将复盘一下该可视化平台的实现步骤以及功能点, 让大家都能做自己的Gif动图生成平台.
徐小夕
2020/11/25
9650
手把手教你撸一个能生成抖音风格动图的gif制作平台
PDF.js 分片下载的介绍2:分片下载demo
服务器环境: php7.2 nginx 1.14 ubuntu 18.04 测试浏览器:谷歌浏览器 70.0.3538.110(
庞小明
2019/05/25
13K0
[OHIF-Viewers]医疗数字阅片-医学影像-ViewportDownloadForm.js
ViewportDownloadForm.js 源码还是得一行一行阅读,好多自定义的函数,得找到相应的用法 import React, { useRef, useCallback, useEffect, useState, createRef, } from 'react'; import PropTypes from 'prop-types'; import { useTranslation } from 'react-i18next'; import './ViewportDown
landv
2020/07/14
1K0
使用 React PDF 构建 React.js PDF 查看器的指南
在本文中,我们将重点介绍在React.js中制作 PDF 查看器的最受欢迎的开源库。具体来说,我们将利用著名的开源库react-pdf的功能,指导您完成创建 React.js PDF 查看器的过程。
Youna
2025/05/20
3490
使用 React PDF 构建 React.js PDF 查看器的指南
推荐阅读
相关推荐
组件分享之前端组件——基于pdf.js在线预览PDF文件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验