在MapGuide中,资源(Resource)用来绘制图层和地图所需的文件和配置信息。MapGuide中有许多类型的资源。例如:要素源(FeatureSource)用来描述需要访问的空间数据的位置、类型和其它一些信息。图层定义(Layer Definition)用来定义一个图层的数据和样式(Style)。
在MapGuide中,资源服务(Resource Service)是用来管理资源和资源库的一种服务(Service)。MapGuide资源服务API是MapGuide Web API的重要组成部分,它提供了一些方法来遍历、添加、修改、删除存储在资源库中的资源和资源数据。
1. 资源库(Resource Repository)
在MapGuide中,资源资源是设计来共享和重用的。所以,所有的资源都存储在资源库(Resource Repository)中。那么,什么是资源库呢?资源库是一个基于Oracle Berkeley DB XML的XML数据库,用于管理层次结构的资源。
资源库中包含两种类型的节点:资源文件夹节点和资源文档节点。资源文件夹代表一个可以包含资源文档和其它资源文件夹的容器,资源文档用来存储一个文档。每种类型的资源节点都有一个唯一的ID、名称、路径和相关的访问权限,我们可以通过资源的ID或路径加文件名访问任意一个资源节点。用户对每个资源节点的访问权限是由它的访问权限决定的,子节点总是继承父节点的访问权限,子节点可以通过覆盖父节点访问权限改变对自己的访问权限。
1.1 Oracle Berkeley DB XML
MapGuide使用了Oracle Berkeley DB XML数据库,下面让我们来稍微了解一下它的功能。Oracle Berkeley DB XML 是一个可嵌入的开源 XML 数据库,可基于 XQuery 访问存储在容器中的文档,并对其内容进行索引。Oracle Berkeley DB XML 构建于 Oracle Berkeley DB 之上,并继承了其丰富的特性和属性。与 Oracle Berkeley DB 一样,它通过应用程序运行,无需人为管理。Oracle Berkeley DB XML 在 Oracle Berkeley DB 之上新增了文档分析器、XML 索引器以及 XQuery 引擎,实现了最快速、最高效的数据检索。
由于以 Berkeley DB 作为底层存储引擎,因此 Berkeley DB XML 继承了完整的 ACID 事务处理、自动恢复、热备份、用于分布式事务的 XA、通过 AES 进行磁盘数据加密以及针对高可用性的复制。此外,Berkeley DB XML 中还可存储 XML 和非 XML 数据,这将有利于某些应用程序的运行。
Berkeley DB XML 在 Berkeley DB 之上新增了文档分析器、XML 索引器以及 XQuery 引擎。XQuery 正快速成为访问 XML 数据的首选查询语言。Berkeley DB XML 支持 XQuery 1.0 和 XPath 2.0、XML 命名空间、模式验证、命名和跨容器操作以及文档流。XQuery 引擎使用完善的、基于成本的查询优化器,并支持带有嵌入式变量的预编译查询执行。在存储大型文档时,可将其保持原样,或分解为节点,从而实现更为高效的检索和部分文档更新。Berkeley DB XML 支持对 XML 节点、元素、属性以及元数据进行灵活索引,以实现最快速、高效的数据检索。
Berkeley DB XML 为需要存储和检索 XML 和非 XML 数据的应用程序提供快速、可靠以及可伸缩的持久性。
1.2 资源库的类型
MapGuide有三类型的资源库:
- Library:用于存储持久化的数据。存储在Library资源库中的资源,对所有用户都是可用的。
- Session:每个会话(Session)都有专属于自己的一个资源库,它用来存储在运行时地图的状态信息。当然,它可以存储其它类型的数据。例如:你可以创建一个基于会话的临时图层,将它覆盖到当前地图,以指出你感兴趣的某个区域。与Libaray资源库不同,存储在Session资源库中的所有资源会在会话结束的时候销毁。
- Site:用于存储用户、组、角色等信息。
MapGuide使用类MgRepositoryType定义MapGuide所支持的资源库类型。但是,MgRepositoryType只定义了Library和Session两种资源。
static const STRING Library
static const STRING Session
这意味着,如果使用MapGuide Web API,那么用户只能直接访问这两种资源库。
1.3 备份和恢复资源库
默认情况下,当安装完成MapGuide Server之后,你可以在如下目录找到资源库。 当此节后文中提到“xxx”目录时,就是指MapGuide Server安装目录下的“xxx”目录。
MapGuide企业版:
- Windows平台:C:/Program Files/MapGuide20xx/Server/Repositories。
- Linux平台:/usr/local/mapguide20xx/server/Repositories
MapGuide开源版:
- Windows平台:C:/Program Files/MapGuideOpenSource/Server/Repositories
- Linux平台:/usr/local/mapguideopensource/server/Repositories
MapGuide提供了一个PHP脚本“RepositoryAdmin.php”可以帮助用户备份和恢复资源库,你可以在“RepositoryAdmin”目录下找到这个文件。它的语法如下所示:
php RespositoryAdmin.php [-c {Backup|Restore}] [-I {0 - 10}] [-I “/input/path”] [-o “/output/path”]
参数 | 值 |
-c | 操作名称。 Backup:用于备份资源库。 Restore:用于恢复资源库。如果在指定的输出目录下已经存在一些文件,这些文件会被移到一个以时间命名的子目录下。 |
-I | 增量级别。它是一个0~10的整数值,只能用于备份操作。 0:离线备份,也称之为冷备份。它总是创建一个完整的快照(Snapshot)。 >0:在线备份,也称之为热备份。例如,设置增量级别为2, Ø 如果上一次快照中活动日志文件的数量小于等于2,那么做一次增量快照。 Ø 如果上一次快照中活动日志文件的数量大于2,那么做一次完整快照。 注:活动日志文件(Active Log Files)是指那些包含数据,却没有被保存到数据库中的文件。默认情况下,日志文件的大小为10MB。 |
-i | 用于备份或恢复的资源库的绝对源路径。 |
-o | 用于备份或恢复的资源库的绝对目标路径。对于离线备份,资源库被归档到一个时间命名的子目录下。对于在线备份,在创建完整快照的时候,资源库被归档到“CurrentHotBackup”;在创建增量快照的时候,被归档到一个时间命名的子目录下。 |
因为资源库是基于Oracle Berkeley数据库的,而Oracle Berkeley数据库使用了预写式日志(Write-ahead-logging)来确保数据的可恢复性。所以,任何数据下写入数据库之前,修改信息都会写入日志文件。活动日志文件包含了没有写入数据库的数据。当前,每个日志文件的大小为10M,最多可以有10个日志文件。所以,没有写入数据库的数据最多只能是100MB。
1.3.1 备份资源库
MapGude支持“热”备份和“冷”备份资源库。备份资源库的频率取决于数据更新的频率。
如果要创建一个离线备份,你需要遵循如下的步骤:
- 停止“MapGuide Server”服务,关闭MapGuide Server。
- 在Window平台上的话,执行BackUpOfflineRepositories.ba;在Linux平台上的话,执行BackUpOfflineRepositories.sh。实际上,你也可以通过将“Repositories”目录下的所有文件拷贝到你的备份文件夹来完成此操作。
- 重新启动“MapGuide Server”服务。
如果要创建一个在线备份,你需要遵循如下的步骤:
- 无需关闭MapGuide Server。
- 在Window平台上的话,执行BackUpOnlineRepositories.ba;在Linux平台上的话,执行BackUpOnlineRepositories.sh。
1.3.2 恢复资源库
使用如下的步骤可以从一个备份中恢复资源库:
- 停止“MapGuide Server”服务,关闭MapGuide Server。
- 在Window平台上的话,执行RestoreRepositories.ba;在Linux平台上的话,执行RestoreRepositories.sh。或者,你也可以移走目录“Repositories/Library”、 “Repositories /Site”和“Repositories/Session”下的所有文件,然后拷贝备份目录下的文件到“Repositories”目录也可以完成此操作。
- 重新启动“MapGuide Server”服务。
1.3.3 修复资源库
资源库可能会由于如下的一些原因而损坏:
- 电源故障
- 硬件故障
- 软件故障
- 多个应用程序并行访问资源库
如果MapGuide Server探测到资源库已经损坏,它会抛出一个异常,将适当的错误信息写入日志。你可以通过如下的步骤来修复资源库:
确保资源库没有被其它应用程序所锁定。这也许需要重新启动计算机。
重新启动MapGuide Server,MapGuide Server会自动修复资源库。但是,如果资源库中的某些文件被删除,或者损坏过于严重,修复操作可能会失败。
2. 资源
资源本质上就是一个存储在资源库中的XML文档,它提供了绘制图层和地图所需的文件和配置信息。下图显示了如何将数据源、符号苦、图层资源进行组装,从而绘制出地图。
2.1 资源ID
每个资源都有一个唯一的ID,MgGuide中使用类MgResourceIdentifier代表资源ID。它由如下的几部分内容组成:
- 资源库类型(Repository Type):调用方法MgResourceIdentifier::GetRepositoryType()可以得到资源库类型,它的值只能为“Library”或“Session”。
- 资源库名称(Repository Name):调用方法MgResourceIdentifier::GetRepositoryName()可以得到资源库名称。对于Library资源库,总是返回一个空字符串;对于Session资源库,返回资源所在Session 的ID。
- 路径(Path):指向包含资源的文件夹的路径。调用方法MgResourceIdentifier::GetPath()可以得到资源的路径。
- 名称(Name):不包括扩展名的资源名称。调用方法MgResourceIdentifier::GetName()可以得到资源名称。
资源类型(Resource Type):资源的类型,即资源的扩展名(Extension)。调用方法MgResourceIdentifier::GetResourceType ()可以得到资源类型,它的返回值一定是MgResourceType中预定义的某一资源类型。
例如:下面的资源ID定义了一个存储在Library资源库中、资源类型为要素源(FeatureSource)、资源名称为Parcel的资源。
Library://MySample/Parcel.FeatureSource
下面的资源ID定义了一个存储在Session资源库中、资源类型为地图 (MapDefinition)、资源名称为Parcel的资源。
Session: d43c16ae-fdeb-4ad6-a45d-690ba43dde8d_en//Parcel.MapDefinition
2.2 资源类型
类MgResourceType中定义了资源库支持所有资源类型。
- 制图源(Drawing Source) – MgResourceType::DrawingSource。
- 要素源(Feature Source) – MgResourceType::FeatureSource。
- 文件夹(Folder) – MgResourceType::Folder。
- 图层(Layer Definition) – MgResourceType::LayerDefinition。
- 加载过程(Load Procedure) – MgResourceType::LoadProcedure。
- 地图(Map) – MgResourceType::Map。
- 地图(Map Definition) – MgResourceType::MapDefinition。
- 打印布局(Print Layout) – MgResourceType::WebLayout。
- 选择(Selection) – MgResourceType::Selection。
- 符号库(Symbol Library) – MgResourceType::SymbolLibrary。
- Web布局(Web Layout) – MgResourceType::MapDefinition。
上述的大部分资源类型会在后续的章节中进行详细的讲述。此节我们只解释一下什么是加载过程。
加载过程本质上就是一些用于加载数据的脚本,你可以使用加载过程将数据自动加载到服务器。加载过程中定义了原始数据的位置、转化的规则、数据在服务器上的目标位置等信息。你可周期性地执行加载过程,更新服务器上文件类型的空间数据库,以保证服务器上的数据是最新的。MapGuide Studio提供了创建加载过程的用户界面,你可以在MapGuide Studio中通过将一个或一些文件拖入站点管理器(Site Explorer)创建一个新的加载过程。具体步骤大家可以参考MapGuide Studio的用户手册。
2.3 资源包(Resource Package)
什么是资源包呢?让我们来举个例子解释一下这个概念。当我们要搬家的时候,我们总是会把许多零碎的东西打包,这样更加便于携带和移动。MapGuide也是出于同样的需求,引入资源包的概念。
当使用MapGuide Studio加载数据到MapGuide Site Sever中的资源库时,如果数据量特别大,加载过程(Load Procedure)常常会因为超时而失败。这时,我们可以将这些数据打包成一个文件,使用DVD或者其它大容量存储设备将其拷贝到MapGuide Site Sever,从而加载到资源库。这样,我们就不必担心网络超时的问题了。
资源包文件是一个后缀名称为mpg的文件,但是它实际上是一个压缩的zip文件。所以,你可以使用WinZip或WinRAR等压缩工具打开这个文件。
MapGuide提供了两种方式创建资源包。一种是使用MapGuide Studio,另一种是使用MapGuide站点管理程序(Site Administrator)。如果要加载资源包,只能使用MapGuide站点管理程序。创建和加载资源包的流程如下图所示:
MapGuide Studio提供了API用于创建一个资源包。如果感兴趣的话,大家可以自己查阅MapGuide Studio API参考手册。资源服务提供了一个API方法用于加载一个资源包,下面我们通过一个示例来看看如何使用此函数。在下面的示例中,我们假设已经初始化了资源服务。
$filepath = 'C:DataPackagespackage.mgp';
$byteSource = new MgByteSource($filepath);
$byteReader = $byteSource->GetReader();
$resourceService->ApplyResourcePackage($byteReader);