⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 firstmapview.cpp

📁 具有地图的放大、缩小、漫游、属性查询、图层控制等功能。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
void CFirstMapView::OnSetNavigationViewMapLayer()
{
	/*CMoLayers m_Layers;
	if(m_Layers.CreateDispatch(TEXT("MapObjects2.MoLayers")))
		return;
	m_Layers = m_map.GetLayers();*/
	int layersCount = layers.GetCount();

	CMoMapLayer m_MapLayer;
	for(int i = layersCount-1;i>=0;i--)
	{
		VARIANT va;
		VariantInit(&va);
		va.vt = VT_I4;
		va.lVal = i;
		m_MapLayer = layers.Item(va);
		Layers = m_map2.GetLayers();
		Layers.Add(m_MapLayer);
	}
	CMoRectangle rect(m_map2.GetFullExtent());
	if(LPDISPATCH(rect))
		m_map2.SetExtent(rect);
	rect.ReleaseDispatch();

	
}

void CFirstMapView::OnDraw(CDC* pDC) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(m_firstStart)
	{
		OnSetNavigationViewMapLayer();
		this->m_firstStart = FALSE;
	}

}



void CFirstMapView::OnMapSearch() 
{
	// TODO: Add your control notification handler code here
	CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
	ASSERT_VALID(pMainFrame);
	CString searchText = pMainFrame->GetSearchText();
	
	/*CComboBox *pComboBox1 = (CComboBox*)pMainFrame->m_wndSearch.GetDlgItem(IDC_COMBO_CURRENTLAYER);
	ASSERT_VALID(pComboBox1); 
	pComboBox1->GetWindowText(m_comboxEdit); */

	CComboBox *pComboBox2 = (CComboBox*)pMainFrame->m_wndSearch.GetDlgItem(IDC_COMBO_FIELDS);
	ASSERT_VALID(pComboBox2); 
	pComboBox2->GetWindowText(m_comboxEdit1); 

	if(m_comboxEdit1 =="")
	{
		MessageBox("没有选择图层!",NULL,MB_ICONEXCLAMATION | MB_ICONWARNING);
	}
	else
	{
		CString expression;
		expression.Format("(%s Like '%%%s%%')",m_comboxEdit1,searchText);

		
		CMoMapLayer layer(this->layers.Item(COleVariant(m_comboxEdit)));
		CMoRecordset recs(layer.SearchExpression(expression));

		if(recs.GetEof())
			MessageBox("没有找到匹配的结果",NULL,MB_ICONEXCLAMATION | MB_ICONWARNING);
		else
		{
			CMoFields fields(recs.GetFields());
			CMoField shapeField(fields.Item(COleVariant(TEXT("Shape"))));

			CMoPolygon shape(shapeField.Get_Value().pdispVal);
			CMoRectangle r(shape.GetExtent());
			r.ScaleRectangle(2);
			m_map.SetExtent(r);
			m_map.Refresh();
			OnRefreshNavigationWindow();
			m_map.FlashShape(shape,3);

		}
	}
}


void CFirstMapView::OnCloseupCombo() 
{
	// TODO: Add your control notification handler code here
	CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
	ASSERT_VALID(pMainFrame);
	CComboBox *pComboBox1 = (CComboBox*)pMainFrame->m_wndSearch.GetDlgItem(IDC_COMBO_CURRENTLAYER);
	ASSERT_VALID(pComboBox1); 
	CComboBox *pComboBox2 = (CComboBox*)pMainFrame->m_wndSearch.GetDlgItem(IDC_COMBO_FIELDS);
	ASSERT_VALID(pComboBox2); 

	pComboBox1->GetWindowText(m_comboxEdit); 

	if(m_comboxEdit != "")
	{
		CMoMapLayer layer(this->layers.Item(COleVariant(m_comboxEdit)));
		CMoRecordset rset=layer.GetRecords();

		CMoTableDesc table(rset.GetTableDesc());
		while(pComboBox2->GetCount()!=0)
			pComboBox2->DeleteString(0);
		for(int i=0;i<table.GetFieldCount();i++)
		{
			CString name=table.GetFieldName(i);
			pComboBox2->AddString(name);
		}
		pComboBox2->SetCurSel(0); 
	}
}

