void GetGUID(char *pBuffer,unsigned long Size)
{
GUID guid;
if ( S_OK == ::CoCreateGuid( &guid ) )
{ _snprintf(pBuffer, Size
, "%08X%04X%04x%02X%02X%02X%02X%02X%02X%02X%02X"
, guid.Data1
, guid.Data2
, guid.Data3
, guid.Data4[0], guid.Data4[1]
, guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5]
, guid.Data4[6], guid.Data4[7]);
}
return;
}
//注册TAB格式的驱动
RegisterOGRTAB();
//从容器中获取需要处理的tab数据,容器中存储的是所有要处理数据的完整路径
for ( set< string >::iterator it = FileAllPath.setFileAllPath.begin(); it != FileAllPath.setFileAllPath.end(); ++it )
{
string SingleFilePath = *it;//从容器中取出数据,即D:/text/绿地.tab
string LayerNameContainExtend = SingleFilePath.substr( SingleFilePath.rfind("//") + 1 );//获取正在处理的图层名包含扩展名
string LayerName = LayerNameContainExtend.substr( 0, LayerNameContainExtend.find( "." ) );//获取正在处理的图层名不包含扩展名
//获取数据源
OGRDataSource *LineDS;
LineDS = OGRSFDriverRegistrar::Open( SingleFilePath.c_str(), FALSE );
if ( LineDS == NULL )
{
cout << "数据源获取失败" << endl;
cin.get();
exit( 1 );--------------注意exit、continue、return的作用------------出错退出之前要先关闭打开的文件,可以用continue处理下一条数据,Exit表示退出当前程序
}
//根据处理的图层名读取图层
OGRLayer *poLayer;
poLayer = LineDS->GetLayerByName( LayerName.c_str() );//从数据源中获取图层----------------------特殊文件名的情况有问题,带版本号的情况
if (PoLayer==NULL) //时时监控指针所指向的值是否合法
{
continue;
}
//读取正在处理图层中的记录
OGRFeature *poFeature;
poLayer->ResetReading();
//判断要素是否为空,空则重新开始循环
if ( poLayer->GetFeatureCount() == 0 )
{
continue;//核实countinue/return/exit的三个作用,coutinue是不是返回最近的一个循环语句
}
char strNewGuid[32];
while( ( poFeature = poLayer->GetNextFeature() ) != NULL )
{
string GuidValue = poFeature->GetFieldAsString( "GUID" );
string FidValue = poFeature->GetFieldAsString( "FID" );//此处的变量没有什么作用于,主要是为了凑合map容器的第二个变量------------用set可以达到这个目的
//char strNewGuid[32] = {'/0'};//存储改后的GUID值,这样赋值的方式不正确,只给了数组的第0位赋了值。
memset(strNewGuid,0,32);
//判断GUID的正确性,不正确的则要重新赋值,把赋完值后的GUID存入到map容器中
if ( strlen( GuidValue.c_str() ) != 32 || GuidValue == "" )//判断GUID的值是否正确---------------------第二个判断条件已经包含在第一个里面了
{
GetGUID( strNewGuid, 32 );
poFeature -> SetField( "GUID", strNewGuid );
GuidValue = poFeature->GetFieldAsString( "GUID" );
}
//插入GUID到容器中
while( mapGuid.insert( make_pair( GuidValue, FidValue ) ).second == FALSE )----------------------???????????没看明白,注意代码的清晰和简洁,循环的含义是什么?
{
char strNewGuid[32] = {'/0'};-----------------------------定义放到循环外面,初始化最好用memset(),其实在上面已经定义了,不需要重复定义了
GetGUID( strNewGuid, 32 );
poFeature->SetField( "GUID", strNewGuid );
GuidValue = poFeature->GetFieldAsString( "GUID" );
}
//把要素插入到set容器中
vecFeature.push_back( poFeature );
}