首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在rails-postgres-rgeo项目中按经度/经度查找记录

在rails-postgres-rgeo项目中,按经度/纬度查找记录是指通过经度和纬度的数值来查询数据库中符合条件的记录。这种查询方式常用于地理位置相关的应用,例如附近的商家、地点搜索等。

在rails-postgres-rgeo项目中,可以使用PostgreSQL数据库和RGeo gem来实现按经度/纬度查找记录的功能。以下是一个完整的实现步骤:

  1. 数据库准备:
    • 在Rails项目中配置使用PostgreSQL数据库。
    • 创建一个包含经度和纬度字段的表,例如locations表。
    • locations表中添加索引以提高查询性能,可以使用PostGIS扩展来支持地理位置相关的查询。
  • 模型定义:
    • 创建一个名为Location的模型,并与locations表关联。
    • Location模型中使用RGeo gem来定义经度/纬度字段的数据类型为Point
  • 查询实现:
    • 在控制器中接收经度和纬度的参数。
    • 使用RGeo gem提供的方法将经度和纬度参数转换为Point类型的对象。
    • 在查询中使用PostgreSQL的地理位置相关函数,例如ST_Distance来计算距离。
    • 执行查询并返回符合条件的记录。

以下是一个示例代码:

代码语言:txt
复制
# 模型定义
class Location < ApplicationRecord
  # 经度/纬度字段的数据类型为Point
  self.rgeo_factory_generator = RGeo::Geos.factory_generator
  set_rgeo_factory_for_column(:coordinates, RGeo::Geographic.spherical_factory(srid: 4326))
end

# 控制器中的查询方法
class LocationsController < ApplicationController
  def search
    longitude = params[:longitude].to_f
    latitude = params[:latitude].to_f

    # 将经度和纬度参数转换为Point对象
    point = RGeo::Geographic.spherical_factory(srid: 4326).point(longitude, latitude)

    # 按距离排序查询
    @locations = Location.order("ST_Distance(coordinates, '#{point}')").limit(10)
  end
end

在这个示例中,我们假设经度参数为longitude,纬度参数为latitude,查询结果按距离排序,并限制返回前10条记录。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云数据库 PostgreSQL:https://cloud.tencent.com/product/postgres
  • 腾讯云地理位置服务:https://cloud.tencent.com/product/lbs
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云函数(SCF):https://cloud.tencent.com/product/scf
  • 腾讯云人工智能:https://cloud.tencent.com/product/ai
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Redis 实战篇:Geo 算法教你邂逅附近女神

经度的范围在 (-180, 180],纬度的范围 (-90, 90],纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负。...进行第一次二分区时,经度范围[-180,180]会被分成两个子区间:[-180,0) 和[0,180](我称之为左、右分区)。 此时,我们可以查看一下要编码的经度值落在了左分区还是右分区。...GEO 类型的集合中,如下:一次记录多个用户(苍井空、波多野结衣)的经纬度信息。...” Redis GEO类型提供了 GEORADIUS指令:会根据输入的经纬度位置,查找以这个经纬度为中心的一定范围内的其他元素。...如果数据量过亿甚至更大,就需要对 Geo 数据进行拆分,国家拆分、省拆分,市拆分,人口特大城市甚至可以区拆分。 这样就可以显著降低单个 zset 集合的大小。

1.5K10

Redis 实战篇:通过 Geo 类型实现附近的人邂逅女神

经度的范围在 (-180, 180],纬度的范围 (-90, 90],纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负。...进行第一次二分区时,经度范围[-180,180]会被分成两个子区间:[-180,0) 和[0,180](我称之为左、右分区)。 此时,我们可以查看一下要编码的经度值落在了左分区还是右分区。...GEO 类型的集合中,如下:一次记录多个用户(苍井空、波多野结衣)的经纬度信息。...” Redis GEO类型提供了 GEORADIUS指令:会根据输入的经纬度位置,查找以这个经纬度为中心的一定范围内的其他元素。...如果数据量过亿甚至更大,就需要对 Geo 数据进行拆分,国家拆分、省拆分,市拆分,人口特大城市甚至可以区拆分。 这样就可以显著降低单个 zset 集合的大小。 ----

