将英里转换为度数以用于 postgis Sequelize

Converting Miles to Degrees for postgis Sequelize

您好,我正在使用 POSTGIS 扩展查询 PostGres 数据库,因为我想在我关注的半径范围内获取用户post,其中以下代码工作正常

Alert.findAll({
  where: Sequelize.where(
    Sequelize.fn('ST_DWithin',
      Sequelize.col('position'),
      Sequelize.fn('ST_SetSRID',
        Sequelize.fn('ST_MakePoint',
          req.query.long, req.query.lat),
        4326),
      0.032),
    true)
})
.then(alerts => res.send(alerts))
.catch(next)

但是我遇到了一个奇怪的问题,半径是以度而不是英里定义的,例如他们说

Sample query to find all within 0.032 deg which is approximately 2 miles.

然后为了自定义半径并根据上述陈述验证我的解决方案,我搜索了很多但找不到任何公式将我的英里转换为半径说我想检查 10 英里的半径。然后我检查了 this 堆栈问题,运行 根据接受的答案中给出的公式进行了一些计算,使用英里作为 2 而不是 100,只是为了确保近似值是否正确但答案是 0.42不是 0.32。例如

const latTraveledMiles = 2;
const latTraveledKM = 2 * 0.621371;
const latTraveledDeg = (1 / 110.54) * latTraveledKM;

const currentLat = 74.0064;
const longTraveledMiles = 2;
const longTraveledKM = 2 * 0.621371;
const longTraveledDeg = (1 / (111.320 * Math.cos(currentLat))) * longTraveledKM;

let degrees = Math.sqrt(Math.pow(latTraveledDeg, 2), Math.pow(longTraveledDeg, 2)); //should be 0.32

为了简化操作,我建议您将几何列 positionST_MakePoint 转换为地理,这样您就可以使用公制输入。您可以在此处阅读更多相关信息 https://www.crunchydata.com/blog/postgis-and-the-geography-type

要向您的 table 添加地理列,您可以使用以下语句

-- first you add the column of type geography
ALTER TABLE your_table ADD COLUMN geog geography(point, 4326);
-- afterwards you populate it from your geometry column which is position
UPDATE your_table SET geog = position::geography;

您现在可以在您的 javascript 逻辑中使用 ST_DWithin(geography gg1, geography gg2, double precision distance_meters);,因此只需将您的半径值替换为 2*1.609344*1000,即 2 英里乘以该系数乘以公里乘以 1000 得到以米为单位的价值。