zoukankan      html  css  js  c++  java
  • MapGIS SDK(C++)【基础篇】

    算法测试: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(&reg,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三维开发类库:

    空间分析功能:

  • 相关阅读:
    第三周作业
    xxx生成式
    生成器
    迭代器
    叠加多个装饰器的执行原理
    装饰器——有参装饰器
    装饰器
    修改linux主机名称
    安装nagios出现的两个错误记录
    导入CSV文件之后出现换行符问题
  • 原文地址:https://www.cnblogs.com/2008nmj/p/10655284.html
Copyright © 2011-2022 走看看