void CFirstMapView::OnMapFullextent() 
{
	// TODO: Add your command handler code here
	m_map.SetMousePointer(4);
	OnRefreshNavigationWindow();
	CMoRectangle r(m_map.GetFullExtent());
	if(LPDISPATCH(r))
		m_map.SetExtent(r);	
}


///////////////////////////////////////////////////////////////
//函数功能 : 选择地图要素
//处理过程 : 先得到鼠标点击的要素的Recordset,将鼠标点击的要素加入到Track层
//返 回 值 : void
//参数说明 : short Shift, //是否按下了Shift键
// long X, long Y
///////////////////////////////////////////////////////////////
void CFirstMapView::SelectFeatToSelection(CMoMap &m_Map, short Shift, long X, long Y)
{
/*	if(Shift==0) 
	{
		VARIANT va;
		VariantInit(&va);
		va.vt = VT_NULL;	
		tLayer = m_map.GetTrackingLayer();
		tLayer.Refresh(true,va);//清除所有Track层数据
	}
	long ShapeType;*/
	CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
	ASSERT_VALID(pMainFrame);
	CComboBox *pComboBox1 = (CComboBox*)pMainFrame->m_wndSearch.GetDlgItem(IDC_COMBO_CURRENTLAYER);
	ASSERT_VALID(pComboBox1); 
	pComboBox1->GetWindowText(m_comboxEdit); 
	if(m_comboxEdit=="")
	{
		MessageBox("请选择图层!");
	}
	else
	{
		CMoPoint pt(m_map.ToMapPoint(float(X),float(Y)));
		CMoRectangle rc;
		rc.CreateDispatch("MapObjects2.Rectangle");
		double x,y;
		x=pt.GetX();
		y=pt.GetY();
		double x_scale;
		double y_scale;
		CMoRectangle rExtent(m_Map.GetExtent());
		x_scale=rExtent.GetWidth()/m_Map.GetFullExtent().GetWidth();
		y_scale=rExtent.GetHeight()/m_Map.GetFullExtent().GetHeight();
		double scale=x_scale;
		if(x_scale>y_scale)
		scale=y_scale;
		rc.SetTop(y-200*scale);
		rc.SetBottom(y+200*scale);
		rc.SetLeft(x-200*scale);
		rc.SetRight(x+200*scale);

	//* * 2 由查询范围选择目标
		CMoMapLayer seletedMapLayer(layers.Item(COleVariant(m_comboxEdit)));
		m_SelectedRecSet = seletedMapLayer.SearchShape(rc,5,"");
		VARIANT va;
		VariantInit(&va);
		va.vt=VT_NULL;

		CMoTrackingLayer tracklayer(m_Map.GetTrackingLayer());
		tracklayer.Refresh(true,va); 
	}

/*	if(SelectFeatureOnMap(m_Map,X,Y,6,m_SelectedRecSet,ShapeType))
	// SelectFeatureOnMap函数参考如下
	{
		CMoSymbol symbol;
		symbol.CreateDispatch(TEXT("MapObjects2.Symbol"));
		symbol.SetColor(0x00FF00);
		symbol.SetStyle(8);

		
		CMoFields MoFields = m_SelectedRecSet.GetFields();
		CMoField shapeField(MoFields.Item(COleVariant(TEXT("Shape"))));
		if(ShapeType == 23)
		{
			symbol.SetSymbolType(1);
			CMoPolygon shape(shapeField.Get_Value().pdispVal);
			m_Map.DrawShape(shape,symbol);			
		}
		if(ShapeType == 22)
		{
			symbol.SetSymbolType(0);
			CMoLine shape(shapeField.Get_Value().pdispVal);
			m_Map.DrawShape(shape,symbol);
		}
		if(ShapeType == 21)
		{
			symbol.SetSymbolType(0);
			CMoPoint shape(shapeField.Get_Value().pdispVal);
			m_Map.DrawShape(shape,symbol);
		}
		symbol.ReleaseDispatch();
	}
*/
}

