阅读:2431回复:4
[原创]C++builder6开发Mo详细代码
<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编辑过]
|
|
1楼#
发布于:2007-03-30 19:21
很好,支持,谢谢,我已经收录了,呵呵。
|
|
2楼#
发布于:2007-03-31 20:14
<img src="images/post/smile/dvbbs/em04.gif" />
|
|
3楼#
发布于:2007-04-02 20:59
<P>高手~~~~~~~~~~</P>
<P>感谢</P><img src="images/post/smile/dvbbs/em02.gif" /> |
|
4楼#
发布于:2008-06-11 23:30
谢谢,收藏
|
|