Wechat: yu389741| Email: gisdqy@163.com

Shop:https://www.giserdqy.com/shop

OGR读取GML文件


GDAL/OGR库支持多种数据格式,其中OGR库支持GML格式的读写。GML(Geography Markup Language),即地理标识语言,由OGC提出,能够表示地理空间对象的空间数据和非空间数据。OGR提供对GML格式矢量数据的读写,但前提条件是编译GDAL时要提供Xerces库。在Xerces官网上下载已编译好的Xerces库,然后打开GDAL源码中的nmake.opt文件,找到下面三行:
# Uncomment for Xerces based GML and ILI support.
          #XERCES_DIR = c:\warmerda\supportlibs\xerces-c_2_6_0
          #XERCES_INCLUDE = -I$(XERCES_DIR)/include -I$(XERCES_DIR)/include/xercesc
          #XERCES_LIB = $(XERCES_DIR)/lib/xerces-c_2.lib
改为:
# Uncomment for Xerces based GML and ILI support.
          XERCES_DIR = C:\Xerces
          XERCES_INCLUDE = -I$(XERCES_DIR)/include -I$(XERCES_DIR)/include/xercesc
          XERCES_LIB = $(XERCES_DIR)/lib/xerces-c_3.lib
其中XERCES_DIR为Xerces库的位置,我将下载下来的Xerces放在了C盘根目录下,所以是C:\Xerces,XERCES_LIB是Xerces库中xerces静态库的目录,默认路径 是C:\Xerces\lib\xerces-c_3.lib。做完这些修改之后编译GDAL后就可以支持GML读写了。
读写GML跟读写Shapefile文件有所不同,在读写Shapefile文件时,我们获取DataSource时是将目录指定到某个文件夹,这个文件夹就是DataSource。对于GML文件而言,必须将目录指定到GML文件,即一个GML文件是一个DataSource。上代码:
OGRRegisterAll();
const char *filePath = "D:\\Out\\output.gml";//如果是shapefile文件,此处可以将目录指定为D:\\Out,对于GML文件必须指定到具体的.gml文件
const char *driveName = "GML";
//const char *pLayerName = "layer1";
OGRSFDriver *pDriver = NULL;
OGRLayer *pLayer = NULL;
OGRDataSource *pODS = NULL; 
pDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(driveName);

if (pDriver == NULL)
{
cout<<"Can not get GML Driver"<<endl;
exit(1);
}
pODS = pDriver->Open(filePath,0);//Open函数的第二个参数只能是0,OGR不支持对已有GML文件的Update
if (pODS == NULL)
{
cout<<"Can not open "<<filePath<<endl;
exit(1);
}
//pLayer = pODS->GetLayerByName(pLayerName);
pLayer = pODS->GetLayer(0)<<endl;
cout<<pLayer->GetName()<<endl;
if (pLayer == NULL)
{
cout<<"Can not get layer "<<pLayerName<<endl;
exit(1);
}
cout<<"Feature count is "<<pLayer->GetFeatureCount()<<endl;
OGRDataSource::DestroyDataSource(pODS);

                以上代码可以打开D:\Out\output.gml的文件,并将文件中的图层名称和要素个数输出,输出结果如下:


此处要说明一下,output.gml文件是由layer1.shp文件转换而来,可以看出gml文件的文件名不是图层名,输出的图层名称是layer1,而不是output.gml。如果将上面的代码改为
pLayer =pODS->GetLayerByName(“output.gml”);//将不会得到正确的图层
          所以此处通过pODS->GetLayer(0)来获取gml文件中的图层。
获取到Layer之后,就可以对Layer中的Feature进行操作了。

转载自:https://blog.csdn.net/rybgis/article/details/11708831