我的数据库中有一组网格,每个网格由四个点组成,每个点的坐标为(x,y),而每个网格可以通过其行和列来定位。
为了避免数据库中点的冗余,我只保存底部左侧点的坐标,如下所示:
现在对于具有坐标(x1,y1)的给定点,我必须找到该点所在的网格,也就是说找到一个网格说它是g
g.left <= x1 <= g.right && g.bottom <=y1 <= g.top
由于网格是连续的(不包括边缘处的网格),因此问题变为:
g.left <= x1 <= top_right_grid.left && g.bottom <= y1 <= top_right_grid.bottom
top_right_grid
必须满足此要求:
top_right_grid.col - g.col = 1, and top_right_grid.row - g.row = 1
所以我用它来查找结果:
SELECT g.*, top_right_grid.left,top_right_grid.bottom
FROM gis_grid g,gis_grid gd1
WHERE top_right_grid.row - g.row =1 AND
top_right_grid.col - g.col =1 AND
g.left <=x1 AND
top_right_grid.left >= x1 AND
g.bottom/1e8 <= y1 AND
top_right_grid.bottom/1e8 >= y1;
但是我现在遇到问题,对于p1
点,我会得到一个正确的网格,但对于点p3
,应该有两个网格符合要求,但我只得到了一。对于点p2
,我无法得到结果,因为数据库中不存在top_right_grid
。
所以我想知道是否有更好的想法来建模这类数据,或者尽可能快地进行查询?