算法测试:Demo、Test
https://www.cnblogs.com/2008nmj/p/10060847.html
//例1-1 简单要素 void AppendSFeature(CSFeatureCls *ptSFCls) { CAnyLine line; // 任意线(几何实体) CRecord linAtt; // 属性 LIN_INFO linInfo; // 图形参数 memset(&linInfo,0,sizeof(LIN_INFO)); CATT_STRU attStru;
//设置要素属性 ptSFCls->att_GetStru(attStru); linAtt.SetStru(attStru); for(int i = 0;i<attStru.hd.numbfield;i++) linAtt.SetFldFromStr(i,"Zondy");
//设置要素几何形态 line.m_linType = ARC_TYPE_BROKEN_LINE; D_DOT* dotset = new D_DOT[2]; dotset[0].x = 0; dotset[0].y = 0; dotset[1].x = 50; dotset[1].y = 50; line.m_varLin.Set(dotset,2); linInfo.linstyID = 6;
//在简单要素类里添加要素 TYPE_LIN_ID SfeaID = ptSFCls->line_Append(&line,&linAtt,&linInfo); delete []dotset; }
//例1-2 几何封装类 CMultiLine ptMultLin; D_DOT dot[2];
CGeomBasePTR *ptLine; ptLine = new CGeomBasePTR[2];
dot[0].x = 0; dot[0].y = 0; dot[1].x = 0; dot[1].y = 100; ptLine[0] = new CAnyLine; ptLine[1] = new CAnyLine; ((CAnyLine*)ptLine[0])->m_varLin.Append(dot,2); dot[0].x = 0; dot[0].y = 100; dot[1].x = 100; dot[1].y = 100; ((CAnyLine*)ptLine[1])->m_varLin.Append(dot,2);
ptMultLin.Set(ptLine,2);
delete (CAnyLine*) ptLine[0]; delete (CAnyLine*) ptLine[1]; delete []ptLine;
例2-1 创建基于文件的地理数据库 void OnCreateGdb(){ CGDataBase* GDateBase; CGDBServer* ptWA; char szName[] = "My TestGDB"; HDF_CREATE_MSG Msg;
memset(&Msg,0,sizeof(HDF_CREATE_MSG)); strcpy(Msg.HDFName,"D:\\MyTestGDB"); Msg.extendInfo.extendMode = 0; Msg.extendInfo.isExtendable = 1; Msg.extendInfo.maxFileSize = 0; Msg.size = 10;
ptWA = new CGDBServer; GDateBase = new CGDataBase;
if(ptWA->Connect("MapGisLocal")>0) GDateBase->Create(ptWA,szName,&Msg,1); ptWA->Disconnect();
delete ptWA; ptWA = NULL; delete GDateBase; GDateBase = NULL; }
例2-2 打开地理数据库 void OnOpengdb() { CGDBServer GDBSvr; CGDataBase GDB; GDBPATHINFO path; char user[30]=""; char pwsd[64]="";
long ptSelFlag = XCLS_TYPE_GDB; long selN = 1; if(ShowGDBShellDlg(path,&ptSelFlag,selN)>0) { GetLoginInfo(path.svcName,user,30,pwsd,64); if(GDBSvr.Connect(path.svcName,user,pwsd)>0)
if(GDB.Open(&GDBSvr,path.gdbName)>0) MessageBox("GDB打开成功!"); } }
例3-1 创建简单要素类(以混合要素类为例) void OnCREATECSFeaCls() { CGDBServer GDBSvr;
CGDataBase *ptGDB; //存储该要素类的地理数据库 GDBPATHINFO path; //地理数据库路径信息 long ptSelFlag=XCLS_TYPE_GDB; //文件类型为数据库 long selN=1; //文件类型个数 char user[30]=""; char pwsd[64]="";
CSFeatureCls *ptSFCls=NULL; //简单要素类对象指针 char SFclsName[]="TestSFeaCls"; //简单要素类名称 /*简单要素类所属的要素数据集的ID,dsID=0表示要创建的要素类 不属于某个要素数据集。*/ long DsID=0; long NetID=0; //简单要素类所在的几何网络的ID long srID=0; //空间参照系的id char AliasName[]="MyAliasName";//简单要素类的别名,不能超过128个字节 char ModelName[]="MyModelName"; //模板名称,不能超过128个字节 char *ptSubTypeField=NULL; //子类型的字段名,可为NULL,表示不划分子类型 //简单要素类的属性结构,该参数可以为NULL,表示没有属性 //如要创建属性结构,参考要素类的创建示例 CATT_STRU *fclsStru=NULL;
char fclsType=FCLS_SUNION_TYPE; //混合要素类 TYPE_FCLS_ID fclsid=0; //简单要素类ID;
ptGDB = new CGDataBase; ptSFCls = new CSFeatureCls;
if(ShowGDBShellDlg(path,&ptSelFlag,selN,0,"选择类")>0) //地理数据库目录选择对话框 { GetLoginInfo(path.svcName,user,30,pwsd,64); //得到对话框中的用户名和密码 if(GDBSvr.Connect(path.svcName,user,pwsd)>0) //服务器连接 if(ptGDB->Open(&GDBSvr,path.gdbName)>0) //打开地理数据库 { fclsid=ptSFCls->cls_Create(ptGDB, SFclsName, DsID, NetID, selN, AliasName, ModelName, ptSubTypeField, fclsStru,fclsType); } }
if(fclsid>0) AfxMessageBox("简单要素类创建成功!"); else AfxMessageBox("简单要素类创建失败!");
delete ptSFCls; ptSFCls=NULL;
delete ptGDB; ptGDB=NULL;
}
例3-2:添加一个要素(以几何形态为区(只有一圈弧段)的要素为例) void OnAppendsfeature(CSFeatureCls *ptSFCls) { CAnyPolygon reg; //多边形对象指针 D_DOT plydot[5]; //坐标点序列 TYPE_REG_ID objid; //多边形要素的id REG_INFO rinf; //多边形图形参数 long ptNe[2]; //记录多边形每条线上点数的数组 CGeomBasePTR *ptLine;
memset(&rinf,0,sizeof(REG_INFO)); rinf.libID = 0;
rinf.fillclr = 6; //区域填充色 rinf.endclr = 6; //区域填充结束色 rinf.patID = 1632; rinf.pathei = 5; //图案高 rinf.patwid = 5; //图案宽 rinf.patclr = 5; //图案颜色,图案颜色固定,即使渐变填充时也不变。 rinf.outpenw = 2; //图案笔宽
ptNe[0] = 1; //第一圈的弧段数 ptNe[1] = 0;
//构造多边型坐标 plydot[0].x=0; plydot[0].y=0; plydot[1].x=100; plydot[1].y=0; plydot[2].x=100; plydot[2].y=100; plydot[3].x=0; plydot[3].y=100; plydot[4].x=0; plydot[4].y=0;
ptLine = new CGeomBasePTR[2]; memset(ptLine,0,sizeof(CGeomBasePTR)*2);
ptLine[0] = new CAnyLine;
if(((CAnyLine*)(ptLine[0]))->m_varLin.Append(plydot,5,2)>0) { reg.Set(ptLine,ptNe,1); objid = ptSFCls->polygon_Append(®,NULL,&rinf); //添加多边形要素到简单要素类 if(objid>0) AfxMessageBox("添加区要素成功!"); } delete (CAnyLine*)ptLine[0]; delete[] ptLine; ptLine = NULL; }
例3-3 矩形查询示例(以区几何形态的要素类型为例) void OnRectAsk(CSFeatureCls *ptSFCls) { D_RECT rect; long rtn=-1; CSFeatureSet *ptSet=NULL; TYPE_OBJ_ID objid;
//构造矩形范围 rect.xmin = -100; rect.ymin = -100; rect.xmax = 1000; rect.ymax = 1000; ptSet = new CSFeatureSet;
rtn = ptSFCls->RectSelect(AnyPolygon_Type,&rect,ptSet); //矩形查询 if(rtn>0) { if(ptSet->GetObjCount()>0) { ptSet->MoveFirst(); do { ptSet->GetObjID(&objid); } while(ptSet->MoveNext()!=END_OF_SET); } }
else AfxMessageBox("查询结果集为空!");
delete ptSet; ptSet = NULL; }
例4-1 创建要素类 void OnCreatecfls() { CGDBServer GDBSvr; CGDataBase *ptGDB; //存储该要素类的地理数据库 GDBPATHINFO path; //地理数据库路径信息 long ptSelFlag=XCLS_TYPE_GDB; //文件类型为数据库 long selN=1; //文件类型个数
char user[30]=""; char pwsd[64]="";
char fclsType=FCLS_UNION_TYPE; //要素类的类型 TYPE_FCLS_ID fclsID; //要素类的 ID CFeatureCls *ptFCls=NULL; //要素类对象 char CFlsName[]="MyCFls"; //要素类的名字 long DsID=0; /*要素类所属的要素数据集的 ID,dsID=0 表示要创建的要素类不属于某个要素数据集。*/ long NetID=0; //要素类所在的几何网络的 ID long SrID=0; //空间参照系的 ID,<=0表示使用缺省参照系 char AliasName[]="MyAliasName";//要素类的别名,不能超过 128 个字节 char ModelName[]="MyModelName"; //模板名称,不能超过 128个字节 char *ptSubTypeField=NULL; //子类型的字段名
CATT_STRU *fclsStru=NULL; //要素类的属性结构 CFIELD_HEAD *field=NULL;
//以下是添加字段要属性结构中 field = new CFIELD_HEAD; fclsStru = new CATT_STRU; lstrcpy(field->fieldname,_T("MyAtt")); //字段名 field->fieldtype = STR_TYPE; //字段类型 field->msk_leng = 50; //字段字符长度 field->edit_enable =1; //字段是否可编辑 field->ptc_pos = -1; //字段在属性结构中的序号,新字段为-1 fclsStru->AppendFld(1,field); //添加字段 //字段添加完成
ptGDB = new CGDataBase; ptFCls = new CFeatureCls;
if(ShowGDBShellDlg(path,&ptSelFlag,selN,0,"选择类")>0) //地理数据库目录选择对话框 { GetLoginInfo(path.svcName,user,30,pwsd,64); //得到对话框中的用户名和密码 if(GDBSvr.Connect(path.svcName,user,pwsd)>0) //服务器连接 { if(ptGDB->Open(&GDBSvr,path.gdbName)>0) //打开地理数据库 //在打开的地理数据库中创建要素类 fclsID=ptFCls->fcls_Create(ptGDB,CFlsName,DsID,NetID,SrID, AliasName,ModelName, ptSubTypeField,fclsStru,fclsType); } }
if(fclsID>0) { ptFCls->fcls_Close(); AfxMessageBox("创建成功!"); } else AfxMessageBox("创建失败!");
delete ptGDB; ptGDB=NULL; delete ptFCls; ptFCls = NULL; delete field; field = NULL; delete fclsStru; fclsStru = NULL;
}
例4-2 添加要素 void WINAPI AppendFeature(CFeatureCls *ptFCls) { CAnyLine arc; CArcIDs ArcIDs; REG_INFO rinf; D_DOT xy1[3]; D_DOT xy2[2]; CFeature feature; long fclsID;
xy1[0].x = 0; xy1[0].y = 100; xy1[1].x = 0; xy1[1].y = 0; xy1[2].x = 100; xy1[2].y = 0;
xy2[0].x = 100; xy2[0].y = 0; xy2[1].x = 0; xy2[1].y = 100;
arc.m_linType = ARC_TYPE_BROKEN_LINE; arc.m_varLin.Set(&xy1,3);
TYPE_ARC_ID arcid = ptFCls->arc_Append(arc); arc.m_varLin.Set(&xy2,2); TYPE_ARC_ID arcid1 = ptFCls->arc_Append(arc);
ArcIDs.Add(arcid); ArcIDs.Add(arcid1);
memset(&rinf,0,sizeof(REG_INFO)); rinf.libID = 0;
rinf.fillclr = 6; //区域填充色 rinf.endclr = 0; //区域填充结束色 rinf.patID = 8; rinf.pathei = 5; //图案高 rinf.patwid = 5; //图案宽
REG_INFO_ID rinfID=ptFCls->rinf_Append(rinf); TYPE_GEOM_ID gregID=ptFCls->greg_Append(ArcIDs,rinfID);
fclsID =ptFCls->GetSpaceID(); feature.m_geom.New(1);
feature.m_geom[0].geomType=GEOM_REG_TYPE; feature.m_geom[0].geomID = gregID; feature.m_geom[0].fclsID = fclsID; feature.m_geom[0].infID = rinfID;
CATT_STRU stru; if(ptFCls->att_GetStru(stru)>0) { feature.m_att.SetStru(stru); for(int i=0;i<stru.hd.numbfield;i++) feature.m_att.SetFldFromStr(i,"Test"); }
TYPE_FID fID = ptFCls->f_Append(feature); }
例4-3 取要素引用信息和坐标
Void GetFeaturePos(CFeatureCls* fCls, TYPE_FID fID) { //一、直接通过要素类成员函数f_GetGeomPos取坐标 CPolyGeometry geoms; fCls->f_GetGeomPos(fID,geoms); D_DOT *xy = geoms.ptXY(); //D_DOT *xy是要素的空间坐标信息
//二、通过要素类成员函数f_Get取(几何引用->空间引用) CFeature f; GEOM_REF *ptGeomRef; //要素的几何实体信息 long geomNum; //要素的几何实体的个数 CDotIDs dat; //几何引用的空间点数据对象 ID 序列 CArcIDs ldat,rdat; //几何引用的空间弧段数据对象 ID 序列
int j,k;
int num; D_3DOT dot; CVarLine ldot,rdot; //线的折线坐标
if(fCls->f_Get(fID,f)>0) //得到一个要素 { geomNum = f.m_geom.GetGeomNum(); //取要素引用几何实体的个数 ptGeomRef = f.m_geom.GetBufPtr(); //取要素的引用几何实体的信息 //循环操作几何实体 for(int i=0;i<geomNum;i++) { switch(ptGeomRef[i].geomType) { case GEOM_PNT_TYPE: //判断几何实体的类型 //取点实体引用的空间点数据对象 ID序列 fCls->gpnt_Get(ptGeomRef[i].geomID,dat); num = dat.GetSize(); for(j=0;j<num;j++) { //dot是点数据对象 ID 为 dat[j]的坐标 fCls->dot_GetPos(dat[j],dot); } break; case GEOM_LIN_TYPE: //取线实体引用的空间弧段数据对象ID 序列 fCls->glin_Get(ptGeomRef[i].geomID,ldat); num = ldat.GetSize(); if(num!=0) { for(j=0;j<num;j++) { fCls->arc_GetPos(abs(ldat[j]),ldot); //取弧段坐标信息
for(k=0;k<ldot.dotNum();k++) { double x = ldot.GetX(k); //x,y,z 是坐标信息 double y = ldot.GetY(k); double z = ldot.GetZ(k); } } } break; case GEOM_REG_TYPE: //取区实体引用的空间弧段数据对象ID 序列
fCls->greg_Get(ptGeomRef[i].geomID,rdat); num = rdat.GetSize(); if(num!=0) { for(j=0;j<num;j++) { fCls->arc_GetPos(abs(rdat[j]),rdot); //取弧段坐标信息 for(k=0;k<rdot.dotNum();k++) { double x = rdot.GetX(k); //x,y,z 是坐标信息 double y = rdot.GetY(k); double z = rdot.GetZ(k); }
} } break; default: ; }
} } }
例4-4 更新要素的属性 void UpdateFeatureAtt(CFeatureCls* fCls, TYPE_FID fID) { CFeature f; //要素 CRecord attRcd; //属性记录 CATT_STRU stru; //属性结构 char strtemp[]="test";
if(fCls->f_Get(fID,f)>0) { if(f.m_att.GetStru(stru)>0) //得到要素的属性结构 { for(int i=0;i<stru.hd.numbfield;i++) //循环每个字段 { long rtn = f.m_att.SetFldFromStr(i,strtemp); //设字段的值
attRcd = f.m_att; fCls->att_Update(fID,attRcd) ; //更新要素的属性 } } } }
例4-5 属性查询 void FAttSelect(CFeatureCls* fCls) { char condition[]="test='test'"; long subTypeCode=-1; //子类型字段的值,该参数缺省为-1 char orderByFld[]="OID"; //结果排序字段名 char isAsc=1; CATT_STRU *ptStru=NULL; CConditionOBJ *ptConObj=NULL; //查询条件 CFeatureSet *ptSet=NULL; //返回查询结果集 TYPE_OBJ_ID objid;
ptConObj = new CConditionOBJ; ptSet = new CFeatureSet; ptConObj->SetAttCondition(condition);
if(fCls->f_AttSelect(ptConObj, ptSet, subTypeCode, orderByFld, isAsc)>0) //属性查询 { if(ptSet->GetObjCount()>0) { ptSet->MoveFirst(); do { ptSet->GetObjID(&objid); //取结果集里的所有对象 } while(ptSet->MoveNext()!=END_OF_SET); } }
delete ptConObj; ptConObj=NULL; delete ptSet; ptSet=NULL;
}
例5-1-1 取对象类属性结构 void OnGetCObjAttStru(CObjectCls* ptCObjectCls) { CATT_STRU stru; //对象类属性结构 CString str;
if(ptCObjectCls->att_GetStru(stru)>0) //取属性结构 { for(int i=0;i<stru.hd.numbfield;i++) //循环字段 { str.Format("%s",stru.fldEntry[i].fieldname); //取字段名 MessageBox(str); } } }
例5-1-2 设置对象类属性结构
void OnSetcobjattstur(CObjectCls* ptCObjectCls) { CATT_STRU stru; //对象类的属性结构 CFIELD_HEAD fldhead; //字段信息 CExtFIELD_HEAD extfldhead(LONG_TYPE,1); //字段的扩展信息 TYPE_XCLS_ID dmn_ID = 1; //域集 ID
lstrcpy(fldhead.fieldname,_T("APPENDFIELD")); //字段名 fldhead.fieldtype = LONG_TYPE; //字段类型 fldhead.ptc_pos = -1; //字段在属性结构中的序号 fldhead.msk_leng = 10; //字段字符长度
lstrcpy(extfldhead.m_alias,_T("MyField")); //字段扩展信息 extfldhead.m_IsNull = 1; extfldhead.SetDefVal(10); extfldhead.SetMinVal(1); extfldhead.SetMaxVal(90);
extfldhead.m_dmnID = dmn_ID; //所属域集 ID
fldhead.SetExtFIELD_HEAD(&extfldhead); if(stru.AppendFld(1,&fldhead)>0) //添加字段 { if(ptCObjectCls->att_SetStru(stru)>0) //设置对象类属性结构 AfxMessageBox("对象类属性结构创建成功!"); }
}
例5-1-3添加记录(所有字段)
void OnAppendRecordALL(CObjectCls* ptCObjectCls) {
CATT_STRU stru; TIME_STRU timeval; //时间记录结构体 short sht=100; char str[]="zondy"; char chr='A'; __int64 i64=1000; DATE_STRU date;
//设置时间 timeval.hour = 23; timeval.sec = 30; timeval.min = 20;
date.day = 23; date.mon=1; date.year=2006;
if(ptCObjectCls->att_GetStru(stru)>0) //取对象类的属性结构 { CRecord rcd(&stru); for(short i=0;i<stru.hd.numbfield;i++) { switch(stru.fldEntry[i].fieldtype) //判断字段的类型
{ case LONG_TYPE: rcd.SetLongVal(i,1000); //设置长整型字段的值 break; case TIME_TYPE: rcd.SetTimeVal(i,timeval); //设置时间型字段的值 break; case SHORT_TYPE: rcd.SetShortVal(i,sht); //设置短整型字段的值 break; case BYTE_TYPE: //设置字节类型字段的值 rcd.SetCharVal(i,chr); break; case INT64_TYPE: rcd.SetInt64Val(i,i64); //设置 64 位长整型字段的值 break; case DATE_TYPE: //设置日期型字段的值 rcd.SetDateVal(i,date); break; default: rcd.SetFldNull(i); } } if(ptCObjectCls->att_Append(rcd)>0) //添加记录到对象类中 AfxMessageBox("记录添加成功!");
} }
例5-1-4 记录查询
void OnRecordSelect(CObjectCls* ptCObjectCls) { //查询(有条件表达式对话框) TYPE_OBJ_ID ObjID; //对象 ID CConditionOBJ condition; //查找条件对象 CObjectSet ObjSet; //对象集合 CATT_STRU stru; char expStr[255]; long len=255;
memset(&stru,0,sizeof(CATT_STRU));
ptCObjectCls->att_GetStru(stru); if(Tool_ShowAttExpSel(stru,"输入表达式",expStr,&len)>0) { condition.SetAttCondition(expStr); if(ptCObjectCls->Select(&condition,&ObjSet)>0) { if(ObjSet .GetObjCount()>0) { ObjSet .MoveFirst(); do { ObjSet .GetObjID(&ObjID); //取结果集里的所有对象 } while(ptSet.MoveNext()!=END_OF_SET); } } }
例5-1-5 设置子类型
void OnSetSubTypeFld(CObjectCls* ptCObjectCls) { CATT_STRU stru; if(ptCObjectCls->att_GetStru(stru)>0) { //设置子类型对象,此字段类型必须是长整或短整型 //参数传NULL或""则取消子类型字段设置 if(ptCObjectCls->subT_SetSubTypeField(stru.fldEntry[0].fieldname)>0) AfxMessageBox("子类型对象设置成功!"); } }
例5-2-1 创建关系类 Void OnCreatecrelationcls() { CRelationCls *ptCRelationCls; //关系类对象指针 CGDBServer GDBSvr; CGDataBase *ptGDB=NULL; GDBPATHINFO path; long ptSelFlag=XCLS_TYPE_GDB; char user[30]=""; char pwsd[64]=""; char ptRclsName[]="MyRelationCls"; //关系类名称 long dsID=0; //要素数据集 ID TYPE_XCLS_ID origClsID=4; //原始类 ID TYPE_XCLS_ID destClsID=5; //目的类 ID short origClsType=XCLS_TYPE_FCLS; //原始类类型码
short destClsType=XCLS_TYPE_FCLS; //目的类类型码 char ptFwardLabel[]="FwardLabel"; //向前标签 char ptBwardLabel[]="BwardLabel"; //向后标签 short cardinality=REL_CARD_1_1; //映射类型 short notification=REL_NOTIFY_BOTH; //通知类型 char relType=REL_TYPE_ASSOCIATE; //关系类类型 char isAttributed=0; //指定关系类是否属性化 CATT_STRU *stru=NULL; //属性结构 char origPKey[]="OID"; //原始类主键 char destPKey[]="OID"; //目的类主键 char origFKey[]="q"; //原始类外键 char destFKey[]=""; //目的类外键 TYPE_OCLS_ID clsid=0;
ptGDB = new CGDataBase; ptCRelationCls = new CRelationCls;
if(ShowGDBShellDlg(path,&ptSelFlag,1)>0) { GetLoginInfo(path.svcName,user,30,pwsd,64); if(GDBSvr.Connect(path.svcName,user,pwsd)>0) if(ptGDB->Open(&GDBSvr,path.gdbName)>0) //打开地理数据库 { //创建关系类 clsid = ptCRelationCls->Create(ptGDB, ptRclsName, dsID, origClsID, destClsID, origClsType, destClsType, ptFwardLabel, ptBwardLabel, cardinality, notification, relType, isAttributed, stru, origPKey, destPKey, origFKey, destFKey); } }
if(clsid>0) AfxMessageBox("关系类创建成功!"); else AfxMessageBox("关系类创建失败!");
delete ptCRelationCls; ptCRelationCls=NULL; delete ptGDB; ptGDB=NULL; }
例5-2-2 取关系类型
void OnGetCRelationclsType(CRelationCls* ptCRelationCls) { char crlsType; if(ptCRelationCls->GetRelationType(crlsType)>0) { switch(crlsType) { case REL_TYPE_ASSOCIATE: AfxMessageBox("关联关系"); break; case REL_TYPE_COMPOSITE: AfxMessageBox("组合关系"); break; case REL_TYPE_DEPENDENCE: AfxMessageBox("依赖关系/引用关系"); break; case REL_TYPE_INHERITED: AfxMessageBox("继承关系"); break; case REL_TYPE_META: AfxMessageBox("元关系"); break; default: ; } } }
例6-1 添加注记 void OnAppendAnnotation(CAnnotationCls* ptCAnnotationCls) { /*添加文本注记************************************
D_DOT xy; //注记位置 CAnnDat dat; //注记信息封装类 TYPE_FID fID=0; //与注记关联的要素 id CRecord *ptRcd=NULL; //注记的属性记录(可以为NULL,CRecord 用法可以参照对象类一章) char ptTxt[]="Zondy"; //注记的内容 ANN_STR_INFO strinfo; //注记的可视化信息 memset(&strinfo,0,sizeof(ANN_STR_INFO));
//初始化注记的可视化信息结构 strinfo.height=5; strinfo.width=5; strinfo.iclr=5;
xy.x=100; xy.y=100;
dat.m_type = ANN_TYPE_STR; //注记类型为字符串注记类型(必须先指定类型) dat.SetTxt(ptTxt); dat.SetInfo((char*)&strinfo);
TYPE_AID AID = ptCAnnotationCls->Append(&xy, dat, fID, ptRcd); //添加注记 if(AID>0) AfxMessageBox("添加注记成功!"); else AfxMessageBox("添加注记失败!"); ***************************************************************/
///*添加 html注记********************* D_DOT xy; //注记位置 CAnnDat dat; //注记信息封装类 TYPE_FID fID=0; //与注记关联的要素 id CRecord *ptRcd=NULL; //注记的属性记录(可以为NULL,CRecord 用法可以参照对象类一章) char ptTxt[]="<p><strong><em><u><strike><font color='#ff0080'>zondy</font></strike></u></em></strong></p>"; ANN_HTML_INFO htmlinfo; //注记的可视化信息 TMPL_INFO tmplinfo; memset(&htmlinfo,0,sizeof(ANN_HTML_INFO)); memset(&tmplinfo,0,sizeof(TMPL_INFO));
//初始化注记的可视化信息结构 htmlinfo.height=20; htmlinfo.width=20;
//初始化注记模板信息 tmplinfo.iclr=5;
xy.x=100; xy.y=100;
dat.m_type = ANN_TYPE_HTML; //注记类型为 HTML注记类型(必须先指定类型) dat.SetTxt(ptTxt); dat.SetInfo((char*)&htmlinfo); dat.SetTmplInfo(tmplinfo);
TYPE_AID AID = ptCAnnotationCls->Append(&xy, dat, fID, ptRcd); //添加注记 if(AID>0) AfxMessageBox("添加注记成功!"); else AfxMessageBox("添加注记失败!");
//**********************************/ }
例6-1 取注记信息
Void OnGetAnnotationInfo(CAnnotationCls* ptCAnnotationCls,TYPE_AID id) { D_DOT xy; //注记坐标 D_RECT rc; //注记外包矩形 TYPE_FID fID; //和注记相关的要素 ID CAnnDat dat; //注记数据信息(具体参阅 basclass70.h) char *str;
if(ptCAnnotationCls) { if(ptCAnnotationCls->Get(id,&xy, &rc, &fID,dat)>0) //取注记信息 str = dat.GetTxt(); //CAnnDat参阅 basclass70.h或添加注记代码 CString cstr; cstr.Format("取注记信息成功!内容是%s",str); MessageBox(cstr); }
}
例7-1 要素类添加拓扑规则() void CCAnnotationClsView::OnAddRule(CFeatureCls* ptCFeaCls) { CTopRule toprule; //拓扑规则类
X_CLS_FCLS fclInf; CGDataBase *GDB; //地理数据库 GDB = ptCFeaCls->GetGDataBase(); //取要素类的地理数据库 if(ptCFeaCls->fcls_GetInfo(fclInf)>0) { if(fclInf.ftype==FCLS_LIN_TYPE) //判断要素类的类型是否是线要素类 { toprule.origClsID=fclInf.ID; //定义原始类的 ID toprule.destClsID=fclInf.ID; //定义目的类的 ID toprule.topType=LINE_NO_INTERSECTORINTERIORTOUCH; //定义拓扑规则的类型 TYPE_RULE_ID ruleID = GDB->rule_Add(fclInf.ID,&toprule);//添加规则 if(ruleID>0) AfxMessageBox("拓扑规则添加成功"); } } }
例7-2 规则有效性检查 void OnValidateRule(CFeatureCls* ptCFeaCls,TYPE_RULE_ID ruleID) { CSmartArray<RULE_ERR_INFO> err; //不符合规则的 ID RULE_ERR_INFO errinfo; if(ptCFeaCls->rule_ValidateCls(ruleID,err)>0) //规则有效性检查 { for(int i=0;i<err.GetSize();i++) //循环取不符合规则的 ID errinfo = err.GetAt(i); } }
例7-3 GSQL void OnGsqExecute(CGDataBase *ptOriGDB,CGDataBase *ptDesGDB) { //需要执行的GSQL语句 char gsql[]="SET @CLS-SC-ROAD = SELECT ATT FROM FCLS.SC-ROALK AS ROALK WHERE RN LIKE 'G%' ORDER BY RN;"; char errStr[255]; CGSQLBlock gsqlblock; if(gsqlblock.gsql_CreatEnv(ptoriGDB,ptdesGDB)>0) //分配 GSQL环境 if(gsqlblock.gsql_Prepare(gsql,sizeof(gsql))>0) //准备执行 GSQL语句 if(gsqlblock.gsql_Execute(0)>0) //执行 GSQL语句 { gsqlblock.gsql_ReleaseEnv(); //释放 GSQL环境 AfxMessageBox("GSQL执行成功!"); } else { gsqlblock.gsql_GetErrStr(errStr); //得到执行GSQL语句的错误信息
AfxMessageBox(errStr); gsqlblock.gsql_ReleaseEnv(); } }
MapGIS三维开发类库:
空间分析功能:
|
请发表评论