这篇文档是为了说明怎样从一个文件里用OGR 的C++类读取和写入数据。强烈建议在读此文档之前首先阅读介绍 OGR 体系结构介绍文档,里面介绍了OGR 里主要的类以及他们所完成的功能。 从OGR 读取数据 为了描述如何通过 OGR 读取数据,我们编写一个小的示例,从OGR 文件里读出数据,并按照一定格式输出。 首先我们需要注册我们渴望读取的所有格式。这个通过调用OGRRegisterAll()就能很容易完成,这个函数注册了GDAL/OGR 支持的所有格式。 #i nclude "ogrsf_frmts.h" int main() { OGRRegisterAll(); 下一步我们将打开输入的OGR 数据文件。数据文件可以是文件,关系型数据库,文件路径,甚至可能是远程的网络服务,这点取决于我们使用的驱动。但是,数据源的名字通常只是一个简单的字符串。既然这样拿我们就编写一个打开 shapefile 的程序。第二个参数(FLALSE)告诉 OGRSFDriverRegistrar::Open() 函数我们不需要 update access。如果失败返回 NULL,并报错。 OGRDataSource *poDS; poDS = OGRSFDriverRegistrar::Open( "point.shp", FALSE ); if( poDS == NULL ) { printf( "Open failed.\n" ); exit( 1 ); } 一个OGRDataSource 可 能 包 含 很 多 的层 。 所 包 含 层 的数量 我 们 可 以 用过 调OGRDataSource::GetLayerCount() 得 到 , 并 且 其 中 每 一个曾 我 们 利 用索 引 调 用OGRDataSource::GetLayer()得到。不过,我们现在利用层的名字。 OGRLayer *poLayer; poLayer = poDS->GetLayerByName( "point" ); 现在我们开始读取层里面的features。在开始之前我们需要指定一个attribute 或者 spatial filter 来严格控制我们得到的feature。不过现在我们只是得到所有的features。 自从我们开始 fresh with 这个层,就没有这么严格了。很明智地我们需要调用Layer::ResetReading() 来 确 保 我 们 是从层 的开 头 开 始 。 我 们 不 断 地 调 用OGRLayer::GetNextFeature()函数来遍历所有的features,当遍历完所有的features 后返回NULL。 OGRFeature *poFeature; poLayer->ResetReading(); while( (poFeature = poLayer->GetNextFeature()) != NULL ) { 为了得到一个feature 的所有属性 fields,调用OGRFeatureDefn 将很方便。这是一个object,与层相关联,包含所有 fields 的定义。我们循环完所有...