mpx程序from 阿明

1、MapX折线图元的画法

    CMapXPoints pts;
    CMapXPoint pt;
    CMapXStyle sty;
    CMapXFeature f,newobj,newobj1,newobj2;

    if(!pts.CreateDispatch(pts.GetClsid()))
    {
        TRACE0("Failed to create Points collection");
        return;
    }
    if(!pt.CreateDispatch(pt.GetClsid()))
    {
        TRACE0("Failed to create Point collection");
        return;
    }
    if(!newobj.CreateDispatch(newobj.GetClsid()))
    {
        TRACE0("Failed to create Feature collection");
        return;
    }

        Position position;
        double x,y,mapLat,mapLon;
        for(lisPosIt=lisPos.begin();lisPosIt!=lisPos.end();lisPosIt++)
        {
            position=*lisPosIt;
            x=position.z/1000.0;
            y=position.x/1000.0;
            XYToLL(y,x,&mapLon,&mapLat);  //将普通坐标转化经纬度坐标。
            pt.Set(mapLon,mapLat);   //设置点的坐标(默认经纬度)。
            pts.Add(pt);   //将点加入点集。
        }
        newobj.Attach(m_ctrlMapX.GetDispatch());  //将图元与地图绑定。
        newobj.SetType(miFeatureTypeLine);  //设置图元类型为折线图元
        newobj.GetParts().Add(pts);    //将点集pts加入图元

        sty=newobj.GetStyle();  //得到图元的风格,下面设置各种图元的风格。
        sty.SetLineStyle(57);   //设置折线风格,可查看开发手册。
        sty.SetLineColor(miColorGreen); //设置折线颜色
        sty.SetLineWidthUnit(miStyleUnitPixel);  //设置折线宽度单位为像素
        sty.SetLineWidth(2);  //设置折线宽为2像素

        f=m_RoadLayer.AddFeature(newobj);
        CString m_keyValue=f.GetFeatureKey(); //此行设置加入折线图元的键值,该键值是该图元在图层中的唯一性标识,再想取得图元并更改的话可以调用m_RoadLayer.GetFeatureByKey(m_keyValue)来获得。
        m_RoadLayer.Invalidate();  //重绘图层。

建议:义超,对于动态绘制尾迹,应该可以用如下方法,有一个点时用上面的方法创建一个只有一个点的折线图元并加入图层,每次需要加入新的点绘制新的轨迹时,
先通过键值获得刚加入的图元:CMapXFeature fea=m_RoadLayer.GetFeatureByKey(m_keyValue);
再调用fea.GetParts().Item(1).Add(pt)加入新的轨迹点pt,再调用m_RoadLayer.Invalidate(),这样不需要擦掉原先绘制的点,每次往图元中加入的新的点既可,效率应该还行,你可以试试。
fea.GetParts().Item(1)是获得该折线图元中的第一个点集,一个折线图元中只有一条折线的话,这样就可以获得。

2、MapX多边形图元的画法与上面一样,只要将newobj.SetType(miFeatureTypeLine)中的参数改成miFeatureTypeRegion就行了,注意点的顺利为多边形顺时针或逆时针顺序。
另外多边形图元的style属性和线性图元的有些区别,具体的可以查看开发文档中style的属性。例子如下:
    for(int i=0;i<5;i++)
    {
        position=b[i];
        x=position.z;
        y=position.x;
        XYToLL(x,y,&mapLon1,&mapLat1);
        pt.Set(mapLon1,mapLat1);
        pts.Add(pt);
    }
    newobj2.Attach(m_ctrlMapX.GetDispatch());
    newobj2.SetType(miFeatureTypeRegion);
    newobj2.GetParts().Add(pts);
    sty=newobj2.GetStyle();
    sty.SetRegionBorderWidth(2);
    sty.SetRegionPattern(8);
    sty.SetRegionColor(miColorGreen);
    sty.SetRegionTransparent(TRUE);
    f=m_RoadLayer.AddFeature(newobj2);
    m_RoadLayer.Invalidate();

3、MapX点图元的画法
    CMapXFeature fLan;
    if(!fLan.CreateDispatch(fLan.GetClsid()))
    {
        TRACE0("Failed to Create Feature object");
        return;
    }
    fLan.Attach(m_ctrlMapX.GetDispatch());
    fLan.SetType(miFeatureTypeSymbol);   //设置图元类型为符号图元(点图元)
    double malpx,malpy;
    XYToLL(133,90,&malpx,&malpy);
    fLan.GetPoint().Set(malpx,malpy);  //设置点图元的位置
    fLan.GetStyle().SetSymbolType(miSymbolTypeBitmap);  //设置点图元的表现形式为位图(还可以用字符表现)
    fLan.GetStyle().SetSymbolBitmapSize(20);   //设置显示的位图大小为20
    fLan.GetStyle().SetSymbolBitmapTransparent(TRUE);  //设置位图为透明背景
    fLan.GetStyle().SetSymbolBitmapName("敌坦克.bmp");  //设置位图名
    CMapXFeature res = m_tankLayer.AddFeature(fLan);
    CString m_LanKeyValue=res.GetFeatureKey();
    m_tankLayer.Invalidate();

另外,图元可以平移,例如调用f.Offset(x,y)可以将整个图元平移,但我没有找到图元的旋转功能……

posted @ 2010-12-15 13:44  frogrocket  阅读(390)  评论(0编辑  收藏  举报