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)可以將整個圖元平移,但我沒有找到圖元的旋轉功能……

發佈了242 篇原創文章 · 獲贊 24 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章