MoLectureView.cpp
上传用户:qinfarui
上传日期:2022-08-10
资源大小:362k
文件大小:23k
源码类别:

GIS编程

开发平台:

Visual C++

  1. // MoLectureView.cpp : implementation of the CMoLectureView class
  2. //
  3. #include "stdafx.h"
  4. #include "MoLecture.h"
  5. #include "MoLectureDoc.h"
  6. #include "MoLectureView.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CMoLectureView
  14. IMPLEMENT_DYNCREATE(CMoLectureView, CFormView)
  15. BEGIN_MESSAGE_MAP(CMoLectureView, CFormView)
  16. //{{AFX_MSG_MAP(CMoLectureView)
  17. ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
  18. ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
  19. ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
  20. ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
  21. ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
  22. ON_BN_CLICKED(IDC_BUTTON7, OnButton7)
  23. ON_BN_CLICKED(IDC_BUTTON8, OnButton8)
  24. ON_BN_CLICKED(IDC_BUTTON9, OnButton9)
  25. ON_BN_CLICKED(IDC_BUTTON10, OnButton10)
  26. ON_BN_CLICKED(IDC_BUTTON11, OnButton11)
  27. ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
  28. ON_BN_CLICKED(IDC_BUTTON12, OnButton12)
  29. ON_BN_CLICKED(IDC_BUTTON13, OnButton13)
  30. ON_BN_CLICKED(IDC_BUTTON14, OnButton14)
  31. ON_BN_CLICKED(IDC_BUTTON15, OnButton15)
  32. ON_BN_CLICKED(IDC_BUTTON16, OnButton16)
  33. ON_BN_CLICKED(IDC_BUTTON17, OnButton17)
  34. ON_BN_CLICKED(IDC_BUTTON18, OnButton18)
  35. ON_BN_CLICKED(IDC_BUTTON19, OnButton19)
  36. ON_BN_CLICKED(IDC_BUTTON20, OnButton20)
  37. ON_BN_CLICKED(IDC_BUTTON21, OnButton21)
  38. ON_BN_CLICKED(IDC_BUTTON22, OnButton22)
  39. ON_BN_CLICKED(IDC_BUTTON23, OnButton23)
  40. ON_BN_CLICKED(IDC_BUTTON24, OnButton24)
  41. ON_BN_CLICKED(IDC_BUTTON25, OnButton25)
  42. //}}AFX_MSG_MAP
  43. // Standard printing commands
  44. ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
  45. ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
  46. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CMoLectureView construction/destruction
  50. CMoLectureView::CMoLectureView()
  51. : CFormView(CMoLectureView::IDD)
  52. {
  53. //{{AFX_DATA_INIT(CMoLectureView)
  54. m_X = 0.0;
  55. m_Y = 0.0;
  56. m_strQuery = _T("");
  57. //}}AFX_DATA_INIT
  58. // TODO: add construction code here
  59. m_ToolNum = -1;
  60. }
  61. CMoLectureView::~CMoLectureView()
  62. {
  63. }
  64. void CMoLectureView::DoDataExchange(CDataExchange* pDX)
  65. {
  66. CFormView::DoDataExchange(pDX);
  67. //{{AFX_DATA_MAP(CMoLectureView)
  68. DDX_Control(pDX, IDC_LIST1, m_ListAttribute);
  69. DDX_Control(pDX, IDC_MAP1, m_Map);
  70. DDX_Text(pDX, IDC_EDIT1, m_X);
  71. DDX_Text(pDX, IDC_EDIT2, m_Y);
  72. DDX_Text(pDX, IDC_EDIT4, m_strQuery);
  73. //}}AFX_DATA_MAP
  74. }
  75. BOOL CMoLectureView::PreCreateWindow(CREATESTRUCT& cs)
  76. {
  77. // TODO: Modify the Window class or styles here by modifying
  78. //  the CREATESTRUCT cs
  79. return CFormView::PreCreateWindow(cs);
  80. }
  81. //初始化鹰眼无模态对话框
  82. void CMoLectureView::OnInitialUpdate()
  83. {
  84. CFormView::OnInitialUpdate();
  85. GetParentFrame()->RecalcLayout();
  86. ResizeParentToFit();
  87. pEyeDlg = new CEyeDlg;
  88.     pEyeDlg->Create(IDD_EYEDLG,NULL);
  89.     pEyeDlg->ShowWindow(SW_HIDE); 
  90. }
  91. /////////////////////////////////////////////////////////////////////////////
  92. // CMoLectureView printing
  93. BOOL CMoLectureView::OnPreparePrinting(CPrintInfo* pInfo)
  94. {
  95. // default preparation
  96. return DoPreparePrinting(pInfo);
  97. }
  98. void CMoLectureView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  99. {
  100. // TODO: add extra initialization before printing
  101. }
  102. void CMoLectureView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  103. {
  104. // TODO: add cleanup after printing
  105. }
  106. void CMoLectureView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
  107. {
  108. // TODO: add customized printing code here
  109. }
  110. /////////////////////////////////////////////////////////////////////////////
  111. // CMoLectureView diagnostics
  112. #ifdef _DEBUG
  113. void CMoLectureView::AssertValid() const
  114. {
  115. CFormView::AssertValid();
  116. }
  117. void CMoLectureView::Dump(CDumpContext& dc) const
  118. {
  119. CFormView::Dump(dc);
  120. }
  121. /*CMoLectureDoc* CMoLectureView::GetDocument() // non-debug version is inline
  122. {
  123. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMoLectureDoc)));
  124. return (CMoLectureDoc*)m_pDocument;
  125. }*/
  126. #endif //_DEBUG
  127. /////////////////////////////////////////////////////////////////////////////
  128. // CMoLectureView message handlers
  129. //添加图层
  130. void CMoLectureView::OnButton1() 
  131. {
  132. // TODO: Add your control notification handler code here
  133. //选择图层文件
  134. CFileDialog dlg(true, ".shp","*.shp",OFN_HIDEREADONLY,"Shape文件(*.shp)|*.shp",NULL);
  135. CString str;
  136. if (dlg.DoModal()==IDOK)
  137. {
  138. str=dlg.GetPathName();
  139. }
  140. else
  141. return;
  142. //封装在MapHelper.h中的全局函数
  143.    AddLayer(m_Map,str);
  144.    //在主视图添加数据的同时也给鹰眼视图添加数据
  145.    AddLayer(pEyeDlg->m_EyeMap,str);
  146. }
  147. //添加栅格影像图层
  148. void CMoLectureView::OnButton2() 
  149. {
  150. // TODO: Add your control notification handler code here
  151. //选择图层文件
  152. CFileDialog dlg(true, ".bmp","*.bmp",OFN_HIDEREADONLY,"栅格文件(*.bmp)|*.bmp",NULL);
  153. CString str;
  154. if (dlg.DoModal()==IDOK)
  155. {
  156. str=dlg.GetPathName();
  157. }
  158. else
  159. return;
  160. //封装在MapHelper.h中的全局函数
  161. AddImageLayer(m_Map, str);
  162. }
  163. //获得层数
  164. void CMoLectureView::OnButton3() 
  165. {
  166. // TODO: Add your control notification handler code here
  167. CMoLayers m_Layers=m_Map.GetLayers(); //获得图层集合
  168. int nLayerCount = m_Layers.GetCount();
  169. }
  170. //遍历图层
  171. void CMoLectureView::OnButton4() 
  172. {
  173. // TODO: Add your control notification handler code here
  174. CMoLayers m_Layers=m_Map.GetLayers(); //获得图层集合
  175. int nLayerCount = m_Layers.GetCount();
  176. /*VARIANT index;
  177. VariantInit(&index);
  178. index.vt=VT_I2;
  179. for(i=0;i<nLayerCount;i++)
  180. {
  181. CMoMapLayer layer;
  182. index.iVal = i;
  183. layer = m_Layers.Item(index);
  184. AfxMessageBox(layer.GetName());
  185. }*/
  186. ///////
  187. long nCount = 0;
  188. COleVariant index;
  189. for(nCount=0;nCount<nLayerCount;nCount++)
  190. {
  191. CMoMapLayer layer;
  192. index = COleVariant(nCount,VT_I4);
  193. layer = m_Layers.Item(index);
  194. AfxMessageBox(layer.GetName());
  195. }
  196. }
  197. //遍历图层记录
  198. void CMoLectureView::OnButton5() 
  199. {
  200. // TODO: Add your control notification handler code here
  201. CMoLayers m_Layers=m_Map.GetLayers(); //获得图层集合
  202. int nLayerCount = m_Layers.GetCount();
  203. VARIANT index;
  204. VariantInit(&index);
  205. index.vt=VT_I2;
  206. int i;
  207. for(i=0;i<nLayerCount;i++)
  208. {
  209. CMoMapLayer layer;
  210. index.iVal = i;
  211. layer = m_Layers.Item(index);
  212. CMoRecordset rs = layer.GetRecords();
  213. int j=0;
  214. rs.MoveFirst();
  215. for(j=0;j<rs.GetCount();j++)
  216. {
  217. CMoFields fs = rs.GetFields();
  218. rs.MoveNext();
  219. }
  220. }
  221. }
  222. //设置放大状态
  223. void CMoLectureView::OnButton6() 
  224. {
  225. // TODO: Add your control notification handler code here
  226. m_Map.SetMousePointer(moZoomIn);
  227. m_ToolNum = 1;
  228. // ZoomIn(m_Map);
  229. }
  230. //设置缩小状态
  231. void CMoLectureView::OnButton7() 
  232. {
  233. // TODO: Add your control notification handler code here
  234. m_ToolNum = 2;
  235. m_Map.SetMousePointer(moZoomOut);
  236. //ZoomOut(m_Map);
  237. }
  238. //设置漫游状态
  239. void CMoLectureView::OnButton8() 
  240. {
  241. // TODO: Add your control notification handler code here
  242. m_ToolNum = 3;
  243. m_Map.SetMousePointer(moPan);
  244. // Pan(m_Map);
  245. }
  246. //全图操作
  247. void CMoLectureView::OnButton9() 
  248. {
  249. // TODO: Add your control notification handler code here
  250. CMoRectangle f = m_Map.GetFullExtent();
  251.     m_Map.SetExtent(f);
  252. }
  253. BEGIN_EVENTSINK_MAP(CMoLectureView, CFormView)
  254.     //{{AFX_EVENTSINK_MAP(CMoLectureView)
  255. ON_EVENT(CMoLectureView, IDC_MAP1, -605 /* MouseDown */, OnMouseDownMap1, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
  256. ON_EVENT(CMoLectureView, IDC_MAP1, -606 /* MouseMove */, OnMouseMoveMap1, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
  257. ON_EVENT(CMoLectureView, IDC_MAP1, 4 /* AfterTrackingLayerDraw */, OnAfterTrackingLayerDrawMap1, VTS_I4)
  258. //}}AFX_EVENTSINK_MAP
  259. END_EVENTSINK_MAP()
  260. void CMoLectureView::OnMouseDownMap1(short Button, short Shift, long X, long Y) 
  261. {
  262. // TODO: Add your control notification handler code here
  263. //为点线面增加临时图层
  264.     CMoTrackingLayer tLayer(m_Map.GetTrackingLayer());
  265. if(m_ToolNum == 1)
  266. {
  267. //地图放大
  268. //ZoomIn(m_Map);
  269. //地图依据比例尺放大
  270. //CMoRectangle f = m_Map.GetExtent();
  271. //f.ScaleRectangle(.5);
  272. //m_Map.SetExtent(f);
  273. //地图拉框放大
  274. CMoRectangle r = m_Map.TrackRectangle();
  275. m_Map.SetExtent(r);
  276. pEyeDlg->m_EyeMap.Refresh();
  277. }
  278. else if(m_ToolNum == 2)
  279. {
  280. //地图依据比例尺缩小
  281. CMoRectangle f = m_Map.GetExtent();
  282. f.ScaleRectangle(1.5);
  283. m_Map.SetExtent(f);
  284. pEyeDlg->m_EyeMap.Refresh();
  285. }
  286. else if(m_ToolNum == 3)
  287. {
  288. //地图漫游
  289. Pan(m_Map);
  290. pEyeDlg->m_EyeMap.Refresh();
  291. }
  292. else if(m_ToolNum == 4)
  293. {
  294. //量距操作
  295. CMoLine line = m_Map.TrackLine();
  296. CString str;
  297. str.Format("The Distance of Line is %.3f",line.GetLength());
  298. AfxMessageBox(str);
  299. }
  300. else if(m_ToolNum == 5)
  301. {
  302. //量面积操作
  303. CMoPolygon polygon = m_Map.TrackPolygon();
  304. CString str;
  305. str.Format("The area is %.3f",polygon.GetArea());
  306. AfxMessageBox(str);
  307. }
  308. else if(m_ToolNum == 6)
  309. {
  310. //添加点
  311. CMoPoint* point = new CMoPoint(m_Map.ToMapPoint((float)X, (float)Y));
  312.   if (LPDISPATCH(point))
  313.   m_points.Add(point);
  314. // create a temp rectangle with which to refresh the screen
  315. // around the point
  316. CMoRectangle r = CMoRectangle();
  317. r.CreateDispatch(TEXT("MapObjects2.Rectangle"));
  318. r.SetBottom(point->GetY());
  319. r.SetLeft(point->GetX());
  320. r.SetTop(point->GetY()+1.0);
  321. r.SetRight(point->GetX()+1.0);
  322. r.ScaleRectangle(50.0);
  323. VARIANT va;
  324. VariantInit(&va);
  325. va.vt = VT_DISPATCH;
  326. va.pdispVal = r.m_lpDispatch;
  327.      tLayer.Refresh(true, va);
  328. }
  329. else if(m_ToolNum == 7)
  330. {
  331. //添加线
  332. CMoLine* line = new CMoLine(m_Map.TrackLine());
  333. if (LPDISPATCH(line))
  334. m_lines.Add(line);
  335. CMoRectangle r = CMoRectangle(line->GetExtent());
  336. VARIANT va;
  337. VariantInit(&va);
  338. va.vt = VT_DISPATCH;
  339. va.pdispVal = r.m_lpDispatch;
  340.      tLayer.Refresh(true, va);
  341. }
  342. else if(m_ToolNum == 8)
  343. {
  344. //添加面
  345.   CMoPolygon* poly = new CMoPolygon(m_Map.TrackPolygon());
  346.   if (LPDISPATCH(poly))
  347.   m_polys.Add(poly);
  348.  
  349.   CMoRectangle rect = CMoRectangle(poly->GetExtent());
  350.  
  351. VARIANT va;
  352. VariantInit(&va);
  353. va.vt = VT_DISPATCH;
  354. va.pdispVal = rect.m_lpDispatch;
  355.       tLayer.Refresh(true, va);
  356. }
  357. else if(m_ToolNum == 9)
  358. {
  359. //点查询
  360. CMoLayers layers(m_Map.GetLayers());//得到所有图层
  361. VARIANT vItem;//万能变量
  362. VariantInit(&vItem);//万能变量初始化
  363. vItem.vt = VT_I4;//将类型设置为整型
  364. vItem.lVal = 0;//将万能变量初始值设为0
  365. CMoMapLayer states(layers.Item(vItem));//将当前层设为第vItem层
  366. const double tolerance = m_Map.ToMapDistance((float)10);
  367. //将容忍度设为10
  368. CMoPoint mapPt(m_Map.ToMapPoint((float)X, (float)Y));
  369. CMoRecordset recs(states.SearchByDistance(mapPt, tolerance, TEXT("")));
  370. //寻找与该点近周的一个矩形框
  371. if (recs.GetEof())
  372. ::MessageBeep(MB_ICONQUESTION);//如果没有成功
  373. else
  374. {
  375. CMoFields fields(recs.GetFields());//获取矩形框
  376. CMoField  shapeField(fields.Item(COleVariant(TEXT("Shape"))));
  377. CMoField areaField(fields.Item(COleVariant(TEXT("Area"))));
  378. double dArea = areaField.GetValue().dblVal;
  379. //读出Shape里的属性 
  380. CMoPolygon shape(shapeField.GetValue().pdispVal);
  381. CMoRectangle r(shape.GetExtent());
  382. r.ScaleRectangle(2);
  383. m_Map.SetExtent(r); // zoom to the state
  384. m_Map.Refresh(); // force redraw
  385. m_Map.FlashShape(shape, 5);//重画5次选中区域
  386. }
  387. }
  388. /* else if(m_ToolNum == 10)
  389. {
  390. //点查询
  391. CMoLayers layers(m_Map.GetLayers());//得到所有图层
  392. VARIANT vItem;//万能变量
  393. VariantInit(&vItem);//万能变量初始化
  394. vItem.vt = VT_I4;//将类型设置为整型
  395. vItem.lVal = 0;//将万能变量初始值设为0
  396. CMoMapLayer states(layers.Item(vItem));//将当前层设为第vItem层
  397. CMoPoint mapPt(m_Map.ToMapPoint((float)X, (float)Y));
  398. CMoRecordset recs;
  399. //查询在点所在的多边形
  400. recs = states.SearchShape(mapPt, moPointInPolygon, TEXT(""));
  401. if (recs.GetEof())
  402. ::MessageBeep(MB_ICONQUESTION);//如果没有成功
  403. else
  404. {
  405. CMoFields fields(recs.GetFields());//获取矩形框
  406. CMoField  shapeField(fields.Item(COleVariant(TEXT("Shape"))));
  407. CMoField areaField(fields.Item(COleVariant(TEXT("Area"))));
  408. double dArea = areaField.GetValue().dblVal;
  409. //读出Shape里的属性 
  410. CMoPolygon shape(shapeField.GetValue().pdispVal);
  411. CMoRectangle r(shape.GetExtent());
  412. r.ScaleRectangle(2);
  413. m_Map.SetExtent(r); // zoom to the state
  414. m_Map.Refresh(); // force redraw
  415. m_Map.FlashShape(shape, 5);//重画5次选中区域
  416. }
  417. }*/
  418. else if(m_ToolNum == 10)
  419. {
  420. //线查询
  421. CMoLayers layers(m_Map.GetLayers());//得到所有图层
  422. VARIANT vItem;//万能变量
  423. VariantInit(&vItem);//万能变量初始化
  424. vItem.vt = VT_I4;//将类型设置为整型
  425. vItem.lVal = 0;//将万能变量初始值设为0
  426. CMoMapLayer states(layers.Item(vItem));//将当前层设为第vItem层
  427. CMoLine* line = new CMoLine(m_Map.TrackLine());
  428. CMoRecordset recs;
  429. //查询点与线相交的多边形
  430. recs = states.SearchShape(*line, moLineCross , TEXT(""));
  431. int recCount = recs.GetCount();
  432. while(!recs.GetEof())
  433. {
  434. CMoFields fields(recs.GetFields());//获取矩形框
  435. CMoField  shapeField(fields.Item(COleVariant(TEXT("Shape"))));
  436. //读出Shape里的属性 
  437. CMoPolygon shape(shapeField.GetValue().pdispVal);
  438. CMoRectangle r(shape.GetExtent());
  439. r.ScaleRectangle(2);
  440. m_Map.SetExtent(r); // zoom to the state
  441. m_Map.Refresh(); // force redraw
  442. m_Map.FlashShape(shape, 5);//重画5次选中区域
  443. recs.MoveNext();
  444. }
  445. }
  446. }
  447. //获取地图坐标
  448. void CMoLectureView::OnMouseMoveMap1(short Button, short Shift, long X, long Y) 
  449. {
  450. // TODO: Add your control notification handler code here
  451. CMoPoint pt = ToMapPoint(m_Map,X,Y);
  452. m_X = pt.GetX();
  453. m_Y = pt.GetY();
  454. UpdateData(FALSE);
  455. }
  456. //设置量距操作状态
  457. void CMoLectureView::OnButton10() 
  458. {
  459. // TODO: Add your control notification handler code here
  460. m_ToolNum = 4;
  461. m_Map.SetMousePointer(moArrow);
  462. }
  463. //设置量面积操作状态
  464. void CMoLectureView::OnButton11() 
  465. {
  466. // TODO: Add your control notification handler code here
  467. m_ToolNum = 5;
  468. m_Map.SetMousePointer(moArrow);
  469. }
  470. //添加点
  471. void CMoLectureView::OnButton12() 
  472. {
  473. // TODO: Add your control notification handler code here
  474. m_ToolNum = 6;
  475. m_Map.SetMousePointer(moArrow);
  476. }
  477. //添加线
  478. void CMoLectureView::OnButton13() 
  479. {
  480. // TODO: Add your control notification handler code here
  481. m_ToolNum = 7;
  482. m_Map.SetMousePointer(moArrow);
  483. }
  484. //添加面
  485. void CMoLectureView::OnButton14() 
  486. {
  487. // TODO: Add your control notification handler code here
  488. m_ToolNum = 8;
  489. m_Map.SetMousePointer(moArrow);
  490. }
  491. void CMoLectureView::OnAfterTrackingLayerDrawMap1(long hDC) 
  492. {
  493. // TODO: Add your control notification handler code here
  494. //定义符号
  495. CMoSymbol sym;
  496. if(!sym.CreateDispatch("MapObjects2.Symbol"))
  497. return;
  498. sym.SetColor(moPurple);
  499. //画点
  500.     int i;
  501. // Draw points
  502. sym.SetColor(moGreen);
  503. sym.SetSymbolType(moPointSymbol);
  504. sym.SetSize(5);
  505. sym.SetStyle(moCrossMarker );
  506. for ( i = 0; i < m_points.GetSize(); i++)
  507. m_Map.DrawShape(*m_points[i], sym);
  508. //draw lines
  509. sym.SetSymbolType(moLineSymbol);
  510. sym.SetStyle(moSolidLine);
  511. sym.SetSize(2);
  512. for ( i = 0; i < m_lines.GetSize(); i++)
  513. m_Map.DrawShape(*m_lines[i], sym);
  514. // Draw polygons
  515.   sym.SetSymbolType(moFillSymbol);
  516. sym.SetStyle(moGrayFill);
  517.   for (i = 0; i < m_polys.GetSize(); i++)
  518. m_Map.DrawShape(*m_polys[i], sym);
  519. }
  520. //保存图层
  521. void CMoLectureView::OnButton15() 
  522. {
  523. // TODO: Add your control notification handler code here
  524. }
  525. //设置点查询状态
  526. void CMoLectureView::OnButton16() 
  527. {
  528. // TODO: Add your control notification handler code here
  529. m_ToolNum = 9;
  530. m_Map.SetMousePointer(moArrow);
  531. }
  532. //属性查询
  533. void CMoLectureView::OnButton17() 
  534. {
  535. // TODO: Add your control notification handler code here
  536. UpdateData(TRUE);
  537. CString expression;
  538. expression.Format("(State_name Like '%%%s%%')", m_strQuery);
  539. //
  540. // Get the states layer and search
  541. //
  542. CMoLayers layers(m_Map.GetLayers());
  543. CMoMapLayer states(layers.Item(COleVariant(TEXT("STATES"))));
  544. CMoRecordset recs(states.SearchExpression(expression));
  545. //
  546. // Beep if not found.  Otherwise, show the first state
  547. // found by zooming in and flashing.
  548. //
  549. if (recs.GetEof())
  550. ::MessageBeep(MB_ICONQUESTION);
  551. else
  552. {
  553. CMoFields fields(recs.GetFields());
  554. CMoField  shapeField(fields.Item(COleVariant(TEXT("Shape"))));
  555. CMoPolygon shape(shapeField.GetValue().pdispVal);
  556. CMoRectangle r(shape.GetExtent());
  557. r.ScaleRectangle(2);
  558. m_Map.SetExtent(r); // zoom to the state
  559. m_Map.Refresh(); // force redraw
  560. m_Map.FlashShape(shape, 3);
  561. }
  562. }
  563. //显示图层中所有对象名称
  564. void CMoLectureView::OnButton18() 
  565. {
  566. // TODO: Add your control notification handler code here
  567. CMoRecordset recs; //图层的记录集
  568. CMoStrings strs;        //MO的字符串类
  569. strs.CreateDispatch("MapObjects2.Strings");
  570. CMoLayers m_Layers=m_Map.GetLayers();
  571. CMoMapLayer m_MapLayer;
  572. VARIANT va;
  573. VariantInit(&va);
  574. va.vt=VT_I4;
  575. va.lVal=0;
  576. m_MapLayer=m_Layers.Item(va);
  577. //得到图层数据中NAME字段的记录,保存在strs中
  578. recs = m_MapLayer.GetRecords();
  579. VARIANT vt0;
  580. while(!recs.GetEof())
  581. CMoFields mfs = recs.GetFields();
  582. CMoField mf = mfs.Item(COleVariant("POP1990"));
  583. vt0 = mf.Get_Value();
  584. if(vt0.vt == VT_I4)
  585. {
  586. long pop = mf.Get_Value().lVal;
  587. CString str;
  588. str.Format("%ld",pop);
  589. //CString s = mf.Get_Value().bstrVal;
  590. m_ListAttribute.AddString(str);
  591. recs.MoveNext();
  592. }
  593. else 
  594. {
  595. MessageBox("该字段不能转变成CString类型,rn所以不能将其显示在组合框中!rn也不能对该字段进行属性查询!!");
  596. return;
  597. }
  598. }
  599. }
  600. //显示层中所有字段名称
  601. void CMoLectureView::OnButton19() 
  602. {
  603. // TODO: Add your control notification handler code here
  604. CMoLayers m_Layers=m_Map.GetLayers(); //获得图层集合
  605. int nLayerCount = m_Layers.GetCount();
  606. VARIANT index;
  607. VariantInit(&index);
  608. index.vt=VT_I2;
  609. int i;
  610. int j;
  611. for(i=0;i<nLayerCount;i++)
  612. {
  613. CMoMapLayer layer;
  614. index.iVal = i;
  615. layer = m_Layers.Item(index);
  616. CMoRecordset rs = layer.GetRecords();
  617. CMoTableDesc tableDesc=rs.GetTableDesc();
  618. long fdOfTable = tableDesc.GetFieldCount();
  619. //遍历表描述,得到每一个字段的名称
  620. for(j=0;j<fdOfTable;j++)
  621. {
  622. AfxMessageBox(tableDesc.GetFieldName((short)j));
  623. }
  624. }
  625. }
  626. //保存点层
  627. void CMoLectureView::OnButton20() 
  628. {
  629. // TODO: Add your control notification handler code here
  630. // Open a new connection
  631. //选择图层文件
  632. CFileDialog dlg(FALSE, ".shp","*.shp",OFN_HIDEREADONLY,"Shape文件(*.shp)|*.shp",NULL);
  633. CString str;
  634. if (dlg.DoModal()==IDOK)
  635. {
  636. str=dlg.GetPathName();
  637. }
  638. else
  639. return;
  640. //创建表格存放点的属性,并指定其存放的路径
  641. CMoDataConnection conn;
  642. if (!conn.CreateDispatch(TEXT("MapObjects2.DataConnection")))
  643. return;
  644. conn.SetDatabase(GetFileDirectory(str));
  645. if (!conn.Connect())
  646. return;
  647. // Define the geodataset
  648. CMoTableDesc tableDesc;
  649. if (!tableDesc.CreateDispatch(TEXT("MapObjects2.TableDesc")))
  650. return;
  651. // set the field names, types, and lengths
  652. tableDesc.SetFieldCount(3);
  653. tableDesc.SetFieldName(0, TEXT("Name"));
  654. tableDesc.SetFieldType(0, moString);
  655. tableDesc.SetFieldLength(0, 16);
  656. tableDesc.SetFieldName(1, TEXT("Area"));
  657. tableDesc.SetFieldType(1, moDouble);
  658. tableDesc.SetFieldPrecision(1, 15);
  659. tableDesc.SetFieldScale(1, 3); // decimal places
  660. tableDesc.SetFieldName(2, TEXT("人口"));
  661. tableDesc.SetFieldType(2, moDouble);
  662. tableDesc.SetFieldPrecision(2, 15);
  663. tableDesc.SetFieldScale(2, 3); // 
  664. //////////////////////保存点的信息
  665. //创建层,并与属性表关联
  666. VARIANT va;
  667. VariantInit(&va);
  668. va.vt = VT_BOOL;
  669. va.boolVal = false;
  670. CMoGeoDataset geoDataset(conn.AddGeoDataset(GetFileTitle(str), moPoint, tableDesc, va, va));
  671. CMoMapLayer layer;
  672. if (!layer.CreateDispatch(TEXT("MapObjects2.MapLayer")))
  673. return;
  674. layer.SetGeoDataset(geoDataset);
  675. // Add a record for each pointgon to the GeoDataset
  676. CMoRecordset recs(layer.GetRecords());
  677. CMoFields fields(recs.GetFields());
  678. CString featureName;
  679. for (int i = 0; i < m_points.GetSize(); i++)
  680. {
  681. recs.AddNew();
  682. // "Shape" = m_point
  683. SetValue(fields, TEXT("Shape"), LPDISPATCH(*m_points[i]));
  684. // "Name" = featureName
  685. featureName.Format("%s%d", "point", i);
  686. SetValue(fields, TEXT("Name"), featureName);
  687. // "Area" = m_point.GetArea()
  688. SetValue(fields, TEXT("Area"), 0.0);
  689. // "Perimeter" = m_point.GetPerimeter()
  690. SetValue(fields, TEXT("Perimeter"), 0.0);
  691. recs.Update();
  692. }
  693. // Add new layer to map
  694. CMoLayers layers(m_Map.GetLayers());
  695. layers.Add(layer);
  696. }
  697. //空间关系查询
  698. void CMoLectureView::OnButton21() 
  699. {
  700. // TODO: Add your control notification handler code here
  701. m_ToolNum = 10;
  702. m_Map.SetMousePointer(moArrow);
  703. }
  704. //制作点专题图
  705. void CMoLectureView::OnButton22() 
  706. {
  707. // TODO: Add your control notification handler code here
  708. CMoLayers m_Layers=m_Map.GetLayers();
  709. CMoMapLayer m_MapLayer;
  710. VARIANT va;
  711. VariantInit(&va);
  712. va.vt=VT_I4;
  713. va.lVal=0;
  714. m_MapLayer=m_Layers.Item(va);
  715. CMoRecordset recs(m_MapLayer.GetRecords());
  716. //对属性项的所有数据进行统计计算,并将所有统计结果赋给一个CMoStatistics对象
  717. CMoStatistics stats(recs.CalculateStatistics("POP1990"));
  718. //定义点渲染对象,计算点对象的点值
  719. CMoDotDensityRenderer ddRenderer;
  720. //创建一个新的CMoDotDensityRenderer对象
  721. VERIFY(ddRenderer.CreateDispatch(TEXT("MapObjects2.DotDensityRenderer")));
  722. ddRenderer.SetField("POP1990");
  723. double range = stats.GetMax() - stats.GetMin();
  724. ddRenderer.SetDotValue(range/500);
  725. ddRenderer.SetDotSize(3);
  726. ddRenderer.SetDotColor(moRed);
  727. //将设置好的CMoDotDensityRenderer对象与需要符号化的要素层挂接起来,并重画地图
  728. m_MapLayer.SetRenderer(ddRenderer);
  729. m_Map.Refresh();
  730. }
  731. //分级专题图
  732. void CMoLectureView::OnButton23() 
  733. {
  734. // TODO: Add your control notification handler code here
  735. CMoLayers m_Layers=m_Map.GetLayers();
  736. CMoMapLayer m_MapLayer;
  737. VARIANT va;
  738. VariantInit(&va);
  739. va.vt=VT_I4;
  740. va.lVal=0;
  741. m_MapLayer=m_Layers.Item(va);
  742. CMoRecordset recs(m_MapLayer.GetRecords());
  743. //创建一个CMoClassBreakRender对象,并设置其属性
  744. CMoClassBreaksRenderer cbRenderer;
  745. VERIFY(cbRenderer.CreateDispatch(TEXT("MapObjects2.ClassBreaksRenderer")));
  746. cbRenderer.SetField("POP1990");
  747. //对属性项的所有数据进行统计计算,并将统计结果赋给一个CMoStatistics对象
  748. CMoStatistics stats(recs.CalculateStatistics("POP1990"));
  749. //利用给定的分级级数和统计结果按照标准偏差分级法来计算
  750. const int numClasses = 6;
  751. double breakVal = stats.GetMean() - (stats.GetStdDev() * ((double)numClasses / 2.0));
  752. for(int i=0; i<numClasses;i++)
  753. {
  754. if(stats.GetMin()<=breakVal&&breakVal<=stats.GetMax())
  755. {
  756. cbRenderer.SetBreakCount(cbRenderer.GetBreakCount() + 1);
  757. cbRenderer.SetBreak(cbRenderer.GetBreakCount() - 1, breakVal);
  758. }
  759. breakVal += stats.GetStdDev();
  760. }
  761. //用一组连续渐变色来表示区分每个级别
  762. cbRenderer.RampColors(moLightYellow,moBlue);
  763. m_MapLayer.SetRenderer(cbRenderer);
  764. m_Map.Refresh();
  765. }
  766. //地图输出
  767. void CMoLectureView::OnButton24() 
  768. {
  769. // TODO: Add your control notification handler code here
  770. //选择输出文件
  771. CFileDialog dlg(false, ".bmp","*.bmp",OFN_HIDEREADONLY,"栅格文件(*.bmp)|*.bmp",NULL);
  772. CString str;
  773. if (dlg.DoModal()==IDOK)
  774. {
  775. str=dlg.GetPathName();
  776. }
  777. else
  778. return;
  779. RECT r;
  780. m_Map.GetWindowRect(&r);
  781. m_Map.ExportMap(moExportBMP,str, 2);
  782. }
  783. //激活鹰眼视图
  784. void CMoLectureView::OnButton25() 
  785. {
  786. // TODO: Add your control notification handler code here
  787. pEyeDlg->ShowWindow(SW_SHOW);
  788. }