lhfde
路人甲
路人甲
  • 注册日期2006-05-23
  • 发帖数51
  • QQ
  • 铜币243枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:2272回复:4

[原创]C++builder6开发Mo详细代码

楼主#
更多 发布于:2007-03-27 19:56
<P>对处理数据要求不是很高,mo还是比较合适的。下面的代码是我用到的几个常用功能,其他没用到,就没去研究了,希望高手继续补充。  (gis帝国首发转载请保持完整。lhfde)                                                                   </P>
<P>1.创建新图层,打开图层<br><br>  //创建新图层<br>   double m_Lon,m_Lat;<br>   IMoDataConnectionPtr  pMoCon;<br>   IMoTableDescPtr     desc;<br>   IMoPointPtr         point;<br>   ADOTable1->First();</P>
<P><br>     pMoCon=(IDispatch*)CreateOleObject("MapObjects2.DataConnection");<br>     desc=(IDispatch*)CreateOleObject("MapObjects2.TableDesc");<br>     pMoCon->Database=WideString(" c:\\gis\\shp\\beijinmap");        //设置图层目录<br>       </P>
<P>if(pMoCon->Connect())<br>        {<br>       //创建新图层,设置名称、类型及字段。<br><br>        desc->set_FieldCount(6);<br>        desc->set_FieldType(0,moString);<br>        desc->set_FieldName(0,WideString("ID"));<br>        desc->set_FieldLength(0,5);   <br>        desc->set_FieldType(1,moString);<br>        desc->set_FieldName(1,WideString("AID"));<br>        desc->set_FieldLength(1,10);<br>        desc->set_FieldType(2,moString);<br>        desc->set_FieldName(2,WideString("BID"));<br>        desc->set_FieldLength(2, 10);<br>        desc->set_FieldType(3,moString);<br>        desc->set_FieldName(3,WideString("CID"));<br>        desc->set_FieldLength(3, 3);<br>        desc->set_FieldType(4,moString);<br>        desc->set_FieldName(4,WideString("DID"));<br>        desc->set_FieldLength(4, 8);<br>        desc->set_FieldType(5,moString);<br>        desc->set_FieldName(5,WideString("FLAG")); </P>
<P>        desc->set_FieldLength(5,3);</P>
<P><br>         //设置图层的记录集<br>        IMoGeoDatasetPtr geoDataset;<br>        geoDataset=pMoCon->AddGeoDataset(WideString("水系层"),moShapeTypePoint,desc);<br>        layer=(IDispatch*)CreateOleObject("MapObjects2.MapLayer");<br></P>
<P><br>        layer->set_GeoDataset(geoDataset);<br>        IMoRecordsetPtr recs(layer->Records);</P>
<P><br>        point=(IDispatch*)CreateOleObject("MapObjects2.Point");</P>
<P>         <br>        for(int i=1;i<=60;i++) //写记录数<br>        {</P>
<P>         recs->AddNew();<br>         String ID=ADOTable1->FieldByName("ID")->AsString;<br>        .....<br>          point->set_X(StrToFloat(ADOTable1->FieldByName("LONG")->AsString));<br>          point->set_Y(StrToFloat(ADOTable1->FieldByName("LAT")->AsString));<br>          recs->Fields->Item(TVariant("Shape"))->set_Value((TVariant)(IDispatch*)point);<br>          recs->Fields->Item(TVariant("ID"))->set_Value((TVariant)ID);</P>
<P>          recs->_Update();<br>          ADOTable1->Next();</P>
<P>          <br>          }<br>         recs->StopEditing();<br>//--------------------------------------------------------------------<br>       Map1->Layers->Add(layer);       <br>       Map1->CenterAt( point->get_X(),point->get_Y());<br>       </P>
<P>    }</P>
<P>}</P>
<P><br></P>
<P>2.放大,缩小,全图,漫游</P>
<P>       if (ZoomInBtn->Down)<br>        {<br>          IMoRectanglePtr trackRect = Map1->TrackRectangle();<br>          Map1->ControlInterface->Extent = trackRect;<br>          Map1->CenterAt(trackRect->Center->X,trackRect->Center->Y);<br>          Map2->ControlInterface->Extent=Map2->ControlInterface->Extent;<br>        }<br>        <br>         if (ZoomOutBtn->Down)<br>        {<br>           IMoRectanglePtr extRect = Map1->ControlInterface->Extent;<br>           extRect->ScaleRectangle(1.5);<br>           Map1->ControlInterface->Extent = extRect;<br>           Map2->ControlInterface->Extent=Map2->ControlInterface->Extent;<br>        }<br>    <br>         if (PanBtn->Down)<br>         {<br>           Map1->ControlInterface->Pan();<br>           Map2->ControlInterface->Extent=Map2->ControlInterface->Extent;<br>         }<br>        <br>         if (FullExtentBtn->Down)<br>         {<br>         IMoRectanglePtr fullExt = Map1->FullExtent;<br>         Map1->ControlInterface->Extent = fullExt;<br>         Map2->ControlInterface->Extent=Map2->ControlInterface->Extent;<br>         }<br>         <br></P>
<P>3.点选择</P>
<P>         IMoPointPtr pt,shape;<br>         IMoMapLayerPtr   layer;         </P>
<P>         layer=(IDispatch*)CreateOleObject("MapObjects2.MapLayer");<br>         layer=Map1->Layers->Item(TVariant(0));</P>
<P>         pt=Map1->ToMapPoint(X,Y);  //mousedown获取的坐标      <br>         g_Select=layer->SearchByDistance(pt,0.0015,WideString(""));</P>
<P>        或      </P>
<P>         n_Select=layer->SearchExpression(WideString("ID ='"+value+"' AND NameID</P>
<P>         ='"+Namevalue+"'"));</P><br><br><br>
<P>4.对图层rend。</P>
<P>   就是对图层上得symbol赋予自定义的颜色,字符等。</P>
<P>   IMoValueMapRendererPtr rd;</P>
<P>   IMoLabelRendererPtr    label;</P>
<P>   IMoGroupRendererPtr    layer_grouprend;</P>
<P>   IMoStringsPtr strings = (IDispatch*)CreateOleObject("MapObjects2.Strings");<br>         rst->MoveFirst();</P>
<P>         //设置rend层,注意如果keyword值相同,将只取其中一个</P>
<P>          while (! bool(rst->EOF_))<br>        {<br>        <br>        String strValue=rst->Fields->Item(TVariant(keyword))->ValueAsString;<br>        strings->Add(WideString(strValue));<br>        rst->MoveNext();<br>        j++;<br>          }</P>
<P><br>         rd->Field = WideString(keyword);//rend层和layer层对应的唯一属性<br>         rd->SymbolType=moPointSymbol;<br>         rd->ValueCount = strings->Count;</P>
<P>         //倒入windowstruetype字体<br>         IMoSymbolPtr    rend_sym;<br>         TFont* stdFont;<br>         _di_IFontDisp olefont;<br>         stdFont = new TFont();<br>         stdFont->Name = "ESRI Cartography";<br>         GetOleFont(stdFont, olefont);<br>         delete stdFont;<br>         //对rend层中每个对象定义不同符号<br>         for (int i = 0; i < strings->Count ; i ++)<br>        {<br>          rd->set_Value(i, strings->Item(TVariant(i)));<br>          rend_sym = rd->get_Symbol(i);<br>          rend_sym->Font = (IFontDisp**)(IDispatch*)olefont;<br>          rend_sym->Style =moTrueTypeMarker;<br>          rend_sym->Size = 16;<br>          rend_sym->CharacterIndex =78;<br>          rend_sym->Color = colorconst;<br>          rend_sym->Rotation=keyword;<br>        }</P>
<P>         layer->set_Renderer(rd);<br>         Map1->Refresh();<br>}</P>
<P>        </P>
<P>        IMoTextSymbolPtr    label_sym;<br>        label_sym = label->get_Symbol(0);<br>        label_sym->Font= (IFontDisp**)(IDispatch*)olefont;<br>        label_sym->HorizontalAlignment= moAlignLeft;<br>        label_sym->VerticalAlignment= moAlignBottom;<br>        label_sym->Fitted=true;<br>        label_sym->Color=moDarkGray;<br>        label->Field=WideString("ID");<br>        label->AllowDuplicates=False;</P><br><br><br>
<P>        layer_grouprend =(IDispatch*)CreateOleObject("MapObjects2.GroupRenderer");<br>        layer_grouprend->Add(rd);<br>        layer_grouprend->Add(label);          <br>        layer->set_Renderer(layer_grouprend);</P>
<P>5.划线</P>
<P>   IMoLinePtr         sectline;<br>   IMoPointsPtr       sectpoints;<br>   IMoPointPtr        pointA,pointB;</P>
<P><br>        sectline=(IDispatch*)CreateOleObject("MapObjects2.Line");</P>
<P>        pointA=(IDispatch*)CreateOleObject("MapObjects2.Point");<br>        pointB=(IDispatch*)CreateOleObject("MapObjects2.Point");        </P>
<P>        sectpoints=(IDispatch*)CreateOleObject("MapObjects2.Points");<br></P>
<P>        pointA->X=StrToFloat(ADOTable1->FieldByName("LONG")->AsString);<br>        pointA->Y=StrToFloat(ADOTable1->FieldByName("LAT")->AsString);<br>        sectpoints->Add(pointA);<br>        sectpoints->Add(pointB);<br>        sectline->Parts->Add(sectpoints);</P><br><br><br><br>
<P>6.动态跟踪层</P>
<P>void __fastcall TForm1::MapAfterTrackingLayerDraw(TObject *Sender,<br>      OLE_HANDLE hDC)<br>{<br>       IMoPointPtr mapPt;    </P>
<P>        IMoSymbolPtr sym;<br>        mapPt =Map->ToMapPoint(120,140);<br>        sym=(IDispatch*)CreateOleObject("MapObjects2.Symbol");<br>        TFont* stdFont;<br>        _di_IFontDisp olefont;<br>        stdFont = new TFont();<br>        stdFont->Name = "Wingdings";<br>        GetOleFont(stdFont, olefont);<br>        delete stdFont;<br>        sym->Font = (IFontDisp**)(IDispatch*)olefont;<br>        sym->Color = moBlue;<br>        sym->Style= moTriangleMarker;//moTrueTypeMarker;<br>        Map->DrawShape((IDispatch*)mapPt,sym);</P><br><br><br>
<P>}</P><br><br><br>
<P>7.坐标系(现成例子)</P>
<P>#ifndef Unit1H<br>#define Unit1H<br>//---------------------------------------------------------------------------<br>#include <Classes.hpp><br>#include <Controls.hpp><br>#include <StdCtrls.hpp><br>#include <Forms.hpp><br>#include "MapObjects2_OCX.h"<br>#include <ExtCtrls.hpp><br>#include <OleCtrls.hpp><br>#include <Dialogs.hpp><br>//---------------------------------------------------------------------------<br>class TForm1 : public TForm<br>{<br>__published: // IDE-managed Components<br>        TMap *Map1;<br>        TPanel *Panel1;<br>        TSplitter *Splitter3;<br>        TButton *Button1;<br>        TButton *Button2;<br>        TRadioButton *RadioButton1;<br>        TRadioButton *RadioButton2;<br>        TComboBox *ComboBox1;<br>        TOpenDialog *OpenDialog1;<br>        void __fastcall FormCreate(TObject *Sender);<br>        void __fastcall RadioButton1Click(TObject *Sender);<br>        void __fastcall RadioButton2Click(TObject *Sender);<br>        void __fastcall Button1Click(TObject *Sender);<br>        void __fastcall Button2Click(TObject *Sender);<br>private: // User declarations<br>public:  // User declarations<br>        __fastcall TForm1(TComponent* Owner);<br>        AnsiString __fastcall ExtractFileNameNoExt(AnsiString fileName);<br>        int __fastcall stripProj(String theProjection);<br>        <br>};<br>//---------------------------------------------------------------------------<br>extern PACKAGE TForm1 *Form1;<br>//---------------------------------------------------------------------------<br>#endif</P><br><br><br><br><br><br><br>
<P>//---------------------------------------------------------------------------</P>
<P>#include <vcl.h><br>#pragma hdrstop</P>
<P>#include "Unit1.h"<br>//---------------------------------------------------------------------------<br>#pragma package(smart_init)<br>#pragma link "MapObjects2_OCX"<br>#pragma resource "*.dfm"<br>TForm1 *Form1;<br>//---------------------------------------------------------------------------<br>__fastcall TForm1::TForm1(TComponent* Owner)<br>        : TForm(Owner)<br>{<br>}<br>//---------------------------------------------------------------------------</P>
<P>AnsiString __fastcall TForm1::ExtractFileNameNoExt(AnsiString fileName)<br>{<br>        //TOD Add your source code here<br>                int pos = fileName.Pos(".");<br>                AnsiString strResult = fileName.SubString(1,pos -1);<br>                return strResult;<br>        }</P>
<P>void __fastcall TForm1::FormCreate(TObject *Sender)<br>{<br>        IMoStringsPtr strGCS;<br>        strGCS = CreateOleObject("MapObjects2.Strings");<br>        strGCS->PopulateWithGeographicCoordSys();<br>        for(int i=0; i<strGCS->Count;i++)<br>        ComboBox1->Items->Add(AnsiString(strGCS->Item(Variant(i))));<br>        ComboBox1->ItemIndex = 0;<br>        }<br>//---------------------------------------------------------------------------</P>
<P>void __fastcall TForm1::RadioButton1Click(TObject *Sender)<br>{<br>        ComboBox1->Clear();<br>        IMoStringsPtr strGCS;<br>        strGCS = CreateOleObject("MapObjects2.Strings");<br>        strGCS->PopulateWithGeographicCoordSys();<br>        for(int i=0; i<strGCS->Count;i++)<br>        ComboBox1->Items->Add(AnsiString(strGCS->Item(Variant(i))));<br>        ComboBox1->ItemIndex = 0;<br>}<br>//---------------------------------------------------------------------------</P>
<P>void __fastcall TForm1::RadioButton2Click(TObject *Sender)<br>{<br>         ComboBox1->Clear();<br>        IMoStringsPtr strPCS;<br>        strPCS = CreateOleObject("MapObjects2.Strings");<br>        strPCS->PopulateWithProjectedCoordSys();<br>        for(int i=0; i<strPCS->Count;i++)<br>        ComboBox1->Items->Add(AnsiString(strPCS->Item(Variant(i))));<br>        ComboBox1->ItemIndex = 0;<br>}<br>//---------------------------------------------------------------------------<br>void __fastcall TForm1::Button2Click(TObject *Sender)<br>{<br>   if(RadioButton1->Checked)<br>        {<br>         IMoGeoCoordSysPtr gs=(IDispatch*)CreateOleObject("MapObjects2.GeoCoordSys");<br>         gs->Type = stripProj(ComboBox1->Text);<br>         Map1->CoordinateSystem=OleVariant((IDispatch*)gs);</P>
<P>         }<br>         else<br>         {<br>          IMoProjCoordSysPtr ps=(IDispatch*)CreateOleObject("MapObjects2.ProjCoordSys");<br>          ps->Type =stripProj(ComboBox1->Text);<br>          Map1->CoordinateSystem=OleVariant((IDispatch*)ps);<br>          }<br>   }</P>
<P>void __fastcall TForm1::Button1Click(TObject *Sender)<br>{<br>        if(OpenDialog1->Execute())<br>        {<br>         IMoMapLayerPtr layer=(IDispatch*)<br>         CreateOleObject("MapObjects2.MapLayer");<br>         IMoDataConnectionPtr dc;<br>         dc=(IDispatch*)CreateOleObject("MapObjects2.DataConnection");<br>         AnsiString name = ExtractFileDir(OpenDialog1->FileName);<br>         dc->Database=WideString(name).Detach();</P>
<P>         if(!bool(dc->Connect()))<br>         {<br>          MessageBox(NULL,"wrong","connect wrong !",MB_OK);<br>          return;<br>          }<br>          name =ExtractFileName(OpenDialog1->FileName);<br>          name =ExtractFileNameNoExt(name);<br>          layer->GeoDataset=dc->FindGeoDataset(WideString(name).Detach());<br>          IMoSymbolPtr sym=layer->Symbol;<br>          sym->Color =moRed;<br>          Map1->Layers->Add(layer);<br>          <br>          }<br>}</P><br><br><br>
<P>int __fastcall TForm1::stripProj(String theProjection)<br>{<br>        //TOD Add your source code here<br>        int openA,openB;<br>        openA= theProjection.Pos("[");<br>        openB=theProjection.Pos("]");<br>        String str=theProjection.SubString(openA+1,openB-openA-1);<br>        return StrToInt(str);<br>}</P><br><br><br>
<P>8.鹰眼(和第二步关联)</P>
<P>Map2->Layers->Add(bts_layer);</P><br><br><br>
<P>void __fastcall TMainFrame::Map2AfterLayerDraw(TObject *Sender,<br>      short index, VARIANT_BOOL canceled, OLE_HANDLE hDC)<br>{</P>
<P>        IMoSymbolPtr sym=(IDispatch*)CreateOleObject("MapObjects2.Symbol");<br>        sym->OutlineColor=moRed;<br>        sym->Outline=true;<br>        sym->SymbolType=moFillSymbol;<br>        sym->Style=moTransparentFill;<br>        Map2->DrawShape(Map1->ControlInterface->Extent,sym);<br>}</P>


<P>9,shp文件修改</P>
<P>
<TABLE  height="85%" width="95%" align=center border=0>

<TR>
<TD  vAlign=top width=* height="100%">
<P>          IMoRecordsetPtr  a_Select ;</P>
<P>        a_Select->Edit();<br>         a_Select->Fields->Item(TVariant("Name"))->set_Value((TVariant)"1");<br>         a_Select->_Update();<br>         a_Select->StopEditing();</P></TD></TR></TABLE>                                                              </P>
[此贴子已经被作者于2007-4-3 21:57:02编辑过]
喜欢0 评分0
雪山飞鸟
路人甲
路人甲
  • 注册日期2005-11-24
  • 发帖数25
  • QQ
  • 铜币202枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2007-03-30 19:21
很好,支持,谢谢,我已经收录了,呵呵。
举报 回复(0) 喜欢(0)     评分
whmwxhanshan123
路人甲
路人甲
  • 注册日期2006-06-17
  • 发帖数3108
  • QQ
  • 铜币6445枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2007-03-31 20:14
<img src="images/post/smile/dvbbs/em04.gif" />
举报 回复(0) 喜欢(0)     评分
水草
路人甲
路人甲
  • 注册日期2007-03-05
  • 发帖数1
  • QQ
  • 铜币105枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2007-04-02 20:59
<P>高手~~~~~~~~~~</P>
<P>感谢</P><img src="images/post/smile/dvbbs/em02.gif" />
举报 回复(0) 喜欢(0)     评分
zsloyes
路人甲
路人甲
  • 注册日期2006-11-07
  • 发帖数2
  • QQ
  • 铜币113枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2008-06-11 23:30
谢谢,收藏
举报 回复(0) 喜欢(0)     评分
游客

返回顶部