在mongodb中存储多维地图

时间:2013-07-27 15:57:32

标签: mongodb

我正在创建一款游戏并希望在二维地图中存储位置。这些位置以像素为单位,例如:

{ _id: 1111, map: [
  { x: 850,  y: 2000 },
  { x: 950,  y: 2000 },
  { x: 1050, y: 2000 }
]}

我还想过做点什么:

{ _id: 1111, map: [
  850:  [2000],
  950:  [2000],
  1050: [2000]
]}

像这样的地图最好的数据结构是什么? 0 < x < 20000 < y < 2000

的位置

更多详情:

  • 在获取游戏时,我需要完整的地图,我不需要仅查询地图的子集
  • 我希望地图尽可能小地存储。
  • 地图上可以有超过3000个元素。

5 个答案:

答案 0 :(得分:2)

2000 * 2000仅为4000000。所以......只存储一个整数列表 并使用模数学转换为应用程序中的二维坐标 代码。

所以,对于(row, col) coords(改变y,使其更清晰, 并且省略y==2000因为那是,你知道,不是<2000

(850, 1999)
(950, 1289)
(1050, 380)

你要做(python示例)

>>> COLS = 2000
>>> xy2num = lambda x, y: (x*COLS)+y
>>> num2xy = lambda n: (n // COLS, n % COLS)
>>> points = [(850, 1999), (950, 1289), (1050, 380)]
>>> point_nums = [xy2num(x, y) for x, y in points]
>>> point_nums
[1701999, 1901289, 2100380]
>>> [num2xy(num) for num in point_nums]
[(850, 1999), (950, 1289), (1050, 380)]

考虑这一点的一种方法是作为对每个点的枚举 图:

[(0,0), (0,1), (0,2), <...>, (0,1999),
 (1,0), (1,1), (1,2), <...>,
 (1999,0), (1999,1), <...>, (1999, 1999)]

每个0<=N<4000000整数本质上都是对此的索引查找 列表。

请注意,2D没有什么特别之处 - 可以使用 任意数量的维度(当然,涉及的数字 开始变得非常大)。

阅读更有趣:

http://en.wikipedia.org/wiki/Aleph_number

答案 1 :(得分:2)

如果你关心的只是保持一个简洁的地图,我只会存储一个整数数组,其中一个整数代表一个点。您使用按位数学来导出x,y:

例如)65537 =(位)0000000000000001 0000000000000001 = x = z&gt;&gt; 16,y = z&amp; 0xFFFF =(1,1)

UDPATE:以下是一些请求的示例JavaScript:

function intToPos(i)
{
    var x= i >> 16;
    var y= i&0xFFFF;

    console.log(x+","+y);
}

var positions=[65537,131074,196611];

for (var i=0; i < positions.length; i++)
{
   intToPos(positions[i])
}

更新:posToInt功能:

function posToInt(x,y)
{
    var pos= (x<<16)|y;

    console.log(pos);

    return pos;
}

答案 2 :(得分:1)

尽可能小地存储它可能我只是使用

[x1, y1, x2, y2, ..., xn, yn]

然后您可以使用

轻松地从列表中重新创建Position类实例
positions = map(Position, L[::2], L[1::2])

假设构造函数将xy作为参数

答案 3 :(得分:0)

不清楚,您的地图有多大,但通常地图会有大量数据,因此建议您使用GridF而不是存储在集合中。

答案 4 :(得分:0)

其他工作是两个位置不能指向同一个位置,所以“X + Y”可以成为你的ID和你的搜索0,“位置”:[X,Y]}