1.3K20

Redis 实战篇:通过 Geo 类型实现附近的人邂逅女神

经度的范围在 (-180, 180],纬度的范围 (-90, 90],纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负。...进行第一次二分区时,经度范围[-180,180]会被分成两个子区间:[-180,0) 和[0,180](我称之为左、右分区)。 此时,我们可以查看一下要编码的经度值落在了左分区还是右分区。...GEO 类型的集合中,如下:一次记录多个用户(苍井空、波多野结衣)的经纬度信息。...” Redis GEO类型提供了 GEORADIUS指令:会根据输入的经纬度位置,查找以这个经纬度为中心的一定范围内的其他元素。...如果数据量过亿甚至更大,就需要对 Geo 数据进行拆分,国家拆分、省拆分,市拆分,人口特大城市甚至可以区拆分。 这样就可以显著降低单个 zset 集合的大小。

1.1K50

Redis 7的地理信息命令太太太牛了!一文教你如何使用

GEOPOS:获取一个或多个位置的经度和纬度。 GEORADIUS:根据指定的位置和距离,指定的键中查找附近的位置。...GEORADIUSBYMEMBER:根据指定的位置成员和距离,指定的键中查找附近的位置。 GEOSEARCH:根据指定的查询参数,指定的键中搜索符合条件的位置。...GEORADIUS GEORADIUS命令用于根据指定的位置和距离,指定的键中查找附近的位置。...WITHCOORD:返回位置的经度和纬度。 WITHDIST:返回位置与查询点的距离。 ASC|DESC:距离升序或降序排序。 COUNT count:返回最多指定数量的结果。...通过GEOPOS命令,我们可以获取一个或多个位置的经度和纬度信息。 对于位置搜索,Redis提供了多种命令。GEORADIUS命令可以根据指定的位置和距离,指定的键中查找附近的位置。

28530

Redis 7的地理信息命令太太太牛了!一文教你如何使用

GEOPOS:获取一个或多个位置的经度和纬度。GEORADIUS:根据指定的位置和距离,指定的键中查找附近的位置。...GEORADIUSBYMEMBER:根据指定的位置成员和距离,指定的键中查找附近的位置。GEOSEARCH:根据指定的查询参数,指定的键中搜索符合条件的位置。...GEORADIUSGEORADIUS命令用于根据指定的位置和距离,指定的键中查找附近的位置。...WITHCOORD:返回位置的经度和纬度。WITHDIST:返回位置与查询点的距离。ASC|DESC:距离升序或降序排序。COUNT count:返回最多指定数量的结果。...通过GEOPOS命令,我们可以获取一个或多个位置的经度和纬度信息。对于位置搜索,Redis提供了多种命令。GEORADIUS命令可以根据指定的位置和距离,指定的键中查找附近的位置。

25510

Redis GeoHash核心原理解析

B树索引本质上是对索引字段进行排序,然后通过类似二分查找的方法进行快速查找,即它要求索引的字段是可排序的,一般而言,可排序的是一维字段,比如时间、年龄、薪水等等。...GeoHash算法的步骤 下面以北海公园附近随便一个位置为例介绍GeoHash算法的计算步骤,先用百度 GPS反定位系统查找看下经纬度。 ? 纬度=116.395371,经度=39.931957。...随着每次迭代区间[a,b]总在缩小,并越来越逼近39.928167; 如果给定的纬度x(39.928167)属于左区间,则记录0,如果属于右区间则记录1,这样随着算法的进行会产生一个序列1011100,...a过滤得到的m个POI中查找经度范围的POI(图6b),个数为n(n<m),复杂度为m*过滤函数; 用球面距离公式计算位置与步骤b得到的n个POI的距离(图6c),并保留距离小于50米的POI ?...参考 Java实现GPS范围查找 浙大大佬通俗说GPS

1.4K20

美团如何查询附近商家

