在开发GIS软件时,用的最多的就是读写要素类。要素类,在arcgis中就是SHP文件,在geoglobe中就是fcs文件,fcs文件本质上就是sqlite数据库。下面介绍如何读写featureclass。
1、读取本地featureclass,在oracle中创建featureclass
2、遍历本地featureclass中的每个feature
3、在oracle中根据featureclass创建feature,并把第二步中本地feature的几何信息和字段信息赋值给oracle中的feture
4、保存oracle中创建的每个feature,使用事务
void test()
{
//本地featureclass
GsConnectProperty conn;
conn.DataSourceType = eSqliteFile;
conn.Server = "F:/";
GsSqliteGeoDatabaseFactory fcs;
GsGeoDatabasePtr ptrDB = fcs.Open(conn);
GsFeatureClassPtr ptrSourceFeaClass = ptrDB->OpenFeatureClass("JT_GaoSu_L");
//oracle featureclass
GsConnectProperty conn1;
conn1.DataSourceType = eOracleSpatial;
conn1.Server = "192.168.37.75";
conn1.User = "data1";
conn1.Database = "data1";
conn1.Password = "1";
conn1.Port = 1521;
GsOracleSpatialGeoDatabaseFactory obj1;
GsGeoDatabasePtr ptrDB1 = obj1.Open(conn1);
int i = 0;
//通过本地featureclass在oracle中创建featureclass
GsFeatureClassPtr ptrTargetFeaClass = ptrDB1->CreateFeatureClass("gt",
ptrSourceFeaClass->Fields(), ptrSourceFeaClass->GeometryColumnInfo(),
ptrSourceFeaClass->SpatialReference());
GsFeatureCursorPtr ptrSourceCursor = ptrSourceFeaClass->Search();
GsFeaturePtr ptrSourceFea = ptrSourceCursor->Next();
GsFields fs = ptrSourceFeaClass->Fields();
GsTransactionPtr ptrTrans;
if (nullptr != ptrTargetFeaClass)
{
ptrTrans = ptrTargetFeaClass->Transaction();
}
if (ptrTrans)
{
ptrTrans->StartTransaction();
}
int commitCount = 0;
const int MAX_COMMIT_COUNT = 5000;
do
{
GsFeaturePtr ptrTargetFea = ptrTargetFeaClass->CreateFeature();
ptrTargetFea->OID(-1);
ptrTargetFea->Geometry(ptrSourceFea->Geometry());
for (int i = 2; i < fs.Fields.size(); i++)
{
ptrTargetFea->Value(i, ptrSourceFea->ValuePtr(i), ptrSourceFea->ValueSize(i), fs.Fields[i].Type);
}
ptrTargetFea->Store();
if ((MAX_COMMIT_COUNT < commitCount) && ptrTrans)
{
ptrTrans->CommitTransaction();
ptrTrans->StartTransaction();
commitCount = 0;
}
else
{
++commitCount;
}
} while (ptrSourceFea = ptrSourceCursor->Next());
if (commitCount > 0 && ptrTrans)
{
ptrTrans->CommitTransaction();
commitCount = 0;
}
}