在各种类型的地理数据库中,文件地理数据库与个人地理数据库最为相似,因为它们都被设计为由单个用户进行编辑且不支持地理数据库版本化。对它们的操作方式也都相同,无论是显示、查询、编辑、处理数据,还是开发应用程序。但是,这两者之间还是存在一些重要的差异。例如,个人地理数据库具有 2 GB 的存储限制,而文件地理数据库则没有存储限制,且结构化查询语言 (SQL) 语法在二者间也稍有不同。如果您习惯于使用个人地理数据库,但想要迁移到文件地理数据库,本主题指出了这些差异并介绍如何着手。
有关文件地理数据库与个人地理数据库及企业级地理数据库之间差异的简介,请参阅地理数据库类型和栅格数据在地理数据库中的存储方式。
创建新文件地理数据库
要创建一个空的新文件地理数据库,在目录树中右键单击某个文件系统文件夹,指向“新建”,然后单击“文件地理数据库”。有关详细信息,请参阅创建文件地理数据库。
迁移现有数据
- 将数据从个人地理数据库复制到文件地理数据库最简单的方法是使用目录树的复制和粘贴命令。复制/粘贴非常灵活,因为您可以精确地选择想要复制的数据。可以选择个人地理数据库中想要迁移的所有数据,或只选择特定的项,例如一组要素数据集。例如,要将个人地理数据库中的某个要素数据集复制到文件地理数据库,先在目录树中创建一个空的新文件地理数据库。在个人地理数据库中选择想要的项,右键单击所选项,单击“复制”,右键单击文件地理数据库并单击“粘贴”。有关详细信息,请参阅将要素数据集、类和表复制到其他地理数据库。
除了任何要素类或表均未引用的属性域之外,复制/粘贴可迁移地理数据库中任何类型的数据。如果想要迁移这类的属性域,可使用下面介绍的“导出到 XML 工作空间文档”方法。
- 要复制整个地理数据库,可使用“导出”>“XML 工作空间文档”命令将整个数据库导出到 XML 文件。然后,可创建一个空的新文件地理数据库,并使用“导入”>“XML 工作空间文档”将数据从 XML 文件导入到此文件地理数据库。这种方法也很灵活,因为您可以在“导出”向导中选择要导出的数据集。有关详细信息,请参阅以下主题:将要素数据集、类和表导出到导出文件以及从 XML 工作空间文档导入要素数据集、类和表。
- 如果要导入低精度地理数据库数据,“复制/粘贴”和“导出到 XML 工作空间文档”方法会自动将数据转换成高精度,将分辨率设置为约等于 0.1 毫米。这是一个很好的默认值,几乎在所有情况下都适用。然而,如果想以其他分辨率存储数据,可在使用“复制/粘贴”或“导出到 XML 工作空间文档”方法之前使用“升级空间参考”工具。“升级空间参考”可将数据转换成高精度,并允许选择分辨率。控制分辨率的另一种方法是使用导入/导出地理处理工具。有关详细信息,请参阅迁移到高精度。
- 要将 shapefile、coverage 或其他格式数据移动到文件地理数据库,可使用与将数据移动到个人地理数据库相同的方法。在目录树中选择所需的数据集,右键单击,然后选择“导出”>“转出至地理数据库(Geodatabase)”命令;使用“转出至地理数据库(Geodatabase)(批量)”命令可一次导出多个数据集。也可在 ArcToolbox 中的“转换”>“转出至地理数据库(Geodatabase)”下找到这些工具。有关详细信息,请参阅以下主题:导入要素、导入表和导入栅格数据集。
文件地理数据库具有可自定义单个数据集存储方式的配置关键字。复制与粘贴或导入数据时,虽然默认值通常是适合的,但也可以指定关键字。有关详细信息,请参阅文件地理数据库的配置关键字。
创建新数据集
在个人地理数据库中创建要素数据集、要素类、栅格目录、栅格数据集和表的方法与在个人地理数据库中的创建方法相同:右键单击地理数据库或要素类,指向“新建”,然后单击想要创建的项。有关详细信息,请参阅以下主题:
创建空要素类或表之后,从目录树将数据加载到其中。有关详细信息,请参阅关于将数据加载到现有要素类和表中以及导入栅格数据集。
与个人地理数据库不同,无论何时创建新的文件地理数据库要素类、栅格目录、栅格数据集或表,也无论是通过目录树还是地理处理工具,都可以指定配置关键字。配置关键字用于定义数据的存储和访问方式。有关可用关键字的描述,请参阅文件地理数据库的配置关键字。
编辑、显示和查询数据
数据集无论是在文件地理数据库中还是个人地理数据库中,它们在 ArcCatalog 和 ArcMap 中看起来都是一样的。同样,除空间索引和 SQL 查询之外(下面会介绍),对数据集的操作方式也相同。所有接受个人地理数据库数据集作为输入的命令和工具同样也接受文件地理数据库数据集。
个人地理数据库要素类的空间索引使用无法修改的单倍格网大小。而文件地理数据库要素类则使用可随时修改的高达三倍的格网大小。ArcGIS 在某些更新操作结束时会自动重新构建空间索引,以确保索引及其格网大小处于最优状态。然而,在极少数情况下,可能需要手动重新计算索引。有关详细信息,请参阅设置空间索引。
查询文件地理数据库所使用的 SQL WHERE 子句语法与查询 coverage、shapefile 及其他基于文件的数据源的语法相同,但增加了一些功能,例如支持子查询。因此,WHERE 子句语法是有别于个人地数据库的。ArcGIS 中用于创建 SQL 表达式的对话框可帮助您对要查询的数据使用正确的 WHERE 子句语法,因为它们利用适当的分隔符列出字段名称和值。而且还为您选择相关的关键字和运算符。然而,如果为个人地理数据库中的某个图层定义了一条 WHERE 子句,则一旦将此图层的源数据移动到文件地理数据库之后,这条子句可能不会对同一图层起作用。以下是 WHERE 子句不起作用的可能原因:
- 对于个人地理数据库,字段名称括在方括号中,但对于文件地理数据库,它们括在双引号中。
- 在个人地理数据库中,通配符 * 代表任意数量的字符,通配符 ? 代表一个字符。而文件地理数据库则分别使用 % 和 _。
- 个人地理数据库中的字符串搜索不区分大小写,但在文件地理数据库中则区分大小写。
- 个人地理数据库使用 UCASE 和 LCASE 转换字符串大小写,但文件地理数据库使用 UPPER 和 LOWER。
- 个人地理数据库中用 # 分隔日期和时间,但在文件地理数据库中它们则以单词 date 开头。
用于个人地理数据库的 WHERE 子句语法 | 用于文件地理数据库的等效语法 |
---|---|
[STATE_NAME] = 'California' | "STATE_NAME" = 'California' |
[OWNER_NAME] LIKE '?atherine smith' | "OWNER_NAME" LIKE '_atherine smith' |
[STATE_NAME] = 'california'(需要进行不区分大小写的搜索时) | LOWER("STATE_NAME") = 'california' |
UCASE([LAST_NAME]) = 'JONES' | UPPER("LAST_NAME") = 'JONES' |
[DATE_OF_BIRTH] = #06-13-2001 19:30:00# | "DATE_OF_BIRTH" = date '2001-06-13 19:30:00' |
WHERE 子句不起作用的另一个原因是,文件地理数据库支持的运算符和函数比个人地理数据库支持的要少,而且文件地理数据库只对子查询提供有限的支持。然而,这不太可能是 WHERE 子句不起作用的原因。文件地理数据库支持大多数可能需要使用的 WHERE 子句功能。
地理处理
在文件地理数据库上使用地理处理工具的方法与个人地理数据库相比,基本没有任何区别:
- 所有地理处理工具都支持文件地理数据库。
- 要创建文件地理数据库,可使用“创建文件地理数据库”工具。
- 每当使用可在文件地理数据库中创建新的要素类、栅格目录、栅格数据集或表的工具时,都可以选择通过指定配置关键字来自定义数据的存储方式。此选项在某些工具上可用。如果此选项不可用,则可在“环境”对话框中进行指定。
压缩矢量数据
与个人地理数据库和企业级地理数据库不同,文件地理数据库允许您选择以只读的压缩格式存储矢量数据,以降低存储要求。压缩数据为直接访问格式。访问时无需解压缩数据:ArcGIS 和 ArcReader 可直接对其进行读取。数据看起来与解压缩后是一样的,并且无论是通过目录树中的命令、地理处理还是 ArcObjects,都可以使用相同的方式来执行所有只读操作。有关详细信息,请参阅关于压缩文件地理数据库数据。
迁移应用程序
如果您用 ArcObjects 编写了一个应用程序,并想要将该应用程序访问的数据从个人地理数据库切换到文件地理数据库,可考虑以下操作:
- 更新工作空间工厂,使该应用程序对新数据源进行操作。将工作空间工厂从 AccessWorkspaceFactory 更改为 FileGDBWorkspaceFactory,并将地理数据库扩展名从 .mdb 更改为 .gdb。
- 如果您的应用程序使用 SQL,则可能需要更新语法以使其对文件地理数据库起作用:
- 正如前文所述,文件地理数据库与个人地理数据库的 SQL WHERE 子句语法是有区别的。如果应用程序使用 QueryFilter 或 QueryDef,请参考前面对 WHERE 子句的讨论,以了解可能需要进行哪些更改。
- 文件地理数据库并不支持可对个人地理数据库使用的所有功能和函数。ArcGIS 9.2 中,文件地理数据库不支持的最常用的函数包括 DISTINCT、GROUP BY 和 ORDER BY,在子查询外不支持集合函数 AVG、COUNT、MIN、MAX 和 SUM。在将来的版本中有可能添加对其中某些函数的支持。
- 文件地理数据库只提供有限的 QueryDef 连接支持,子字段只能包含简单的列名称;不支持别名、表达式和函数。FROM 子句只能包含简单的表名。
- 文件地理数据库中对 INSERT 和 UPDATE 的 ExecuteSQL 支持被限制为只包含文本值的简单语句。在 INSERT 和 UPDATE 语句中,不支持复合表达式(如 )以及子查询。但 DELETE 语句不受限制;它支持文件地理数据库所支持的任何 WHERE 子句功能。
SET RENTAL_PRICE = (RENTAL_PRICE - 1.00)
- 如果应用程序包含子查询,这些子查询可能对文件地理数据库不起作用,因为对它们的支持是受限制的。有关详细信息,请参阅 SQL 参考。
- 要最大化数据传输性能,请在要加载大量记录时,考虑使用只加载模式。有关详细信息,请参阅下面的“性能提示”。
除这些差异之外,ArcObjects 在文件地理数据库上的工作方式与在个人地理数据库上是相同的。
性能提示
以下信息可帮助您提高和维护文件地理数据库的性能:
- 创建新要素类时的默认分辨率是 0.1 毫米或按数据集的坐标系单位计算的等效值。x,y 分辨率的默认值几乎对所有情况都适用。如果数据没有这么精确,则创建要素类时可选择设置一个较大的 x,y 分辨率。以较大的 x,y 分辨率来存储坐标可降低存储要求并提高性能。这不仅适用于文件地理数据库,也适用于企业级地理数据库。有关 x,y 分辨率的详细信息,请参阅要素类基础知识。
- 与其他任何数据源一样,只创建真正需要的属性索引,因为添加的每个索引都会稍微降低要素类或表的编辑速度。每次编辑某个创建了索引的属性时,ArcGIS 都必须更新此索引。如果需要经常编辑某个字段,尽可能避免为其创建索引。
- 如果要在一个较大的数据集中添加、编辑或删除大量要素或记录,无论是通过编辑会话、地理处理工具还是目录树,在开始之前先删除空间索引以及任何受影响的属性索引,然后在完成更改后再重新添加这些索引,将会节省时间。
每次添加、编辑或删除要素类或记录时,ArcGIS 都需要更新索引。如果只对较小的数据集进行更改或只对几条记录进行更改(如 100 万条记录中的 10 条),则 ArcGIS 在每次增量更改之后更新索引所耗费的时间可以忽略不计。但是,如果对大量记录进行更改(如 100 万条中的 300,000 条),为大量的增量更改更新索引所耗费的时间就要远远超过按开始前先删除索引,完成更改后再添加这些索引所消耗的时间。对于其他情况,决定是否要删除索引会涉及到取舍问题,并且可能不十分明显。同样,用 ArcObjects 编写加载程序或转换程序的开发者每次要加载大量记录时,都应考虑使用只加载模式。只加载模式会暂停所有属性和空间索引的更新,直到要素被导入。导入所有要素之后,所有记录的索引(现有的以及新的)都会自动更新。可通过 IFeatureClassLoad 接口设置此模式。
- 与个人地理数据库一样,如果频繁添加或删除数据,则应定期紧缩文件地数据库。而且,在执行了任何大规模更改后,也应对文件地理数据库执行一次紧缩操作。紧缩可重新整理磁盘上的数据存储,从而改善性能。有关详细信息,请参阅紧缩文件地理数据库和个人地理数据库。
- 与使用任何其他存储在文件系统中的文件类型时一样,请将计算机维持在经过良好维护和调整的状态下。如果使用的是 Windows,请偶尔运行一次磁盘碎片整理程序来维护整个文件系统的性能。磁盘碎片整理程序是 Windows 操作系统随附的工具;有关详细信息,请参阅操作系统的联机帮助。
- 空间索引格网大小过小或过大会导致加载时间变长并降低空间搜索性能。ArcGIS 会在大多数操作结束时自动重新构建空间索引,以确保格网大小处于最优状态。需要您手动重新计算索引的情况极少。但是,在编辑会话中添加大量要素时,可能存在需要手动重新计算的情况。有关详细信息,请参阅设置空间索引。