将英里转换为度数以用于 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
为了简化操作,我建议您将几何列 position
和 ST_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 得到以米为单位的价值。
您好,我正在使用 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
为了简化操作,我建议您将几何列 position
和 ST_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 得到以米为单位的价值。