///////////////////////////////////////////////////////////////
//函数功能 : 选择地图要素,自动判断该要素属于那一层,返回该要素的Recordset和
// 要素所在图层的类型(点、线、面)
//返 回 值 : BOOL
//参数说明 : CMap1& map,
//long X, long Y,
//double ptSize, 选择范围
//CMoRecordset& set, 要素的Recordset(返回参数)
//long& ShapeType 要素所在图层的类型(返回参数)
///////////////////////////////////////////////////////////////
BOOL CFirstMapView::SelectFeatureOnMap(CMoMap &map, long X, long Y,double ptSize,CMoRecordset& set,long& ShapeType)
{
/*	double tolerance = map.ToMapDistance((float)ptSize);
	CMoPoint mapPt(map.ToMapPoint((float)X, (float)Y));
	CMoLayers layers(map.GetLayers());
	for(long i=0;i<layers.GetCount();i++)
	{
		CMoMapLayer Itemlayer(layers.Item(COleVariant(i)));
		if(!Itemlayer.GetVisible()) continue;
		ShapeType = Itemlayer.GetShapeType();
		if(Itemlayer.GetShapeType()==23)
		{
			set = Itemlayer.SearchShape(mapPt,6, TEXT(""));
			if(!set.GetEof()) return TRUE;
		}
		if(Itemlayer.GetShapeType()==21||Itemlayer.GetShapeType()==22)
		{
			set = Itemlayer.SearchByDistance(mapPt,tolerance, TEXT(""));
			if(!set.GetEof()) return TRUE;
		}
	}*/
	return FALSE;
}

void CFirstMapView::OnAfterTrackingLayerDrawMap1(long hDC) 
{
	// TODO: Add your control notification handler code here
	

	CMoSymbol sym;
	sym.CreateDispatch(TEXT("MapObjects2.Symbol"));
	sym.SetColor(0x0000FF);
	sym.SetSymbolType(2);
	sym.SetStyle(8);

	if(LPDISPATCH(m_SelectedRecSet))
	{
		m_SelectedRecSet.MoveFirst();

		CMoFields fields(m_SelectedRecSet.GetFields());
		CMoField shapefield(fields.Item(COleVariant(TEXT("Shape"))));
		CMoPolygon shape;
		while(!	m_SelectedRecSet.GetEof())
		{
			shape.AttachDispatch(shapefield.Get_Value().pdispVal);
			m_map.DrawShape(shape,sym);
		//	m_map.FlashShape(shape,3);
			m_SelectedRecSet.MoveNext();
		}
	}
	sym.ReleaseDispatch();
	/*比例尺控件的实现*/
	C_sbExtent MapExt;
	C_sbExtent Pageext;
 
    MapExt  = m_scaleBar.GetMapExtent();
    Pageext = m_scaleBar.GetPageExtent();
  
    MapExt.SetMinX(m_map.GetExtent().GetLeft());
    MapExt.SetMinY(m_map.GetExtent().GetBottom());
	MapExt.SetMaxX(m_map.GetExtent().GetRight());
	MapExt.SetMaxY(m_map.GetExtent().GetTop());
	CRect rect;
	m_map.GetClientRect(rect);
	CDC* pDC =m_map.GetDC();
	Pageext.SetMinX(rect.TopLeft().x/ GetDeviceCaps(pDC->m_hDC,LOGPIXELSX));
	Pageext.SetMinY(rect.TopLeft().y / GetDeviceCaps(pDC->m_hDC,LOGPIXELSY));
	Pageext.SetMaxX((rect.TopLeft().x + rect.Width()) / GetDeviceCaps(pDC->m_hDC,LOGPIXELSX));
	Pageext.SetMaxY((rect.TopLeft().y + rect.Height())/ GetDeviceCaps(pDC->m_hDC,LOGPIXELSY));
	
    m_scaleBar.Refresh();
  
}

