首页 > 解决方案 > 使用 knex 从邮政编码中获取最近的地标

问题描述

我正在开发一个应用程序,该应用程序使用 knex 并利用一种算法,该算法从列表中返回 sql 表中最近的地标。

const getClosest = async (postcode) => {
  const latLng = await getLatLngFromPostcode(postcode)

  const landmark = await knex('landmarks')
    .select(
      knex.raw(
        `title, address, postcode,
        (
          6371 * acos (
            cos ( radians(:lat:) )
            * cos( radians( ST_X(coordinate) ) )
            * cos( radians( ST_Y(coordinate) ) - radians(:lng:) )
            + sin ( radians(:lat:) )
            * sin( radians( ST_X(coordinate) ) )
          )
        ) AS distance`, latLng,
      ),
    )
    .orderBy('distance')
    .first()

  delete landmark.distance

  return landmark
}

^ 这将返回最近的地标。

如果我删除 .first() - 它会按顺序返回列表 - 但删除 landmark.distance 不会保留,并且此属性也生成为 null?

我发现这个算法有一个更长的版本,它是一个非 knex 版本,它可以让您更好地控制查询以返回基于距离<=特定英里的结果?

如何使用纬度和经度计算距离?

您将如何重新编写 knex 代码以使用此原始 sql 命令?

SELECT ROUND(6371 * acos(cos(radians('lat')) * cos(radians(latitude)) * cos(radians(longitude) - radians('long')) + sin(radians('lat')) * sin(radians(latitude)))) as distance,latitude,longitude, from your_table HAVING distance<=20  order by distance

我还应该对此查询设置限制以仅返回前 10 个结果吗?

标签: sqlknex.js

解决方案


推荐阅读