想必大家中学时代的地理课本里早就学过了。我们把地球分成纵横交错的一些格子,每个点都可以用横竖坐标来表示。...此时上海的经度编码就是11 如此这样重复N次,我们就可以将地球经度切割成很多很多的小格子,如果切割的次数足够多,每一个格子相当于一个点,那也会得到对应这个小块儿的二进制编码。...上海的纬度编码就是:10110001 最终我们得到的上海经纬度编码为 (121.43333,34.50000)-->(11010110,10110001) 统一编码 为了方便记录,我们把经度和维度的二进制格子编码进行合并...,经度、纬度、经度、维度……这样的顺序,一位一位的进行放置: (11010110,10110001)-->1110011100101001 奇数位的红色是经度编码,偶数位的黑色是纬度编码 我们可以用16...这个特性可以用于附近地点搜索 查找 通过上面的方法,我们就可以将所有商铺的经纬度给一个编码存进数据库,建立索引。

5.1K20

redis常用命令和数据类型

语法: geoadd key 经度 纬度 地名 经度 纬度 地名 ... ... 2、geopos:获取地理位置的坐标(经度,纬度) geopos key 地名 3、geodist:计算两个位置之间的距离...] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] WITHDIST: 返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。...COUNT: 指定半径范围内显示的目标数量(半径内有100个,可以只显示50个) ASC: 查找结果根据距离从近到远排序。...DESC: 查找结果根据从远到近排序 5、georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。...二、Bitmaps 用来统计用户是否访问过网站,访问为1,没有为0 详解redis的bitmap亿级项目中的应用 设置值setbit:设置Bitmaps中某个偏移量的值(0或1),offset从0

82910

(数据科学学习手札65)利用Python实现Shp格式向GeoJSON的转换

