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

📄 mapperview.cpp

📁 vc 和mapobjects地理信息系统组件开发 很有启发意义和参考价值
💻 CPP
📖 第 1 页 / 共 2 页
字号:

//			CMoPolygon p=m_map.TrackPolygon();
			CMoPolygon p;
			m_oLiedu.GetPoly(ssssd.m_nUse,p);

			CStdioFile f;
			f.Open(theApp.m_sRunPath+"\\损失计算.txt",CStdioFile::modeCreate|CStdioFile::modeWrite);

			if((p.m_lpDispatch!=NULL)&&(Button==1))	//右键不运行
			{
				short iLayer=theApp.GetLayerPane()->m_legend.getActiveLayer();
				if(iLayer<0) 
					return;
				
				CMoMapLayer layer=m_map.GetLayers().Item(COleVariant(iLayer));
				m_sQuery=layer.GetName();
				//moAreaIntersect=moContining+moLineCross
//				m_rsQuery = layer.SearchShape(p, moAreaIntersect, TEXT("")); //交
//				m_rsQuery = layer.SearchShape(p, moContaining, TEXT(""));  //包含
//				m_rsQuery = layer.SearchShape(p, moLineCross, TEXT(""));  //相交
				
				m_rsSunshi0= layer.SearchShape(p, moContaining, TEXT(""));  //包含
				m_rsSunshi1 = layer.SearchShape(p, moLineCross, TEXT(""));  //相交

				//保存0中的对象,获得其面积和ID,根据ID查资料
				//1.直接使用全部的GDP
				//2.得到一个基本数据,需要计算

				//预先可以获得4个数据:NAME,ID,面积,基本数据值
				if(LPDISPATCH(m_rsSunshi0)!=0)
				{
					//可能有多个记录
					CMoFields fields(m_rsSunshi0.GetFields());

					//NAME
					CMoField field(fields.Item(COleVariant(TEXT("NAME"))));
					CMoField field1(fields.Item(COleVariant(TEXT("GEO_CODE"))));
					CMoField field2(fields.Item(COleVariant(TEXT("Area"))));
					CMoField field3(fields.Item(COleVariant(TEXT("Perimeter"))));
					m_rsSunshi0.MoveFirst();

					CString s,s1,s2,s3,str;
					while(!m_rsSunshi0.GetEof())
					{
						s=field.GetValueAsString();
						s1=field1.GetValueAsString();
						s2=field2.GetValueAsString();
						s3=field3.GetValueAsString();
//						str=s+"-"+s1+"-"+s2+"-"+s3;
//						AfxMessageBox(str);

						str="NAME: "+s+"\nGEO_CODE: "+s1+"\nArea: "+s2+"\nPerimeter: "+s3;
						f.WriteString(str+"\n比例: 100%\n--------------------\n");

						m_rsSunshi0.MoveNext();
					}
				}

				//交叉区域的基本数据,需要按照比例运算
				if(LPDISPATCH(m_rsSunshi1)!=0)
				{
					//可能有多个记录
					CMoFields fields(m_rsSunshi1.GetFields());

					//NAME
					CMoField field0(fields.Item(COleVariant(TEXT("SHAPE")))); //需要使用shape对象
					CMoField field(fields.Item(COleVariant(TEXT("NAME"))));
					CMoField field1(fields.Item(COleVariant(TEXT("GEO_CODE"))));
					CMoField field2(fields.Item(COleVariant(TEXT("Area"))));
					CMoField field3(fields.Item(COleVariant(TEXT("Perimeter"))));
					m_rsSunshi0.MoveFirst();

					CString s,s1,s2,s3,str,str1;
					CMoRectangle r(m_map.GetFullExtent());
					
					VARIANT vt;
					VariantInit(&vt);
					vt.vt=VT_DISPATCH;
					vt.pdispVal=r.m_lpDispatch;
					CMoPolygon poly,poly1;
					while(!m_rsSunshi1.GetEof())
					{
						s=field.GetValueAsString();
						s1=field1.GetValueAsString();
						s2=field2.GetValueAsString();
						s3=field3.GetValueAsString();

//						str=s+"-"+s1+"-"+s2+"-"+s3;
//						AfxMessageBox(str);

						//可能有多个记录
						poly1=p.Intersect(field0.GetValue().pdispVal,vt);

						poly.AttachDispatch(field0.GetValue().pdispVal);
						str1.Format("%4.2lf",poly1.GetArea()/poly.GetArea()*100.0);
						str="NAME: "+s+"\nGEO_CODE: "+s1+"\nArea: "+s2+"\nPerimeter: "+s3;
						f.WriteString(str+"\n比例: "+str1+"%\n--------------------\n");
						poly.DetachDispatch();

						m_rsSunshi1.MoveNext();
					}
				}


				VARIANT va;
				VariantInit(&va);
				va.vt = VT_NULL; 
				m_map.GetTrackingLayer().Refresh(true,va);
			}

			f.Close();
		}
		break;
*/
	}
}

void CMapperView::OnMouseMoveMap(short Button, short Shift, long X, long Y) 
{
	//改变鼠标形状
	switch(m_pWnd->m_uID)
	{
	case ID_DRAW_ZOOMIN:
		m_map.SetMousePointer(51);
		break;
	case ID_DRAW_ZOOMOUT:
		m_map.SetMousePointer(52);
		break;
	case ID_DRAW_PAN:
		m_map.SetMousePointer(53);
		break;
	case ID_QUERY_DISTANCE:
		m_map.SetMousePointer(2);
		break;
	case ID_QUERY_POINT:
		m_map.SetMousePointer(14);
		break;
	default:
		m_map.SetMousePointer(0);
		break;
	}

	CString s;
	s.Format("屏幕:x=%d,y=%d",X,Y);
	m_pWnd->MsgOutBar(s,1);
	CMoPoint point=m_map.ToMapPoint((float)X,(float)Y);
	s.Format("地图:x=%lf,y=%lf",point.GetX(),point.GetY());
	m_pWnd->MsgOutBar(s,2);

}

void CMapperView::OnAfterTrackingLayerDrawMap(long hDC) 
{

	//损失查询结果,临时显示
	if(LPDISPATCH(m_rsSunshi0)!=0)
	{
		//需要特殊颜色显示
		CMoSymbol sym;
		sym.CreateDispatch(TEXT("MapObjects2.Symbol"));
		sym.SetColor(0x0000FF);
		sym.SetSymbolType(moFillSymbol);
		sym.SetStyle(moLightGrayFill);

		CMoFields fields(m_rsSunshi0.GetFields());
		CMoField field(fields.Item(COleVariant(TEXT("SHAPE"))));
		CMoPolygon shape;
		//可能有多个记录
		m_rsSunshi0.MoveFirst();
		while(!m_rsSunshi0.GetEof())
		{
			shape.AttachDispatch(field.GetValue().pdispVal);
			m_map.DrawShape(shape,sym);
			m_rsSunshi0.MoveNext(); 
		}
	}

	if(LPDISPATCH(m_rsSunshi1)!=0)
	{
		//需要特殊颜色显示
		CMoSymbol sym;
		sym.CreateDispatch(TEXT("MapObjects2.Symbol"));
		sym.SetColor(0xFF0000);
		sym.SetSymbolType(moFillSymbol);
		sym.SetStyle(moLightGrayFill);

		CMoFields fields(m_rsSunshi1.GetFields());
		CMoField field(fields.Item(COleVariant(TEXT("SHAPE"))));
		CMoPolygon shape;
		//可能有多个记录
		m_rsSunshi1.MoveFirst();
		while(!m_rsSunshi1.GetEof())
		{
			shape.AttachDispatch(field.GetValue().pdispVal);
			m_map.DrawShape(shape,sym);
			m_rsSunshi1.MoveNext(); 
		}
	}

	if(LPDISPATCH(m_rsQuery)!=0)
	{
		//需要特殊颜色显示
		CMoSymbol sym;
		sym.CreateDispatch(TEXT("MapObjects2.Symbol"));
		//sym.SetColor(0x0000FF);
		sym.SetColor(theApp.m_tMapSetup.QueryColor);
		sym.SetSymbolType(moFillSymbol);
		sym.SetStyle(moLightGrayFill);

		CMoFields fields(m_rsQuery.GetFields());
		CMoField shapeField(fields.Item(COleVariant(TEXT("SHAPE"))));
		CMoPolygon shape;
		//可能有多个记录
		m_rsQuery.MoveFirst();
		while(!m_rsQuery.GetEof())
		{
			shape.AttachDispatch(shapeField.GetValue().pdispVal);
			m_map.DrawShape(shape,sym);
			m_rsQuery.MoveNext(); 
		}
	}

	//绘制测量距离line
	if(m_pWnd->m_uID==ID_QUERY_DISTANCE)
	{
		CMoSymbol sym;
		sym.CreateDispatch(TEXT("MapObjects2.Symbol"));
		sym.SetColor(RGB(255,0,0));
		m_map.DrawShape(m_oQueryLine,sym);
	}

	//绘制测量面积polygon
	if(m_pWnd->m_uID==ID_QUERY_AREA)
	{
		CMoSymbol sym;
		sym.CreateDispatch(TEXT("MapObjects2.Symbol"));
		sym.SetOutlineColor(RGB(255,0,0));
		sym.SetStyle(1);
		m_map.DrawShape(m_oQueryPoly,sym);
	}

	//输入参数ellipse->polygon
//	if(m_pWnd->m_uID==ID_QUERY_INPUT)
	if(LPDISPATCH(m_oQueryInput)!=0)
	{
		CMoSymbol sym;
		sym.CreateDispatch(TEXT("MapObjects2.Symbol"));
		sym.SetOutlineColor(RGB(255,0,0));
		sym.SetStyle(1);
		m_map.DrawShape(m_oQueryInput,sym);
		m_oQueryInput.ReleaseDispatch(); //只显示一次刷新
	}

	m_oShape.Draw(m_map);
	m_oGrid.Draw(m_map);
	m_oSeis.Draw(m_map);

	//???:必须地震标注了才显示烈度
	//m_oSeis.Draw(m_map);
	//m_oLiedu.Draw(m_map);

}

void CMapperView::Sub_SetLayerInfo(CString &sType, SMpfLayerInfo &mli)
{
	CMoLayers layers(m_map.GetLayers());
	if(layers.GetCount()<=0)
		return;

	if(sType=="[2]") //image
	{
		CMoImageLayer layer(layers.Item(COleVariant((short)0)));
		layer.SetTransparent(mli.bOutline);
		layer.SetTransparentColor(mli.crOutlinColor);
	}
	else
	{
		CMoMapLayer layer(layers.Item(COleVariant((short)0)));
		CMoSymbol sym(layer.GetSymbol());

		sym.SetStyle(mli.iStyle);
		sym.SetSize(mli.iSize);
		sym.SetColor(mli.crColor);
		long iType=layer.GetShapeType();
		switch(iType)
		{
		case moPoint:
			sym.SetOutlineColor(mli.crOutlinColor);
			sym.SetOutline(mli.bOutline);
			break;
		case moLine:
			break;
		case moPolygon:
			sym.SetOutlineColor(mli.crOutlinColor);
			sym.SetOutline(mli.bOutline);
			break;
		}
	}
}

void CMapperView::OnMouseUpMap(short Button, short Shift, long X, long Y) 
{
	if(m_bPressed)
	{
		m_bPressed=FALSE;
		CMoPoint pt=m_map.ToMapPoint((float)X,(float)Y);

		double dx=pt.GetX()-m_ptPressed.GetX();
		double dy=pt.GetY()-m_ptPressed.GetY();

//		CString s;
//		s.Format("X=%lf,Y=%lf",dx,dy);
//		AfxMessageBox(s);

		//根据类型处理,如果没有对象则不处理
		m_oShape.Pan(dx,dy);
		m_map.Invalidate();
	}
}

void CMapperView::OnContextMenu(CWnd* pWnd, CPoint point) 
{
	if(m_oShape.HadSel())
	{
		CMenu menu;
		menu.LoadMenu(IDR_SHAPE);
		menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,
			point.x,point.y,this);	
	}
	else
	{
		CMenu menu;
		menu.LoadMenu(IDR_SEIS);
		menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,
			point.x,point.y,this);	
	}
			
}

void CMapperView::OnQueryClear2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_QUERY_CLEAR,0);		
}

void CMapperView::OnQueryRecord2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_QUERY_RECORD,0);		
}

void CMapperView::OnSeisEq32() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SEIS_EQ3,0);		
}

void CMapperView::OnSeisEq3Clear2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SEIS_EQ3_CLEAR,0);		
}

void CMapperView::OnSeisEq3Shp2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SEIS_EQ3_SHP,0);		
}

void CMapperView::OnSeisLiedu2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SEIS_LIEDU,0);		
}

void CMapperView::OnSeisLieduClear2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SEIS_LIEDU_CLEAR,0);	
}

void CMapperView::OnSeisLieduQuery2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SEIS_LIEDU_QUERY,0);		
}

void CMapperView::OnSeisShp2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SEIS_SHP,0);	
}

void CMapperView::OnSeisSunshi2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SEIS_SUNSHI,0);		
}

void CMapperView::OnSeisSunshiClear2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SEIS_SUNSHI_CLEAR,0);		
}

void CMapperView::OnShapeClear2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SHAPE_CLEAR,0);		
}

void CMapperView::OnShapeClearAll2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SHAPE_CLEAR_ALL,0);	
}

void CMapperView::OnShapeData2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SHAPE_DATA,0);	
}

void CMapperView::OnShapeDelete2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SHAPE_DELETE,0);	
}

void CMapperView::OnShapeExportShp2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SHAPE_EXPORT_SHP,0);	
}

void CMapperView::OnShapeOpen2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SHAPE_OPEN,0);		
}

void CMapperView::OnShapeSave2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SHAPE_SAVE,0);	
}

void CMapperView::OnShapeSetup2() 
{
	::SendMessage(m_pWnd->m_hWnd,WM_COMMAND,ID_SHAPE_SETUP,0);	
}

⌨️ 快捷键说明

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