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

📄 geodao.cpp

📁 使用VC++程序制作的COM组件是地理信息系统的一个实例
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	comGeoDataEngine.GetLineSpatialData(m_rs, obj);
	count = m_rs.Fields.GetCount();
	start = comGeoDataEngine.GetSpatialFieldNum(m_rs);
	obj->m_AttriFieldSet.SetSize(count-start);
	for (i=start; i<count; i++)
	{
		obj->m_AttriFieldSet[i-start].csName = m_rs.Fields[i].GetName();
		obj->m_AttriFieldSet[i-start].Value = m_rs.Fields[i].GetValue();
	}
}
//--------------------------------------------------------------------
BOOL CLineFeatureSet::GetFeatureOf(long id, CLineFeature* obj)
//根据ID号获得要素
{
	char buffer[20];
	CString cs = _T("ID_ =");

	_ltoa(id, buffer, 10);
	m_rs.FindFirst(cs + buffer);
	if (m_rs.GetNoMatch())  return(FALSE);
	GetFeature(obj);
	return(TRUE);
}
//--------------------------------------------------------------------
void CLineFeatureSet::GetAttriFieldSet(CAttriFieldSet& obj)
//获得当前要素的属性数据
{
	long i, count, start;

	count = m_rs.Fields.GetCount();
	start = comGeoDataEngine.GetSpatialFieldNum(m_rs);
	obj.SetSize(count-start);
	for (i=start; i<count; i++)
	{
		obj[i-start].csName = m_rs.Fields[i].GetName();
		obj[i-start].Value = m_rs.Fields[i].GetValue();
	}
}
//--------------------------------------------------------------------
BOOL CLineFeatureSet::GetAttriFieldSetOf(long id, CAttriFieldSet& obj)
//根据ID号获得要素的属性数据
{
	char buffer[20];
	CString cs = _T("ID_ =");

	_ltoa(id, buffer, 10);
	m_rs.FindFirst(cs + buffer);
	if (m_rs.GetNoMatch())  return(FALSE);
	GetAttriFieldSet(obj);
	return(TRUE);
}
//--------------------------------------------------------------------
void CLineFeatureSet::UpdateFeature(CLineFeature& obj)
//更新记录
{
	m_rs.Edit();
	comGeoDataEngine.SetLineSpatialData(m_rs, &obj);
	for (int i=0; i<obj.m_AttriFieldSet.GetSize(); i++)
		m_rs.SetField(obj.m_AttriFieldSet[i].csName, &obj.m_AttriFieldSet[i].Value);
	m_rs.Update();
}

//********************************************************************
//面状要素集合类(CPolygonFeatureSet) 的函数体
//--------------------------------------------------------------------
CPolygonFeatureSet::CPolygonFeatureSet()
{
}
//--------------------------------------------------------------------
CPolygonFeatureSet::~CPolygonFeatureSet()
{
	m_SymbolSet.Close();
	m_LabelSet.Close();
}
//--------------------------------------------------------------------
BOOL CPolygonFeatureSet::Open(CGeoDatabase& db, CLayer* pLayer)
{
	m_pLayer = pLayer;
	m_csTableName = pLayer->csName + (LPCTSTR)comPolygonSuffix;
	if (!comGeoDataEngine.OpenTable(db, m_csTableName, &m_rs))  return(FALSE);

	m_SymbolSet.Open(db, pLayer->csName+(LPCTSTR)comPolygonSymbolSuffix);
	m_LabelSet.Open(db, pLayer->csName+(LPCTSTR)comPolygonLabelSuffix);

	return(TRUE);
}
//--------------------------------------------------------------------
long CPolygonFeatureSet::AddFeature(CPolygonFeature& obj)
//增加要素(一个记录)
{
	COleVariant v;

	m_rs.AddNew();
	comGeoDataEngine.SetPolygonSpatialData(m_rs, &obj);
	for (int i=0; i<obj.m_AttriFieldSet.GetSize(); i++)
		m_rs.SetField(obj.m_AttriFieldSet[i].csName, &obj.m_AttriFieldSet[i].Value);
	m_rs.Update();

	v = m_rs.GetField(0L);
	return(v.lVal);
}
//--------------------------------------------------------------------
void CPolygonFeatureSet::GetFeature(CPolygonFeature* obj)
//获得当前要素
{
	long i, count, start;

	comGeoDataEngine.GetPolygonSpatialData(m_rs, obj);
	count = m_rs.Fields.GetCount();
	start = comGeoDataEngine.GetSpatialFieldNum(m_rs);
	obj->m_AttriFieldSet.SetSize(count-start);
	for (i=start; i<count; i++)
	{
		obj->m_AttriFieldSet[i-start].csName = m_rs.Fields[i].GetName();
		obj->m_AttriFieldSet[i-start].Value = m_rs.Fields[i].GetValue();
	}
}
//--------------------------------------------------------------------
BOOL CPolygonFeatureSet::GetFeatureOf(long id, CPolygonFeature* obj)
//根据ID号获得要素
{
	char buffer[20];
	CString cs = _T("ID_ =");

	_ltoa(id, buffer, 10);
	m_rs.FindFirst(cs + buffer);
	if (m_rs.GetNoMatch())  return(FALSE);
	GetFeature(obj);
	return(TRUE);
}
//--------------------------------------------------------------------
void CPolygonFeatureSet::GetAttriFieldSet(CAttriFieldSet& obj)
//获得当前要素的属性数据
{
	long i, count, start;

	count = m_rs.Fields.GetCount();
	start = comGeoDataEngine.GetSpatialFieldNum(m_rs);
	obj.SetSize(count-start);
	for (i=start; i<count; i++)
	{
		obj[i-start].csName = m_rs.Fields[i].GetName();
		obj[i-start].Value = m_rs.Fields[i].GetValue();
	}
}
//--------------------------------------------------------------------
BOOL CPolygonFeatureSet::GetAttriFieldSetOf(long id, CAttriFieldSet& obj)
//根据ID号获得要素的属性数据
{
	char buffer[20];
	CString cs = _T("ID_ =");

	_ltoa(id, buffer, 10);
	m_rs.FindFirst(cs + buffer);
	if (m_rs.GetNoMatch())  return(FALSE);
	GetAttriFieldSet(obj);
	return(TRUE);
}
//--------------------------------------------------------------------
void CPolygonFeatureSet::UpdateFeature(CPolygonFeature& obj)
//更新记录
{
	m_rs.Edit();
	comGeoDataEngine.SetPolygonSpatialData(m_rs, &obj);
	for (int i=0; i<obj.m_AttriFieldSet.GetSize(); i++)
		m_rs.SetField(obj.m_AttriFieldSet[i].csName, &obj.m_AttriFieldSet[i].Value);
	m_rs.Update();
}

//********************************************************************
//文本集合类(CTextFeatureSet) 的函数体
//--------------------------------------------------------------------
CTextFeatureSet::CTextFeatureSet()
{
}
//--------------------------------------------------------------------
BOOL CTextFeatureSet::Open(CGeoDatabase& db, CLayer* pLayer)
{
	m_pLayer = pLayer;
	m_csTableName = pLayer->csName + comTextSuffix;
	return(comGeoDataEngine.OpenTable(db, m_csTableName, &m_rs));
}
//--------------------------------------------------------------------
long CTextFeatureSet::AddFeature(CTextFeature& obj)
//增加符号(一个记录)
{
	COleVariant v;

	m_rs.AddNew();
	comGeoDataEngine.SetTextData(m_rs, &obj);
	m_rs.Update();
	v = m_rs.GetField(0L);
	return(v.lVal);
}
//--------------------------------------------------------------------
void CTextFeatureSet::GetFeature(CTextFeature* obj)
//获得当前符号
{
	comGeoDataEngine.GetTextData(m_rs, obj);
}
//--------------------------------------------------------------------
BOOL CTextFeatureSet::GetFeatureOf(long id, CTextFeature* obj)
//根据ID号获得符号
{
	char buffer[20];
	CString cs = _T("ID_ =");

	_ltoa(id, buffer, 10);
	m_rs.FindFirst(cs + buffer);
	if (m_rs.GetNoMatch())  return(FALSE);
	GetFeature(obj);
	return(TRUE);
}
//--------------------------------------------------------------------
void CTextFeatureSet::UpdateFeature(CTextFeature& obj)
//更新记录
{
	m_rs.Edit();
	comGeoDataEngine.SetTextData(m_rs, &obj);
	m_rs.Update();
}


