gpt4 book ai didi

javascript - 确定两个坐标是否在所需半径内

转载 作者:行者123 更新时间:2023-11-30 21:29:44 24 4
gpt4 key购买 nike

我正在努力将我所在城市的主要大型十字路口与我所在城市的碰撞数据进行汇总。我想要完成的是确定在 20 米半径范围内的十字路口及其周围发生的事故数量。

幸运的是,我已经离项目很远了,我的数据库中有两个表 intersectionscollisions

我的 intersections表:

 --------------------------------------------
| id | city | Latitude | Longitude |
--------------------------------------------
| 1 | 1 | 34.44444 | 84.3434 |
--------------------------------------------
| 2 | 1 | 42.4666667 | 1.4666667 |
--------------------------------------------
| 3 | 1 | 32.534167 | 66.078056 |
--------------------------------------------
| 4 | 1 | 36.948889 | 66.328611 |
--------------------------------------------
| 5 | 1 | 35.088056 | 69.046389 |
--------------------------------------------
| 6 | 1 | 36.083056 | 69.0525 |
--------------------------------------------
| 7 | 1 | 31.015833 | 61.860278 |
--------------------------------------------

我的collisions表:

--------------------------------------------
| id | cause | Latitude | Longitude |
--------------------------------------------
| 1 | 1 | 44.44444 | 81.3434 |
--------------------------------------------
| 2 | 1 | 32.4666667 | 1.4666667 |
--------------------------------------------
| 3 | 1 | 42.534167 | 63.078056 |
--------------------------------------------
| 4 | 1 | 46.948889 | 62.328611 |
--------------------------------------------
| 5 | 1 | 45.088056 | 61.046389 |
--------------------------------------------
| 6 | 1 | 46.083056 | 63.0525 |
--------------------------------------------
| 7 | 1 | 41.015833 | 69.860278 |
--------------------------------------------

注意:为简单起见,省略了一些字段

如你所见,两个表都有latitudelongitude领域。现在要确定 intersectioncollision 坐标是否接近,我想到了使用带有 id 的 MySQL 查询intersection 然后查询 collisions获取交叉路口 20 米范围内所有碰撞的表格。

这个查询是什么(在 MySQL 或 Sequelize 中)?

这是我现在拥有的(它在使用 MySQL 数据库的 Sequelize 中)

// api/collisions/{intersection_id}/count

exports.intersection_accident_count = (req, res) => {
intersection.findOne({where: {equipement: req.params.intersection_id}}).then(intersection => {

let intersectionLongitude = intersection.longitude;
let intersectionLatitude = intersection.latitude;

collision.count({where: {
longitude: {
$gt: intersectionLongitude
},
latitude: {
$gt: intersectionLatitude
},
}}).then(count => {
res.status(200).json({'number_of_accidents': count});
});
});
};

最佳答案

你应该从简单的方式开始:

SELECT
i.*
FROM
intersections AS i
INNER JOIN collisions AS c ON (
ST_Distance_Sphere(POINT(i.Longitude, i.Latitude), POINT(c.Longitude, c.Latitude)) < @dist
)

这应该会给你结果,但是查询根本不会使用任何索引,如果你有很多记录,它会很慢。

您应该考虑在表中添加几何数据类型:

ALTER TABLE `collisions` ADD COLUMN `Location` POINT;
UPDATE `collisions` SET Location = POINT(Longitude, Latitude);
ALTER TABLE `intersections` ADD COLUMN `Location` POINT;
UPDATE `intersections` SET Location = POINT(Longitude, Latitude);

您可以添加触发器,以便在更新经度/纬度时自动填充位置。

然后:

SELECT
i.*
FROM
intersections AS i
INNER JOIN collisions AS c ON (
ST_Distance_Sphere(i.Location, c.Location) < @dist
)

这样会快一点。

如果你想让它更快,你可以添加另一个几何 poligon Area 列到你的交叉表和“预构建”区域(可以是圆形以提高准确性或方形以提高速度).之后你将能够做这样的事情:

SELECT
i.*
FROM
intersections AS i
INNER JOIN collisions AS c ON (
ST_WITHIN(c.Location, i.Area)
)

关于javascript - 确定两个坐标是否在所需半径内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56879830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com