void CFirstMapView::OnBtnScale() 
{
	// TODO: Add your control notification handler code here
	CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
	ASSERT_VALID(pMainFrame);
	CComboBox *pComboBox = (CComboBox*)pMainFrame->m_wndSearch.GetDlgItem(IDC_COMBO_SCALE);
	ASSERT_VALID(pComboBox); 
	CString str;
	pComboBox->GetWindowText(str);
	if(str!="" )
	{
		str = str.Mid(2);
		double scale;
		scale = atof(str);
		SetMapScale(m_map, scale);
	}

}


void CFirstMapView::OnShowPropery() 
{
	// TODO: Add your command handler code here
	CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
	ASSERT_VALID(pMainFrame);
	CComboBox *pComboBox = (CComboBox*)pMainFrame->m_wndSearch.GetDlgItem(IDC_COMBO_CURRENTLAYER);
	ASSERT_VALID(pComboBox); 
	pComboBox->GetWindowText(m_comboxEdit); 
	CComboBox *pComboBox2 = (CComboBox*)pMainFrame->m_wndSearch.GetDlgItem(IDC_COMBO_FIELDS);
	ASSERT_VALID(pComboBox2); 
	pComboBox2->GetWindowText(m_comboxEdit1);

	if(m_comboxEdit1 =="")
		MessageBox("请选择要显示的属性字段!",NULL,MB_ICONEXCLAMATION | MB_ICONWARNING);
	else
	{
		CMoMapLayer layer(layers.Item(COleVariant(m_comboxEdit)));	
		// TODO: Add your command handler code here
			//新建一个标注对象
		 CMoLabelPlacer labelPlacer;
		 labelPlacer.CreateDispatch("MapObjects2.LabelPlacer");

		//选择将Name这个字段做为标注
		 labelPlacer.SetField(m_comboxEdit1);
		 labelPlacer.SetDrawBackground(TRUE); 
		 labelPlacer.SetAllowDuplicates(false);
		 labelPlacer.SetPlaceAbove(false);
		 labelPlacer.SetPlaceBelow(false);
		 labelPlacer.SetPlaceOn(true);
		 labelPlacer.SetSymbolHeight((short)m_map.GetFullExtent().GetHeight());

		//为这个标注对象设置字体
	//	 CMoTextSymbol textSymbol(labelPlacer.GetDefaultSymbol());
	//	 CMoFont fnt;
	//	 fnt.SetName(TEXT("宋体"));
	//	 fnt.SetSize(10);
	//	 textSymbol.SetFont(fnt);

	//	将标注对象与图层对象关连
		 layer.SetRenderer(labelPlacer);
		 m_map.Refresh ();
	}
}

void CFirstMapView::OnDblClickScalebar() 
{
	// TODO: Add your control notification handler code here
	if(dlgscale.DoModal()==IDOK)
	{
		scale_index = dlgscale.m_index;
		m_scaleBar.SetScaleBarUnits(scale_index);
		m_scaleBar.Refresh();
	}
}

void CFirstMapView::OnDeleteLabal() 
{
	// TODO: Add your command handler code here
	CMoMapLayer layer(layers.Item(COleVariant(m_comboxEdit)));
	CMoGroupRenderer re(layer.GetRenderer());
	re.Remove(0);
	m_map.Refresh();
}

void CFirstMapView::OnProTable() 
{
	// TODO: Add your command handler code here
	CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
	ASSERT_VALID(pMainFrame);
	CComboBox *pComboBox = (CComboBox*)pMainFrame->m_wndSearch.GetDlgItem(IDC_COMBO_CURRENTLAYER);
	ASSERT_VALID(pComboBox); 
	pComboBox->GetWindowText(m_comboxEdit); 
	if(m_comboxEdit =="")
	{
		MessageBox("没有选择图层!",NULL,MB_ICONEXCLAMATION | MB_ICONWARNING);
	}
	else
	{
		CMoMapLayer layer(layers.Item(COleVariant(m_comboxEdit)));
		CMoRecordset m_SelectedRecSet(layer.GetRecords());
		delete this->m_multList;
		m_multList = new CDlgMultList;
		m_multList->m_RecSet = m_SelectedRecSet;
		m_multList->Create(IDD_DIALOG4,this);
		m_multList->ShowWindow(SW_SHOW);
	}
	

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -