提问人:TrySoHard 提问时间:11/17/2023 最后编辑:vatbubTrySoHard 更新时间:11/18/2023 访问量:61
使用纬度和对数度创建表示区域的网格?
Use latitude and logitude to create a grid representing zones?
问:
我正在开发一个交通应用程序的模块。
我的老板给了我这个任务:我们有一个类,叫做 ,其中有一个属性,叫做 ,它存储了公民位置的纬度和经度。CitizenRequest
PointPath
此数据存储在 MongoDB 数据库的 JSON 文件中。
我所要做的是:获取这个 JSON,找到最小值(或者最小纬度和经度),最大值,然后用它来定位一个正方形,它将代表我们的运输区域。PointPath
现在,我必须将这个方块分成其他迷你方块,每个方块都将成为“区域”。然后,此区域将具有一个 ID,并且必须存储到另一个集合中。
此集合的目的应该是存储我们对每个区域的请求数。因此,例如,我们将看到在 ID=149 的区域中,我们有 X 个请求。
为此,我应该创建一个算法来分析纬度和经度,以了解它落在哪个区域。
我知道这听起来可能很困难。不过,我完全不知道如何实现这一点。所以我问你是否有解决方案或想法。我真的不认为我必须使用 API 来做到这一点,我认为它只需要一些逻辑。有什么帮助吗?
答:
改写一下,所以我理解正确。 你有一个大方块,它是你的有效区域(交通区域),在这个方块中,你有一个网格,你试图在其中查看最多的请求来自哪里。
第一个 lattitude 和 longlitude 值看起来令人困惑,一开始什么也没说:10,000001 20,002567。 改变它,让它成为人类可读的。
如果我不正确,你需要开始并找到你的点 0。
如果你把你的有效面积想象成一个正方形,它将是左下角的最点。如果是 5.0002345、10.124567,则将所有其他值减去该值。5.0003345 10.124567 => 0.0001, 0 所以比你的起点高一点。
现在,您可以更轻松地找到有效区域中的所有请求。您将获取所有点并将它们绘制在一个简单的 x/y 图中。好吧,我不知道您的开发设置的实现。
我会推荐一个简单的 KNN algorhytmus 来集群请求。Maybee 情节本身就足够了。
评论
假设文档包含如下点:
{"citizenID:"C2", loc: { type: "Point", coordinates: [ -76.738988, 39.960921 ] }}
然后,像这样的东西将捕获边界矩形内正方形中的位置:
// First, scan the whole collection to get topleft and bottomright max points:
c=db.foo.aggregate([
{$group: {_id:null,
L: {$min: {$first: '$loc.coordinates'}},
R: {$max: {$first: '$loc.coordinates'}},
T: {$max: {$last: '$loc.coordinates'}},
B: {$min: {$last: '$loc.coordinates'}}
}}
]);
d = c.next();
var leftLon = d['L'];
var topLat = d['T'];
var rightLon = d['R'];
var bottomLat = d['B'];
var incr = 0.01; // this is size of square. 0.01 is 1km.
var totSqr = 0;
// Left to right, top to bottom:
for(var lon = leftLon; lon < rightLon; lon += incr) {
for(var lat = topLat; lat > bottomLat; lat -= incr) {
// Make a square:
var coords = [];
coords.push( [ lon, lat ] );
coords.push( [ lon+incr, lat ] );
coords.push( [ lon+incr, lat-incr ] );
coords.push( [ lon, lat-incr ] );
coords.push( [ lon, lat ] ); // must close loop!
c = db.foo.aggregate([
{$match: { "loc": { $geoWithin: { $geometry:
{ type: "Polygon", coordinates: [ coords ] } }}
}}
,{$group: {_id:null, n: {$sum:1}}}
]);
d = c.next();
if(d != null) {
print("square region " + lon + "," + lat + ": found " + d['n']);
// optionally insert the data somewhere as the OP notes. You can
// create the zone ID with an incrementing number e.g.
// db.results.insertOne({"zone": "Z"+(zid++), n: d['n']});
}
totSqr++;
}
}
评论
PointPath