Sequelize 中如何使用 GeoHash 实现地理位置数据的搜索

阅读时长 7 分钟读完

随着LBS(基于位置的服务) 的不断发展,越来越多的应用开始使用地理位置数据。当我们需要对地理位置做搜索时,可以使用 GeoHash 算法进行处理。本文将介绍如何在 Sequelize 中使用 GeoHash 实现地理位置数据的搜索。

什么是 GeoHash

GeoHash 是一种居家地理位置信息的编码方式,它可以将一个经纬度位置编码为一个字符串,可以用于快速索引和查询位置数据信息。利用 GeoHash 可以将储存位置信息(经纬度)的二维平面,转化为储存字符集的一维平面,方便对该平面进行搜索。

如何计算 GeoHash 值

GeoHash 算法将二维经纬度转换为一维哈希值,计算公式如下:

其中,precision 决定了生成的哈希值的精度。一般来说,精度越高,生成的哈希值位数越多,表示的范围就越小。

计算时需要转换为二进制再合并位:

  1. 将纬度值从 -90<del>90 转换为 0</del>180,再转化为二进制
  2. 将经度值从 -180<del>180 转换为 0</del>360,再转化为二进制
  3. 将二进制转化为字符串
  4. 从字符串取出奇数位和偶数位分别组合成两个二进制数
  5. 用 Base32 表示法将二进制数转化为对应字符
  6. 将两个字符组合成一个字符串,得到最终的哈希值

在 Sequelize 中实现 GeoHash 搜索

在 Sequelize 中使用 GeoHash 可以实现对地理位置数据的搜索。使用 GeoHash 实现搜索,需要进行以下几个步骤:

1. 定义模型

定义模型时,需要将经纬度作为属性添加到模型中:

-- -------------------- ---- -------
----- - ------ --------- - - ---------------------
----- --------- - -----------------------

----- -------- ------- ----- --
---------------
  --------- -
    ----- -----------------
  --
  ---------- -
    ----- -----------------
  --
-- - ---------- ---------- ---------- ---

-------------- - ---------

2. 添加 GeoHash 属性

添加一个新的属性 geohash,用于存储计算后的 GeoHash 值:

-- -------------------- ---- -------
----- --------- - ---------------------
----- --------- - -----------------------

----- -------- - ----------------------

----- ----------- - -------------------------------- -
  -------- -
    ----- -----------------
    ---------- ------
  --
---

--------------------------------

-------------- - ------------

3. 添加 GeoHash 索引

使用 Sequelize.Deferrable.INITIALLY_IMMEDIATE 标识索引的级别,这样可以确保在插入数据时,GeoHash 值会被立即计算出来:

-- -------------------- ---- -------
----- --------- - ---------------------
----- --------- - -----------------------

----- -------- - ----------------------

----- ----------- - -------------------------------- -
  -------- -
    ----- -----------------
    ---------- ------
  --
-- -
  -------- -
    -
      ------- ------
      ------- ------------
      ----- -----------------------
      ------ -------
      --------- -------
      ----------- -----------------------------------------
    --
  --
---

--------------------------------

-------------- - ------------

4. 查询 GeoHash

可以使用 Op.startsWith 查询符合指定前缀的 GeoHash:

-- -------------------- ---- -------
----- --------- - ---------------------
----- --------- - -----------------------
----- - -- - - ----------

----- -------- - ----------------------
----- ----------- - --------------------------

----- --------------- - ----- --------------- -- -
  ----- --------- - ----- ------------------
    ----------- ------------ -------------
    -------- -
      ------ ------------
      ----------- ---
      ------ -
        -------- -
          ---------------- --------------
        --
      --
    --
  ---

  ------ ----------
--

示例代码

完整的代码实现如下所示:

-- -------------------- ---- -------
----- --------- - ---------------------
----- --------- - -----------------------
----- - -- - - ----------

----- -------- - ----------------------
----- ----------- - --------------------------

----- --------------- - ----- --------------- -- -
  ----- --------- - ----- ------------------
    ----------- ------------ -------------
    -------- -
      ------ ------------
      ----------- ---
      ------ -
        -------- -
          ---------------- --------------
        --
      --
    --
  ---

  ------ ----------
--

----- -------- ------ -
  ----- -----------------

  ----- ----------------- --------- ------ ---------- ------ ---
  ----- ----------------- --------- ------ ---------- ------ ---

  ----- --------- - ----- ----------------------
  -----------------------
-

-------

总结

本文介绍了使用 Sequelize 实现 GeoHash 搜索的方法,包括计算 GeoHash 值、定义模型、添加 GeoHash 属性及索引、查询 GeoHash 等。

GeoHash 可以方便、快速地对地理位置数据进行搜索,能够显著提高查询效率,提升应用的性能。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64eda0d1f6b2d6eab37c79b6

纠错
反馈