,纬度] } }   其中properties对应的值为这个要素对应的属性表中顺序存放的值,geometry对应的值中type指明了要素类型,coordinates传入一个包含两个元素的列表...1,纬度1], [经度2,纬度2] ] } } 线要素(LineString):   线要素记录的是一条线上所有折点的经纬度信息...,只需要按顺序连接这些折点就可以还原一条线的形态,GeoJSON中线要素与多点要素coordinates属性上格式相同,区别在于geometry属性需要传入"LineString",如下: {"type...} } 多边形要素(Polygon):   多边形要素记录了构成一个多边形所有边缘折点的经纬度信息,其coordinates属性传入"Polygon",其geometry下type属性格式为三维列表...,其第三层列表中嵌套的所有列表记录的经纬度顺序连接即构成了一个多边形,但需要注意的是,多边形头尾折点的经纬度需要相同,才能构成一个闭合的多边形,如下: {"type":"Feature", "

2.6K10

交友系统设计:哪种地理空间邻近算法更快?

Liao 的功能用例图如下: 用户规模分析 Liao 的目标用户是全球范围内的中青年单身男女,预估目标用户超过 10 亿,系统 10 亿用户进行设计。...1、SQL 邻近算法 我们可以将用户经、纬度直接记录到数据库中,纬度记录在 latitude 字段,经度记录在longitude 字段,用户当前的纬度和经度为 X,Y,如果我们想要查找和当前用户经、纬度距离...这样每个用户必然会落入到一个网格中,我们在用户表中记录用户所在的网格ID(gridID),然后借助这个字段进行辅助查找,将查找范围限制在用户所在的网格(gridIDx0)及其周围 8 个网格(gridIDx1...如果子树是叶子节点,那么叶子节点中查找,如果不是叶子节点,继续上面的过程,直到叶子节点。 上面的过程只能找到当前用户所在网格的好友,如何查找邻近网格的其他用户呢?...如此不断重复,可以经度和纬度方向上,得到两个二进制数。这个二进制数越长,其所在的区间越小,精度越高。

18510

周围的餐馆有哪些?GeoHash算法

geohash-feature 当今年代,每个人都有智能手机,出门在外,自然离不开使用手机地图了,查找附近的餐馆,附近的地铁站,非常方便,可是在这项技术背后又隐藏着什么算法呢?...代表的区域越小,就越精确,比如 wtw3eegq 这个Hash就是上海南京西路周围的的一块,但是 只有前6位 wtw3ee 的话这个Hash代表的区域面积就比 wtw3eegq要大,但是 wtw3eegq 是包扩...wtw3ee 这个区域里面的,所以可以用这个特性来查找一个坐标周围的餐馆之类的地方。...计算经度 首先将经度范围(-180, 180)平分成两个区间(-180,0)、(0, 180),如果目标经度位于前一个区间,则编码为0,否则编码为1。...11 27 28 ±0.00000067 ±0.00000067 ±0.0001492 12 30 30 ±0.00000008 ±0.00000017 ±0.0000186 Github链接 这个项目中有我写的爬虫

1K30

使用.NET查询日出日落时间

WPF中,通过资源文件实现主题切换是个常见的功能,有不少文章介绍了如何实现手动切换主题。那如何实现自动切换主题呢?...首先,下载IP2LOCATION-LITE-DB11.BIN数据库文件,然后目中通过Nuget引用IP2Location.IPGeolocation包。...首先,下载GeoLite2-City.mmdb数据库文件,然后目中通过Nuget引用MaxMind.GeoIP2包。...最新(2024-5-7下载)的GeoLite2数据库中查询到20071个中国的IP网段,其中有11270条是未查询到具体城市信息的记录。...程序中也可以通过特定API获取公网IP,比如下边这个API: Get https://ipecho.net/plain 小结 计算日出日落和经度纬度信息的环节都介绍了在线API服务和离线获取两种方式

12810

Redis系统学习之三种特殊数据类型(geospatial(地理位置))

添加地理位置 geoadd key 经度 纬度 城市名称[多个添加,经纬度城市名称循环] 两级(南极和北极)无法添加,一般通过程序导入 添加北京位置 ? 添加河北和上海位置 ?...以指定的经纬度为中心,找出某一半径内的元素 GEORADIUS key 维度 经度 半径长度 m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count...WITHDIST: 返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 WITHCOORD: 将位置元素的经度和维度也一并返回。...COUNT 限定返回的记录数。 ASC: 查找结果根据距离从近到远排序。 DESC: 查找结果根据从远到近排序。...搜索经度110 维度30 附近1000km内的位置,或者2000米的位置 可以用于做附近的人,比如附近100m内的玩家XXX,感觉王者是不是这么做的 ?

92820

Redis高级篇之GEO搜索最近地铁口

都知道地球上的地理位置是使用二维的经纬度表示,经度范围(-180,180],纬度范围(-90,90],只要我们确定一个点的经纬度就可以得他地球的位置。...例如滴滴打车,最直观的操作就是实时记录更新各个车的位置,然后当我们要找车时,在数据库中查找距离我们(坐标x0,y0)附近r公里范围内部的车辆使用如下SQL即可:select taxi from position...经纬度是一种常用的地理坐标系统,它使用经度和纬度来表示地球上的位置。GEO数据结构中,经度和纬度被编码为一个64位的整数,以便进行高效的计算和比较。...跳表是一种基于链表的数据结构,它可以实现快速的查找、插入和删除操作。GEO数据结构中,跳表被用于存储地理位置的坐标信息,以便进行高效的搜索和排序。...Redis的GEO数据结构支持多种搜索方式,可以灵活地满足不同的查找需求。实际应用中,我们可以将地铁口的数据存储一个哈希表中,然后将坐标添加到GEO数据结构中。

42632

GeoHash核心原理解析

http://www.cnblogs.com/LBSer/p/3310455.html 引子   机机是个好动又好学的孩子,平日里就喜欢拿着手机地图点点按来查询一些好玩的东西。...B树索引本质上是对索引字段进行排序,然后通过类似二分查找的方法进行快速查找,即它要求索引的字段是可排序的,一般而言,可排序的是一维字段,比如时间、年龄、薪水等等。...随着每次迭代区间[a,b]总在缩小,并越来越逼近39.928167; 4)如果给定的纬度x(39.928167)属于左区间,则记录0,如果属于右区间则记录1,这样随着算法的进行会产生一个序列1011100...[-180,180],可以对经度116.389550进行编码。...为什么分别给经度和维度编码?为什么需要将经纬度两串编码交叉组合成一串编码?本节试图回答这一问题。

1.1K30

Redis源码阅读(一)总体概览

而使用HLL时并不是真正添加到HLL中(这一点和SETS结构差异很大),因为HLL的数据结构只包含一个不包含实际元素的状态。 操作: PFADD:用于添加一个新元素到统计中。...Geo 底层数据类型:zset Redis的GEO特性 Redis3.2版本中推出,这个功能可以将用户给定的地理位置(经度和纬度)信息储存起来,并对这些信息进行操作。...GEODIST命令计算距离时会假设地球为完美的球形。极限情况下,这一假设最大会造成0.5%的误差。...简单来说,GeoHash将一个空间分割成一个个小方块,我们可以通过查询给定经纬度所在方格周围的4个或者8个方格,以此进行“周边查找”。...如果数据量过亿,就需要对 Geo 数据进行拆分,国家/省/市拆分,甚至区拆分,以降低单个 zset 集合的大小。

68830

Redis GEO地理位置

Redis GEO实现主要包含了以下两技术: 使用geohash保存地理位置的坐标。 使用有序集合(zset)保存地理位置的集合。...GEOADD 命令以标准的 x,y 格式接受参数, 所以用户必须先输入经度, 然后再输入纬度。 GEOADD 能够记录的坐标是有限的: 非常接近两极的区域是无法被索引的。...从键里面返回所有给定位置元素的位置(经度和纬度)。 GEOPOS 命令返回一个数组, 数组中的每个都由两个元素组成: 第一个元素为给定位置元素的经度, 而第二个元素则为给定位置元素的纬度。...GEODIST 命令计算距离时会假设地球为完美的球形, 极限情况下, 这一假设最大会造成 0.5% 的误差。...GEOHASH 命令返回一个数组, 数组的每个都是一个 geohash 。 命令返回的 geohash 的位置与用户给定的位置元素的位置一一对应。

1.7K40

空间索引 - GeoHash算法及其实现优化

假想一个与地轴方向一致的圆柱切或割于地球,等角条件,将经纬网投影到圆柱面上,将圆柱面展为平面后,即得本投影。墨卡托投影切圆柱投影与割圆柱投影中,最早也是最常用的是切圆柱投影。...如(116.276349, 40.040875)这个点的经度划分: 经度 [-180,0) 范围内的标识为0,经度范围在 [0, 180) 度的标识为 1; 继续划分,经度范围在 [0,90) 的标识为...如果每个方格的精度为 2km,那么我们直接按照前缀查询红点附近 2km 的点是查找不到离它很近的黑点的。...Redis的GEO函数 问题 我们常见的需求是查找 n米 范围内的点,那么 n米 与 GeoHash 码位数之间的映射如何实现呢?...我们划分地图时,每多划分一次,会添加经度和纬度两个二进制位,精度最高时,那么每一个方格的最大值和最小值之间差1。由此,我们通过下面的方法获取到一个方格的最大和最小 score 值之差。

1.9K90

是什么能让 APP 快速精准定位到我们的位置?

那么,这些APP是怎么做到,既能精准定位,又能快速查找呢?答案就是 geohash geohash通过算法将1个定位的经度和纬度2个数值,转换成1个hash字符串。...然后通过数据库中like操作符 “ like wtw366%” 快速查找到附近的车。...地球铺平面图 以赤道和本初子午线为界,将地球分为经度和纬度。赤道是0度,本初子午线也0度。以赤道作为经度X横坐标,以本初子午线作为纬度 Y 竖坐标。...比如上海腾讯大厦的定位就是:(31.1688749, 121.3975184)表示的是:纬度=31.1688749,经度=121.3975184 上海腾讯大厦经纬度图 geohash原理解析 了解什么是经纬度之后...那我们还是用腾讯大厦的geohash值,分别截取经度为前7,6,5位看看,地图上是怎么样的: 精度为7,153m范围内 精度为6,1.22km范围内 精度为5, 4.89km范围内 所以,根据上面的图

1.5K30
领券