| 基于MongoDB的遥感影像存取方案的探讨与实现 |
2. 四川省第二测绘地理信息工程院,四川 成都, 610199
2. The Second Academy of Surveying and Mapping Geographic Information Engineering of Sichuan Province, Chengdu 610199, China
目前,遥感影像的存储与管理主要采用数据库技术进行,关系型数据库如ORACLE、SQL Server等采用关系系统来组织数据,关系系统实质就是二维表格系统,关系型数据库是由二维表及其之间的相互关系组成的一个数据组织,关系型数据库易于理解,具有灵活性,可伸缩性好,但关系型数据库对海量数据的读写效率相对较低,因为针对包含海量数据的表的查询效率比较低,表与表之间也有着复杂联系,因此关系型数据库对海量遥感影像数据存取效率不高。本文尝试用非关系型数据库存取遥感影像,非关系型数据库没有Schema约束,可以将原数据存储起来,这对于数据管理非常有益。
1 数据存取方法及比较 1.1 非关系型数据库MongoDB简介MongoDB[1]是非关系型数据库的典型代表。MongoDB是开源的,模式自由,不需要额外缓存,支持丰富的数据类型、丰富的查询,并且可扩展。MongoDB基于文档[2](documents) 存储,文档的集合 (collection) 之间没有关系型数据库那样的关联关系,所以MongoDB存储比较独立。MongoDB开源使得用户可以灵活地按照自己的需求进行数据库的相关开发,一旦发现bug,可以从数据库本身找到问题所在并改进,传统关系型数据库如ORACLE等一旦发现bug或者某些不完善的地方,需要投入很多的人力、物力和财力去修改和维护,MongoDB在开发维护方面比较灵活。MongoDB有两种方式存储文件,当文件大小在4 MB以下时,直接把文件存入文档对象即可;当存储文件超过4 MB时,采用GridFS[3]方式来存储。由于遥感影像类型众多,尺寸各异,宜采用GridFS方式来存储。
1.2 GridFS存储数据原理MongoDB内置GridFS[3], GridFS是将文件分块后存储到files.file和files.chunk两个collection中,存储时可以根据需要增加新的collection, 用来存储更多的影像信息。实际上GridFS自身也是一个collection,可以直接对文件的属性进行定义和管理,通过这些属性就可以快速找到所需的文件,方便管理海量文件。
GridFS方式存储文件时默认将文件分为两个集合存储[1],即fs.files集合和fs.chunks集合,fs.files集合存储文件元数据信息,记录了文件名、文件类型、创建时间、文件长度、加密信息等;fs.chunks是存储实际文件数据的二进制块,默认分块大小为256 kB,GridFS自动将大数据分块存储,并且存储效率很高,这也是GridFS能存储大数据的原因。而关系型数据库一般不会直接存储影像数据本身,通常存储索引和记录,如果非要存储数据本身,通常是将影像数据转换为二进制流,以二进制流的形式存储,但是这样效率会很低。GridFS存储数据分成很多小的chunks来存储[3],如图 1所示。
![]() |
| 图 1 GridFS存储模式 Figure 1 GridFS Storage Mode |
1.3 MongoDB与关系型数据库比较
MongoDB和关系型数据库有本质差异,存储数据原理不同。MongoDB是无架构文档数据库[2],MongoDB可以有多个collection,每个collection都是documents的集合,collection和document与传统数据库的table和row并不对等;MongoDB无需预先定义collection,随时可以创建并使用,collection中可以包含不同schema的文档记录,这样在同一个collection中,上一条记录中的文档有x个属性,下一条记录的文档就可以有y个属性,属性的类型可以是基本的数据类型 (如数字、字符串、日期等),也可以是数组或者散列,甚至还可以是一个子文档,从而实现了逆规范化的数据模型,提高了查询效率。关系型数据库以行和列的形式存储数据,一系列的行和列被称为表,一组表组成了数据库,一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。
从图 2可以看出,MongoDB和关系型数据库差异明显。结合以上讨论,用MongoDB进行数据的存取要结合MongoDB本身的结构特点和特定数据的数据模型进行综合考虑。
![]() |
| 图 2 MongoDB与关系型数据库架构比较 Figure 2 Comparison Between MongoDB and Relational Database Schema |
1.4 基于MongoDB的遥感影像存取方法
针对MongoDB的自身特点及存储方式,结合特定影像的数据模型特点,可以设计特定的数据模型将影像存储到MongoDB中,相继完成数据检索、数据删除、数据更新、数据输出等影像数据管理操作。
数据存储:MongoDB存储影像数据不区分数据类型,支持任何类型数据的存储。存储时,可以存储影像数据的名称、大小、坐标等信息,也可以把影像数据本身存储到MongoDB中;影像和影像信息是分开存储的,影像数据用GridFS方式上传到MongoDB数据库, 由于GridFS本身就有files.file和files.chunk两个collection,因此存储影像本身不需要创建新的collection即可以完成存储,而存储影像信息需要创建新的collection,把一类影像信息写到单独的类中,需要时可以直接调用,从而创建新的collection会比较方便。例如要存储影像的地区信息或相机信息,可以增加新的collection实现相关属性信息的存储,影像本身的collection和影像信息的collection通过collection中的相同键值来关联,这类似于关系型数据库表与表之间用主键和外键进行关联。
数据查询检索:数据查询可以按影像名称检索,按名称实质就是检索数据库存放影像的collection,找到相应的数据;MongoDB本身支持地理空间查询,用数据的地理坐标结合MongoDB的地理空间查询来实现坐标查询。
数据更新:数据更新可以增加某些字段,可以添加某些数据,也可以修改某个数据或者属性信息,甚至增加整个collection,更新包括增加和删除数据。
从以上讨论可知,collection的创建和操作是关键,需要进一步说明collection,如图 3所示。
![]() |
| 图 3 MongoDB的collection与关系型数据库的表的比较 Figure 3 Comparison Between MongoDB Collection and Relational Database Tables |
关系型数据库对影像的存储要创建若干表,而且表之间有着联系和约束,MongoDB只需创建很少的collection,从而减少了数据冗余,一类数据可以合并为同一个collection,这样不仅容易存放,而且提高了数据读写效率。另外,数据检索也无需考虑表之间的约束和关联,检索效率更高。
2 存取管理的实现 2.1 系统设计在MongoDB影像存取方法讨论的基础上,设计的基于MongoDB的影像存取系统的基本功能如下:实现影像存储到数据库,即“存”;实现对存储到数据库中的数据按地理坐标或名称检索,并把影像保存到指定的位置或直接使用影像,即实现“查”和“取”。
2.1.1 自动建库C#连接MongoDB数据库进行操作[4],需要MongoDB的C#驱动程序[5],本文驱动版本为CSharpDriver1.7.0.4714。默认连接的服务器为127.0.0.1,端口为27017,服务器可以根据实际进行修改。
自动建库时,用户只需输入数据库的名称,就可以自动创建需要的数据库。
2.1.2 数据存储遥感影像属性信息,如影像的外方位元素信息、地区信息、摄影相机信息等,需要和影像一起存储到数据库中[6],并需要进行影像和对应属性之间的关联,MongoDB中没有关系数据库那样的表格,MongoDB中collecions数据集可以看作关系型数据库的“表格”,针对不同影像数据需要设计对应的collection来存储影像信息[7],不同的collection之间通过指定的键关联。主要代码如下:
string[] ss=openFileDialog.FileNames;
gridfs.Upload (localUploadFileName, mongoDBFileName)
MongoCollection colaa=db.GetCollection (“col1”); //col1为创建的collection名称
List<natBack>mALL=myMongo.GetAll<natBack>(“col1”);
public sealed class natBack
{
public ObjectId _id{get; set; }
public string filename{get; set; }
public List<double>loc{get; set; }
public double Z{get; set; }
public double Omiga{get; set; }
public double Phi{get; set; }
public double Kappa{get; set; }
public Date Time uploadDate{get; set; }
}
其中,natBack是设计的影像的collection (集合)[8],包含id、filename、外方位元素和存储时间等信息;类似地,对特定影像设计相应的collection来存储影像信息,封装成类以便于调用。另外,存储引入了多线程,可以有效提高存储效率。
查询MongoDB数据库信息时用浏览数据库功能,可以方便查看数据库的存储情况。
MongoDB存储大文件是分块存储的,通常按默认分块大小256 kB进行自动分块,为了改善存储效率,可以修改默认分块的大小,如把分块大小改为15 MB,这样存储大数据时可以提升效率。
对数据库中数据删除结合listBox和button控件来实现,可批量删除或单个删除。
此时,遥感影像数据已经转换为MongoDB的自动切片文件来存储。
2.1.3 数据的查询检索可以按文件名称检索或按地理坐标查找。按名称查询数据实现了自动匹配要查询的数据文件名,即模糊查找。
地理坐标查找影像要用到地理信息索引[1],默认索引经度/纬度的范围是[-180°, 180°],实际应用会超出此范围,为此,创建索引时改变范围。
BsonDocument mKey=new BsonDocument ();
mKey[keyName]=“2d”;
min=-9999999;
max=9999999;
var GeoOption=new GeoNearArgs ();
GeoOption.MaxDistance=max;
GeoOption.Near=new XYPoint (d3, d6);
GeoOption.Limit=n;
BsonElement be=mGeoNearAs.GetElement (0);
var mongoFileName=str;
var localFileName=textBox.Text;
gridfs.Download (localFileName, str);
其中,(d3,d6) 是给定的实际地理坐标;max是以坐标点为圆心的最大圆的半径;n是查询到的影像个数。
2.1.4 数据的输出数据输出有两种方式,一种是下载到本地,一种是通过内存流,根据实际情况选择输出方式。
影像数据查询输出如图 4所示。
![]() |
| 图 4 数据查询及输出 Figure 4 Data Query and Output |
3 实验与应用 3.1 实验环境
测试计算机配置如下:CPU:Intel (R) Core (TM) 2 Duo,@2.66 GHz,内存2 GB,硬盘320 GB SATA-Ⅱ 5400 BRP,操作系统:Windows 7 Ultimate X64,本地文件系统:NTFS,语言及数据库:C#、MongoDB 2.6.3、Oracle 11g、SQL Server 2008;开发环境:Visual Studio 2010。
实验数据如下:若干平均大小为200 kB的街景系统文件,格式为.jpg; 若干SWDC-5数字航空倾斜摄影仪拍摄影像,平均大小为160 MB,格式为.tif。
3.2 实验过程 3.2.1 不同数据库存储效率实验分别开发Oracle 11g和SQL Server 2008的影像存储简易系统,SQL Server 2008系统的存储原理是将影像进行二进制转换后存储到IMAGE数据类型的字段中,从而存储影像本身;Oracle 11g系统存储原理与SQL Server 2008类似,通过将影像序列化成二进制流后以blob类型存入数据库,从而存储影像本身。
分别用这3种影像存储系统进行数据存储,分别记录数据开始存储和结束存储的时刻,算出存储所用时间;不同数据库存储相同数据的效率明显不同,如图 5所示。
![]() |
| 图 5 不同数据库存储数据耗时比较 Figure 5 Time Comparison of Different Database Storage Data |
从图 5可见,MongoDB存储相同的实验数据明显省时,Oracle和SQL Server存储时间相差不多,随着存储数据量的增多,MongoDB存储数据耗时变化不大,Oracle和SQL Server的耗时随数据量的增多有较大波动。
3.2.2 不同线程存储效率实验在存储SWDC-5数字航空摄像仪的影像或者存储海量小影像时,效率有待提高,为此引入了多线程,在MongoDB影像存取设计部分已给出多线程实现的说明,这里不再详述。
不同路程下存储耗时如图 6所示,可见,多线程能明显缩短存储所用的时间,存储的数据越多,多线程的存储优势越明显,在性能较好的平台下,可以更充分地发挥多线程的优势,有效提高效率。
![]() |
| 图 6 不同线程下存储耗时比较 Figure 6 Storage Time Comparison of Different Threads |
4 结束语
关系数据库对包含海量数据的众多表查询效率不高,而且关系型数据库众多表之间也有着复杂的联系,因此关系数据库对海量数据的读写效率普遍不高,本文讨论了基于MongoDB的遥感数据存储的方法,设计了MongoDB数据系统进行数据存取等的实现,该系统可单独进行数据的存取等操作,也可以集成到别的系统中作为数据管理部分。相比传统关系数据库,既节省开支,也可以省去复杂的部署过程,还可以消除关系型数据库的一些存取效率的弊端,从而使基于MongoDB的存取方案可行。该影像存取方案的讨论和实现还存在不少问题,需要改进的地方也很多,但作为一种遥感影像存取方法的尝试,基本满足了任意存取、任意删除的影像存储要求,以很小的代价对海量遥感影像数据进行存储与管理。
| [1] |
Chodorow K, Dirolf M. MongoDB权威指南[M]. 程显峰. 北京: 人民邮电出版社, 2011 |
| [2] | 周怀许, 周俊晖, 侯祥意. 利用MongoDB的地籍时空数据库研究[J]. 测绘地理信息, 2013, 38(6): 73–75 |
| [3] | 郭武士. 基于MongoDB GridFS的图片存储方案的实现[J]. 四川工程职业技术学院学报, 2011, 4(3): 39–41 |
| [4] | 钱哨, 李挥剑, 李继哲. C# WinForm实践开发教程[M]. 北京: 中国水利水电出版社, 2010 |
| [5] | 黄胜忠. C#4.0从入门到精通[M]. 北京: 机械工业出版社, 2011 |
| [6] | 张恩, 刘广弟, 兰磊. 基于MongoDB的海量空间数据存储和并行[J]. 地理空间信息, 2014, 12(1): 46–48 |
| [7] | 雷德龙, 郭殿升, 陈崇成, 等. 基于MongoDB的矢量空间数据云存储与处理系统[J]. 地球信息科学学报, 2014, 16(4): 507–516 |
| [8] | 张天宇, 贺金鑫, 王阳, 等. 基于NoSQL数据库的地学大数据高效存储方法[J]. 吉林大学学报 (信息科学版), 2013, 31(6): 604–608 |
2017, Vol. 42