//********************************************************************
//要素层类(CLayer) 的函数体
//--------------------------------------------------------------------
IMPLEMENT_SERIAL(CLayer, CObject, 0)

CLayer::CLayer()
{
}

CLayer::CLayer(CWorkspace* pWorkspace)
{
	m_pWorkspace = pWorkspace;
}

//--------------------------------------------------------------------
void CLayer::ReName(CString newname)
{
	csName = newname;
}

//********************************************************************
//工作区(CWorkspace) 的函数体
//--------------------------------------------------------------------
IMPLEMENT_SERIAL(CWorkspace, CObject, 0)

CWorkspace::CWorkspace()
{
}

CWorkspace::~CWorkspace()
{
	if (m_GeoDatabase)  CloseDB();

}
//--------------------------------------------------------------------
//串行化,从工作区文件读取数据
void CWorkspace::Serialize(CArchive& ar)
{
    CFile* fp = ar.GetFile();
    ASSERT(fp);

	if (ar.IsStoring())
	{
		// TODO: add storing code here
		fp->SeekToBegin();
		fp->Write(&m_iDatabaseNameLen, sizeof(int));
		fp->Write(m_csDatabaseName, m_iDatabaseNameLen);
	}
	else
	{
		// Get the file from the archive.
		//Read FileName from the Document
		fp->Read(&m_iDatabaseNameLen, sizeof(int));
		fp->Read(m_csDatabaseName.GetBuffer(m_iDatabaseNameLen), m_iDatabaseNameLen);
		if (!OpenDB())
			AfxMessageBox("工作区数据装载错误");
	}
}
//--------------------------------------------------------------------
#ifdef _DEBUG
void CWorkspace::AssertValid() const
{
	CObject::AssertValid();
}

void CWorkspace::Dump(CDumpContext& dc) const
{
	CObject::Dump(dc);
}
#endif //_DEBUG
//--------------------------------------------------------------------
BOOL CWorkspace::OpenDB()
//打开地理数据库并转载工作区和要素层数据
{
	CGeoRecordset rs;
	CLayer *player;
	int i;

	if (!comGeoDataEngine.OpenDatabase(m_csDatabaseName, &m_GeoDatabase))
		return(FALSE);
	comGeoDataEngine.OpenWorkspaceTable(m_GeoDatabase, &rs);
	comGeoDataEngine.GetWorkspaceData(rs, this);
	rs.Close();

	comGeoDataEngine.OpenLayerTable(m_GeoDatabase, &rs);
	rs.MoveFirst();
	for (i=0; i<rs.GetRecordCount(); i++)
	{
		player = new CLayer(this);
		comGeoDataEngine.GetLayerData(rs, player);
		m_listLayer.AddTail(player);
		rs.MoveNext();
	}
	rs.Close();

	return(TRUE);
}
//--------------------------------------------------------------------
void CWorkspace::CloseDB()
//将工作区和要素层数据写入地理数据库,并关闭数据库
{
	CGeoRecordset rs;
	CLayer *player;

	comGeoDataEngine.OpenLayerTable(m_GeoDatabase, &rs);
	POSITION pos = m_listLayer.GetHeadPosition();
	rs.MoveFirst();
	while( pos != NULL )
	{
		player = m_listLayer.GetNext(pos);
		if (!rs.GetEOF())
		{
			rs.Edit();
			comGeoDataEngine.SetLayerData(rs, player);
			rs.MoveNext();
		}
		delete player;
	}
	rs.Close();
	m_listLayer.RemoveAll();

	comGeoDataEngine.OpenWorkspaceTable(m_GeoDatabase, &rs);
	comGeoDataEngine.SetWorkspaceData(rs, this);
	rs.Update();
	rs.Close();

	m_GeoDatabase.Close();
}

⌨️ 快捷键说明

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