⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 geodataengine.cpp

📁 使用VC++程序制作的COM组件是地理信息系统的一个实例
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	}
	return(TRUE);
}
//---------------------------------------------------------------------------
BOOL CGeoDataEngine::CreateLabelTable(CGeoDatabase& db, CString tablename)
//建立注记数据库表
//CGeoDatabase& db    --	数据库对象
//CString tablename	--	数据库表名
{
	CdbTableDef td;
	CdbProperty proper;
	CdbField    fd;

	try
	{
		td = db.CreateTableDef(tablename);
		for (int i=0; i<LabelFsNum; i++)
		{
			fd = td.CreateField(LabelFs[i].csName, LabelFs[i].lType, LabelFs[i].lSize);
//			if (i==0)  fd.SetAttributes(dbAutoIncrField);
			td.Fields.Append(fd);
		}
		db.TableDefs.Append(td);

		proper = td.CreateProperty(_T("TableType"), dbLong,
			                       &COleVariant((long)comLabelTable));
		td.Properties.Append(proper);

	}
	catch (CdbException)
	{
		CdbLastOLEError err;

		TRACE(_T("建立要素注记数据库表错误: %s\n"), (LPCTSTR)err.GetDescription());
		return(FALSE);
	}
	return(TRUE);
}
//---------------------------------------------------------------------------
BOOL CGeoDataEngine::CreateSymbolTable(CGeoDatabase& db, CString tablename)
//建立注记数据库表
//CGeoDatabase& db    --	数据库对象
//CString tablename	--	数据库表名
{
	CdbTableDef td;
	CdbProperty proper;
	CdbField    fd;

	try
	{
		td = db.CreateTableDef(tablename);
		for (int i=0; i<SymbolFsNum; i++)
		{
			fd = td.CreateField(SymbolFs[i].csName, SymbolFs[i].lType, SymbolFs[i].lSize);
//			if (i==0)  fd.SetAttributes(dbAutoIncrField);
			td.Fields.Append(fd);
		}
		db.TableDefs.Append(td);

		proper = td.CreateProperty(_T("TableType"), dbLong,
			                       &COleVariant((long)comSymbolTable));
		td.Properties.Append(proper);

	}
	catch (CdbException)
	{
		CdbLastOLEError err;

		TRACE(_T("建立要素注记数据库表错误: %s\n"), (LPCTSTR)err.GetDescription());
		return(FALSE);
	}
	return(TRUE);
}
//---------------------------------------------------------------------------
BOOL CGeoDataEngine::CreateLayerTable(CGeoDatabase& db, CString tablename)
//建立要素层数据库表
//CGeoDatabase& db    --	数据库对象
//CString tablename	--	数据库表名
{
	CdbTableDef td;
	CdbProperty proper;
	CdbField    fd;

	try
	{
		td = db.CreateTableDef(tablename);
		for (int i=0; i<LayerFsNum; i++)
		{
			fd = td.CreateField(LayerFs[i].csName, LayerFs[i].lType, LayerFs[i].lSize);
			td.Fields.Append(fd);
		}
		db.TableDefs.Append(td);

		proper = td.CreateProperty(_T("TableType"), dbLong,
			                       &COleVariant((long)comLayerTable));
		td.Properties.Append(proper);
	}
	catch (CdbException)
	{
		CdbLastOLEError err;

		TRACE(_T("建立要素层数据库表错误: %s\n"), (LPCTSTR)err.GetDescription());
		return(FALSE);
	}
	return(TRUE);
}
//---------------------------------------------------------------------------
BOOL CGeoDataEngine::CreateWorkspaceTable(CGeoDatabase& db, CString tablename)
//建立工作区数据库表(该数据库只有一个记录)
//CGeoDatabase& db    --	数据库对象
//CString tablename	--	数据库表名
{
	CdbTableDef td;
	CdbProperty proper;
	CdbField    fd;
	CdbRecordset rs;

	try
	{
		td = db.CreateTableDef(tablename);
		for (int i=0; i<WorkspaceFsNum; i++)
		{
			fd = td.CreateField(WorkspaceFs[i].csName, WorkspaceFs[i].lType, WorkspaceFs[i].lSize);
			td.Fields.Append(fd);
		}
		db.TableDefs.Append(td);

		proper = td.CreateProperty(_T("TableType"), dbLong,
			                       &COleVariant((long)comWorkspaceTable));
		td.Properties.Append(proper);

		rs = td.OpenRecordset(dbOpenTable, dbAppendOnly);
		rs.AddNew();
		rs.Update();
		rs.Close();
	}
	catch (CdbException)
	{
		CdbLastOLEError err;

		TRACE(_T("建立工作区数据库表错误: %s\n"), (LPCTSTR)err.GetDescription());
		return(FALSE);
	}
	return(TRUE);
}
//---------------------------------------------------------------------------
BOOL CGeoDataEngine::OpenLayerTable(CGeoDatabase& db, CGeoRecordset* rs)
//打开要素层数据表
{
	try
	{
		*rs = db.OpenRecordset(comLayerTableName);
	}
	catch (CdbException)
	{
		CdbLastOLEError err;

		TRACE(_T("打开要素层表错误: %s\n"), (LPCTSTR)err.GetDescription());
		return(FALSE);
	}
	return(TRUE);

}
//---------------------------------------------------------------------------
BOOL CGeoDataEngine::OpenWorkspaceTable(CGeoDatabase& db, CGeoRecordset* rs)
//打开工作区参数表
{
	try
	{
		*rs = db.OpenRecordset(comWorkspaceTableName);
	}
	catch (CdbException)
	{
		CdbLastOLEError err;

		TRACE(_T("打开工作区参数表错误: %s\n"), (LPCTSTR)err.GetDescription());
		return(FALSE);
	}
	return(TRUE);

}
//---------------------------------------------------------------------------
BOOL CGeoDataEngine::OpenTable(CGeoDatabase& db, CString tablename, CGeoRecordset* rs)
//以记录集形式打开数据库表
//CGeoDatabase& db    --  数据库对象
//CString tablename  --  数据库表名
//CGeoRecordset* rs   --  返回的表对象指针(以表类型记录集形式)
{
	try
	{
		*rs = db.OpenRecordset(tablename, dbOpenDynaset);
	}
	catch (CdbException)
	{
		CdbLastOLEError err;

		TRACE(_T("打开地理数据库表错误: %s\n"), (LPCTSTR)err.GetDescription());
		return(FALSE);
	}
	return(TRUE);
}
//---------------------------------------------------------------------------
BOOL CGeoDataEngine::DeleteTable(CGeoDatabase& db, CString tablename)
//删除数据库表
//CGeoDatabase& db    --  数据库对象
//CString tablename  --  数据库表名
{
	try
	{
		db.TableDefs.Delete(tablename);
	}
	catch (CdbException)
	{
		CdbLastOLEError err;

		TRACE(_T("删除地理数据库表错误: %s\n"), (LPCTSTR)err.GetDescription());
		return(FALSE);
	}
	return(TRUE);
}
//---------------------------------------------------------------------------
int CGeoDataEngine::GetTableType(CGeoRecordset& rs)
//获取地理数据库表的类型(对点、线、面、文本和注记表适用)
//CGeoRecordset& rs -- 表对象(以记录集形式)
{
	CdbProperty proper = rs.Properties[_T("TableType")];
	COleVariant v = proper.GetValue();

	return(v.lVal);
}
//---------------------------------------------------------------------------
int CGeoDataEngine::GetSpatialFieldNum(CGeoRecordset& rs)
//获取地理数据库表空间数据字段的个数(对点、线、面适用)
//CGeoRecordset& rs -- 表对象(以记录集形式)
{
	CdbProperty proper = rs.Properties[_T("SpatialFieldNum")];
	COleVariant v = proper.GetValue();

	return(v.lVal);
}
//---------------------------------------------------------------------------
void CGeoDataEngine::SetPointSpatialData(CGeoRecordset& rs, POINTFEATURE* pdata)
//将点要素空间数据写入点要素数据库表中当前记录的空间数据字段部分
//CGeoRecordset& rd -- 表对象(以记录集形式)
//POINTFEATURE* pdata   -- 点要素结构指针
{
	long i, j, size;
	CByteArray byarray;
	BYTE *pvalue;

//	rs.SetField(PointFs[0].csName, &COleVariant(pdata->ID));
	rs.SetField(PointFs[1].csName, &COleVariant(pdata->byType));
	rs.SetField(PointFs[2].csName, &COleVariant(pdata->ptPosition.x));
	rs.SetField(PointFs[3].csName, &COleVariant(pdata->ptPosition.y));
	rs.SetField(PointFs[4].csName, &COleVariant(pdata->dElevation));
	rs.SetField(PointFs[5].csName, &COleVariant(pdata->ptDirection.x));
	rs.SetField(PointFs[6].csName, &COleVariant(pdata->ptDirection.y));

	size = pdata->arrayLineID.GetSize();
	byarray.SetSize(sizeof(long)*size);
	for (i=0; i<size; i++)
	{
		pvalue = (BYTE*)&pdata->arrayLineID[i];
		for (j=0; j<sizeof(long); j++)
			byarray[sizeof(long)*i+j] = pvalue[j];
	}
	rs.SetField(PointFs[7].csName, &COleVariant(byarray));
	rs.SetField(PointFs[8].csName, &COleVariant(pdata->lAttriCode));
}
//---------------------------------------------------------------------------
void CGeoDataEngine::GetPointSpatialData(CGeoRecordset& rs, POINTFEATURE* pdata)
//获取点要素表中当前记录的空间数据
//CGeoRecordset& rs -- 表对象(以记录集形式)
//POINTFEATURE* pdata   -- 点要素结构指针
{
	long i, num;
	COleVariant v;
	long *pvalue;

	v = rs.GetField(PointFs[0].csName);  pdata->ID = v.lVal;
	v = rs.GetField(PointFs[1].csName);  pdata->byType = (BYTE)v.bVal;
	v = rs.GetField(PointFs[2].csName);  pdata->ptPosition.x = v.dblVal;
	v = rs.GetField(PointFs[3].csName);  pdata->ptPosition.y = v.dblVal;
	v = rs.GetField(PointFs[4].csName);	 pdata->dElevation = v.dblVal;
	v = rs.GetField(PointFs[5].csName);  pdata->ptDirection.x = v.dblVal;
	v = rs.GetField(PointFs[6].csName);  pdata->ptDirection.y = v.dblVal;
	
	v = rs.GetField(PointFs[7].csName);
	num = v.parray->rgsabound[0].cElements/sizeof(long);
	pvalue = (long*)v.parray->pvData;
	pdata->arrayLineID.RemoveAll();
	pdata->arrayLineID.SetSize(num);
	for (i=0; i<num; i++)
		pdata->arrayLineID[i] = pvalue[i];

	v = rs.GetField(PointFs[8].csName);	 pdata->lAttriCode = v.lVal;
}
//---------------------------------------------------------------------------
void CGeoDataEngine::SetLineSpatialData(CGeoRecordset& rs, LINEFEATURE* pdata)
//将线要素空间数据写入表中当前记录的
//CGeoRecordset& rs -- 表对象(以记录集形式)
//LINEFEATURE* ldata   -- 线要素结构指针
{
	long i, j, size;
	CByteArray byarray;
	BYTE *pvalue;

//	rs.SetField(LineFs[0].csName, &COleVariant(pdata->ID));
	rs.SetField(LineFs[1].csName, &COleVariant(pdata->byType));
	rs.SetField(LineFs[2].csName, &COleVariant(pdata->lStartNodeID));
	rs.SetField(LineFs[3].csName, &COleVariant(pdata->lEndNodeID));
	rs.SetField(LineFs[4].csName, &COleVariant(pdata->lLeftPolygonID));
	rs.SetField(LineFs[5].csName, &COleVariant(pdata->lRightPolygonID));
	
	size = pdata->arrayVertex.GetSize();
	byarray.SetSize(sizeof(DPOINT)*size);
	for (i=0; i<size; i++)
	{
		pvalue = (BYTE*)&pdata->arrayVertex[i];
		for (j=0; j<sizeof(DPOINT); j++)
			byarray[sizeof(DPOINT)*i+j] = pvalue[j];
	}
	rs.SetField(LineFs[6].csName, &COleVariant(byarray));

	byarray.RemoveAll(); 
	size = pdata->arrayElevation.GetSize();
	byarray.SetSize(sizeof(double)*size);
	for (i=0; i<size; i++)
	{
		pvalue = (BYTE*)&pdata->arrayElevation[i];
		for (j=0; j<sizeof(double); j++)
			byarray[sizeof(double)*i+j] = pvalue[j];
	}
	rs.SetField(LineFs[7].csName, &COleVariant(byarray));

	rs.SetField(LineFs[8].csName, &COleVariant(pdata->rectBound.x1));
	rs.SetField(LineFs[9].csName, &COleVariant(pdata->rectBound.y1));
	rs.SetField(LineFs[10].csName, &COleVariant(pdata->rectBound.x2));
	rs.SetField(LineFs[11].csName, &COleVariant(pdata->rectBound.y2));
	rs.SetField(LineFs[12].csName, &COleVariant(pdata->lAttriCode));
}
//---------------------------------------------------------------------------
void CGeoDataEngine::GetLineSpatialData(CGeoRecordset& rs, LINEFEATURE* pdata)
//获取线要素表中当前记录的空间数据
//CGeoRecordset& rs -- 表对象(以记录集形式)
//LINEFEATURE* pdata   -- 线要素结构指针
{
	long i, num;
	COleVariant v;
	DPOINT* pvalue1;
	double* pvalue2;

	v = rs.GetField(LineFs[0].csName);  pdata->ID = v.lVal;
	v = rs.GetField(LineFs[1].csName);  pdata->byType = (BYTE)v.bVal;
	v = rs.GetField(LineFs[2].csName);  pdata->lStartNodeID = v.lVal;
	v = rs.GetField(LineFs[3].csName);  pdata->lEndNodeID = v.lVal;
	v = rs.GetField(LineFs[4].csName);  pdata->lStartNodeID = v.lVal;
	v = rs.GetField(LineFs[5].csName);  pdata->lEndNodeID = v.lVal;

	v = rs.GetField(LineFs[6].csName);
	pvalue1 = (DPOINT*)v.parray->pvData;
	num = v.parray->rgsabound[0].cElements/sizeof(DPOINT);
	pdata->arrayVertex.RemoveAll();
	pdata->arrayVertex.SetSize(num);
	for (i=0; i<num; i++)
		pdata->arrayVertex[i] = pvalue1[i];

	v = rs.GetField(LineFs[7].csName);
	pvalue2 = (double*)v.parray->pvData;
	num = v.parray->rgsabound[0].cElements/sizeof(double);
	pdata->arrayElevation.RemoveAll();
	pdata->arrayElevation.SetSize(num);
	for (i=0; i<num; i++)
		pdata->arrayElevation[i] = pvalue2[i];

	v = rs.GetField(LineFs[8].csName);  pdata->rectBound.x1 = v.dblVal;
	v = rs.GetField(LineFs[9].csName);  pdata->rectBound.y1 = v.dblVal;
	v = rs.GetField(LineFs[10].csName); pdata->rectBound.x2 = v.dblVal;
	v = rs.GetField(LineFs[11].csName); pdata->rectBound.y2 = v.dblVal;
	v = rs.GetField(LineFs[12].csName); pdata->lAttriCode = v.lVal;
}

//---------------------------------------------------------------------------
void CGeoDataEngine::SetPolygonSpatialData(CGeoRecordset& rs, POLYGONFEATURE* pdata)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -