📄 mapperview.cpp
字号:
// 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 + -