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

📄 graphseiadddlg.cpp

📁 vc 和mapobjects地理信息系统组件开发 很有启发意义和参考价值
💻 CPP
字号:
// GraphSeiAddDlg.cpp : implementation file
//

#include "stdafx.h"
#include "mapper.h"
#include "GraphSeiAddDlg.h"
#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CGraphSeiAddDlg dialog


CGraphSeiAddDlg::CGraphSeiAddDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CGraphSeiAddDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CGraphSeiAddDlg)
	m_fLat = 0.0f;
	m_fLon = 0.0f;
	m_fMag = 0.0f;
	m_fDepth = 0.0f;
	m_Date = COleDateTime::GetCurrentTime();
	m_Time = COleDateTime::GetCurrentTime();
	m_nSymbol = 0;
	m_fCircleR = 0.0f;
	m_fCircleX = 0.0f;
	m_fCircleY = 0.0f;
	m_nSelectType = 0;
	m_bMagMaxUse = FALSE;
	m_fMagMax = 0.0f;
	m_fMagMin = 0.0f;
	m_bMagMinUse = FALSE;
	m_sPlace = _T("");
	m_nParaType = 0;
	m_bOutline = TRUE;
	//}}AFX_DATA_INIT
}


void CGraphSeiAddDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CGraphSeiAddDlg)
	DDX_Control(pDX, IDC_COLOR_OUTLINE, m_oColorOutline);
	DDX_Control(pDX, IDC_COLOR_FILL, m_oColorFill);
	DDX_Control(pDX, IDC_SEISM_LIST, m_ctrlSeismList);
	DDX_Text(pDX, IDC_SINGLE_LAT, m_fLat);
	DDX_Text(pDX, IDC_SINGLE_LON, m_fLon);
	DDX_Text(pDX, IDC_SINGLE_MAG, m_fMag);
	DDX_Text(pDX, IDC_SINGLE_DEPTH, m_fDepth);
	DDX_DateTimeCtrl(pDX, IDC_DATE, m_Date);
	DDX_DateTimeCtrl(pDX, IDC_TIME, m_Time);
	DDX_CBIndex(pDX, IDC_SEI_SYMBOL, m_nSymbol);
	DDX_Text(pDX, IDC_CIRCLE_R, m_fCircleR);
	DDX_Text(pDX, IDC_CIRCLE_X, m_fCircleX);
	DDX_Text(pDX, IDC_CIRCLE_Y, m_fCircleY);
	DDX_CBIndex(pDX, IDC_SELECT_TYPE, m_nSelectType);
	DDX_Check(pDX, IDC_MAG_MAX_USE, m_bMagMaxUse);
	DDX_Text(pDX, IDC_MAG_MAX, m_fMagMax);
	DDX_Text(pDX, IDC_MAG_MIN, m_fMagMin);
	DDX_Check(pDX, IDC_MAG_MIN_USE, m_bMagMinUse);
	DDX_Text(pDX, IDC_SINGLE_PLACE, m_sPlace);
	DDX_CBIndex(pDX, IDC_PARA_TYPE, m_nParaType);
	DDX_Check(pDX, IDC_OUTLINE, m_bOutline);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CGraphSeiAddDlg, CDialog)
	//{{AFX_MSG_MAP(CGraphSeiAddDlg)
	ON_BN_CLICKED(IDC_CLEAR, OnClear)
	ON_BN_CLICKED(IDC_CONFIRM, OnConfirm)
	ON_NOTIFY(NM_CLICK, IDC_SEISM_LIST, OnClickSeismList)
	ON_BN_CLICKED(IDC_CAT_SELECT, OnCatSelect)
	ON_BN_CLICKED(IDC_FILE_SAVE, OnFileSave)
	ON_BN_CLICKED(IDC_FILE_LOAD, OnFileLoad)
	ON_BN_CLICKED(IDC_ADD, OnAdd)
	ON_BN_CLICKED(IDC_DELETE, OnDelete)
	ON_BN_CLICKED(IDC_SEL_ALL, OnSelAll)
	ON_BN_CLICKED(IDC_SEL_NONE, OnSelNone)
	ON_BN_CLICKED(IDC_SEL_INVERT, OnSelInvert)
	ON_BN_CLICKED(IDC_UPDATE_SEI, OnUpdateSei)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGraphSeiAddDlg message handlers

BOOL CGraphSeiAddDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	m_ctrlSeismList.SetExtendedStyle(LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

	COleDateTime	dt;
	CString str;
	m_ctrlSeismList.InsertColumn(0,"时间");
	m_ctrlSeismList.InsertColumn(1,"经度");
	m_ctrlSeismList.InsertColumn(2,"纬度");
	m_ctrlSeismList.InsertColumn(3,"震级");
	m_ctrlSeismList.InsertColumn(4,"深度");
	m_ctrlSeismList.InsertColumn(5,"地名");
	m_ctrlSeismList.SetColumnWidth(0,150);
	m_ctrlSeismList.SetColumnWidth(1,60);
	m_ctrlSeismList.SetColumnWidth(2,50);
	m_ctrlSeismList.SetColumnWidth(3,40);
	m_ctrlSeismList.SetColumnWidth(4,50);
	m_ctrlSeismList.SetColumnWidth(5,150);

	if(m_lSum>0)
	{
		//添加到列表中
		for(int index=0;index<m_lSum;index++)
		{
			dt=m_Sei[index].dt;
			str=dt.Format("%Y.%m.%d %H-%M-%S");
			m_ctrlSeismList.InsertItem(index,str);
			str.Format("%6.2f",m_Sei[index].lon);
			m_ctrlSeismList.SetItemText(index,1,str);
			str.Format("%5.2f",m_Sei[index].lat);
			m_ctrlSeismList.SetItemText(index,2,str);
			str.Format("%3.1f",m_Sei[index].mag);
			m_ctrlSeismList.SetItemText(index,3,str);
			str.Format("%5.1f",m_Sei[index].depth);
			if(m_Sei[index].depth>=0)
				m_ctrlSeismList.SetItemText(index,4,str);
			m_ctrlSeismList.SetItemText(index,5,m_Sei[index].szPlace);
			m_ctrlSeismList.SetCheck(index,m_Sei[index].bView);
		}
	}

	m_oColorFill.SetColor(RGB(255,0,0));
	m_oColorOutline.SetColor(RGB(0,0,255));
	UpdateData(FALSE);
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CGraphSeiAddDlg::OnClear() 
{
	UpdateData(TRUE);
	m_ctrlSeismList.DeleteAllItems();
	m_Sei.RemoveAll();
}

void CGraphSeiAddDlg::OnConfirm() 
{
	UpdateData(TRUE);
	m_lSum=m_ctrlSeismList.GetItemCount();
	
	int i;
	//根据check设置
	for(i=0;i<m_lSum;i++)
	{
		m_Sei[i].bView=m_ctrlSeismList.GetCheck(i);
	}

	//挑选地震,只能设置不能显示的条件,否则会破坏前面的条件选择
	switch(m_nSelectType)
	{
	case 0:	//不限定
		break;
	case 1:	//圆形
		if(fabs(m_fCircleR)<0.0005f)
		{
			AfxMessageBox("界定半径不能为0!");
			return;
		}
		for(i=0;i<m_lSum;i++)
		{
			//单位:度
//			if(jwdist(m_fCircleY,m_fCircleX,m_Sei[i].lat,m_Sei[i].lon)>(m_fCircleR*111.11))
			//单位:公里
			if(jwdist(m_fCircleY,m_fCircleX,m_Sei[i].lat,m_Sei[i].lon)>m_fCircleR)
			{
				m_Sei[i].bView=FALSE;
				continue;
			}
		}
		break;
	case 2:	//矩形
		if(fabs(m_fCircleR)<0.0005f)
		{
			AfxMessageBox("界定半径不能为0!");
			return;
		}
		for(i=0;i<m_lSum;i++)
		{
			//单位:公里
			double x1=m_fCircleX-m_fCircleR/111.11;
			double x2=m_fCircleX+m_fCircleR/111.11;
			double y1=m_fCircleY-m_fCircleR/111.11;
			double y2=m_fCircleY+m_fCircleR/111.11;

			if((m_Sei[i].lat<y1)&&(m_Sei[i].lat>y2)&&(m_Sei[i].lon<x1)&&(m_Sei[i].lon>x2))
			{
				m_Sei[i].bView=FALSE;
				continue;
			}
		}
		break;
	}

	for(i=0;i<m_lSum;i++)
	{
		if((m_bMagMinUse==TRUE)&&(m_fMagMin>m_Sei[i].mag))
		{
			m_Sei[i].bView=FALSE;
			continue;
		}
		if((m_bMagMaxUse==TRUE)&&(m_fMagMax<m_Sei[i].mag))
		{
			m_Sei[i].bView=FALSE;
			continue;
		}
	}

	CDialog::OnOK();
}

void CGraphSeiAddDlg::OnClickSeismList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	UpdateData(TRUE);
	CString str;
	int index=m_ctrlSeismList.GetNextItem(-1,LVNI_SELECTED);
	if(index<0)
		return;

	COleDateTime dt=m_Sei[index].dt;

	m_Date=dt;
	m_Time=dt;

	m_fLon=m_Sei[index].lon;
	m_fLat=m_Sei[index].lat;
	m_fMag=m_Sei[index].mag;
	m_fDepth=m_Sei[index].depth;
	m_sPlace=m_Sei[index].szPlace;
	UpdateData(FALSE);

	*pResult = 0;
}

void CGraphSeiAddDlg::OnCatSelect() 
{

}

void CGraphSeiAddDlg::OnFileSave() 
{
	UpdateData(TRUE);
	//将列表中的地震保存到文件
	int nYear,nMonth,nDay,nHour,nMin,nSec;
	float fLat,fLon,fMag,fDepth;
	COleDateTime	dt;
	CString str;
	CFileDialog	fd(FALSE,"*.sst",NULL,OFN_EXPLORER|OFN_HIDEREADONLY,
		"地震目录文本文件(*.sst)|*.sst||",this);
	if(fd.DoModal()!=IDOK)
		return;
	CString sFilePath=fd.GetPathName();
	CStdioFile fsst;
	if(!fsst.Open(sFilePath,CStdioFile::modeCreate|CStdioFile::modeWrite))
	{
		AfxMessageBox("不能建立文件!",MB_OK|MB_ICONSTOP);
		return;
	}
	for(int i=0;i<m_ctrlSeismList.GetItemCount();i++)
	{
		dt=m_Sei[i].dt;
		nYear=dt.GetYear();
		nMonth=dt.GetMonth();
		nDay=dt.GetDay();
		nHour=dt.GetHour();
		nMin=dt.GetMinute();
		nSec=dt.GetSecond();
		fLat=m_Sei[i].lat;
		fLon=m_Sei[i].lon;
		fMag=m_Sei[i].mag;
		fDepth=m_Sei[i].depth;
		str.Format("%4d %02d %02d %02d %02d %02d %7.4f %8.4f %3.1f %6.2f %s\n",
			nYear,nMonth,nDay,nHour,nMin,nSec,fLat,fLon,fMag,fDepth,m_Sei[i].szPlace);
		fsst.WriteString(str);
	}
	fsst.Close();
}

void CGraphSeiAddDlg::OnFileLoad() 
{
	UpdateData(TRUE);
	//从文件中读地震参数添加到列表中
	//将列表中的地震保存到文件
	int nYear,nMonth,nDay,nHour,nMin,nSec,nSum;
	float fLat,fLon,fMag,fDepth;
	COleDateTime dt;
	CString str,sLine,sPlace;
	char temp[255];
	CFileDialog	fd(TRUE,"*.sst",NULL,OFN_EXPLORER|OFN_HIDEREADONLY,
		"地震目录文本文件(*.sst)|*.sst||",this);
	if(fd.DoModal()!=IDOK)
		return;
	CString sFilePath=fd.GetPathName();
	CStdioFile fsst;
	if(!fsst.Open(sFilePath,CStdioFile::modeRead))
	{
		AfxMessageBox("不能打开文件!",MB_OK|MB_ICONSTOP);
		return;
	}
	while(1)
	{
		sLine="";
		if(!fsst.ReadString(sLine))	break;
		strcpy(temp,sLine);
		sPlace="";
		sscanf(temp,"%d %d %d %d %d %d %f %f %f %f %s",
			&nYear,&nMonth,&nDay,&nHour,&nMin,&nSec,&fLat,&fLon,&fMag,&fDepth,sPlace);
		SMapperSeisInfo si;
		dt.SetDateTime(nYear,nMonth,nDay,nHour,nMin,nSec);
		si.dt=dt;
		si.lat=fLat;
		si.lon=fLon;
		si.mag=fMag;
		si.depth=fDepth;
		strcpy(si.szPlace,sPlace);

		//保存
		nSum=m_ctrlSeismList.GetItemCount();
		m_Sei.SetAtGrow(nSum,si);

		//显示
		str=dt.Format("%Y.%m.%d %H-%M-%S");
		m_ctrlSeismList.InsertItem(nSum,str);
		str.Format("%6.2f",fLon);
		m_ctrlSeismList.SetItemText(nSum,1,str);
		str.Format("%5.2f",fLat);
		m_ctrlSeismList.SetItemText(nSum,2,str);
		str.Format("%3.1f",fMag);
		m_ctrlSeismList.SetItemText(nSum,3,str);
		str.Format("%5.1f",fDepth);
		if(fDepth>=0)
			m_ctrlSeismList.SetItemText(nSum,4,str);
		m_ctrlSeismList.SetItemText(nSum,5,sPlace);
	}
	fsst.Close();
}

double CGraphSeiAddDlg::jwdist(double lat0, double lon0, double lat1, double lon1)
{
   double pai=3.1425926, r0=6370., xl, dh, d0, d1, dd, dl;
    xl = r0*sin(fabs(lat1-lat0)/360.*pai)*2.;
    dh = fabs(lon1-lon0);
    if(dh > 180.) dh = 360.-dh;
    d0 = r0*cos(lat0/180.*pai)*sin(dh/360.*pai)*2.;
    d1 = r0*cos(lat1/180.*pai)*sin(dh/360.*pai)*2.;
    dd = sqrt(xl*xl+d0*d1);
    if(dd/2. >= r0) 
		dl = pai*r0;
    else
		dl = asin(dd/2./r0)*r0*2.;
    return dl;
}

void CGraphSeiAddDlg::OnAdd() 
{
	UpdateData();
	SMapperSeisInfo	si;
	COleDateTime dt=COleDateTime(m_Date.GetYear(),m_Date.GetMonth(),m_Date.GetDay(),
		m_Time.GetHour(),0,0);

	si.dt=dt;
	si.lat=m_fLat;
	si.lon=m_fLon;
	si.depth=m_fDepth;
	si.mag=m_fMag;
	strcpy(si.szPlace,m_sPlace);

	//保存
	int nSum=m_ctrlSeismList.GetItemCount();
	m_Sei.SetAtGrow(nSum,si);

	//显示
	CString str=dt.Format("%Y.%m.%d %H-%M-%S");
	m_ctrlSeismList.InsertItem(nSum,str);
	str.Format("%6.2f",m_fLon);
	m_ctrlSeismList.SetItemText(nSum,1,str);
	str.Format("%5.2f",m_fLat);
	m_ctrlSeismList.SetItemText(nSum,2,str);
	str.Format("%3.1f",m_fMag);
	m_ctrlSeismList.SetItemText(nSum,3,str);
	str.Format("%5.1f",m_fDepth);
	if(m_fDepth>=0)
		m_ctrlSeismList.SetItemText(nSum,4,str);
	m_ctrlSeismList.SetItemText(nSum,5,m_sPlace);		
}

void CGraphSeiAddDlg::OnDelete() 
{
	UpdateData(TRUE);
	int index=m_ctrlSeismList.GetNextItem(-1,LVNI_SELECTED);
	if(index<0)
	{
		AfxMessageBox("必须从列表中选择一个地震!");
		return;
	}

	if(AfxMessageBox("真的要删除此地震?",MB_YESNO)!=IDYES)
		return;

	//从列表中删除
	m_ctrlSeismList.DeleteItem(index);

	//从数据中删除
	m_Sei.RemoveAt(index);	
}

void CGraphSeiAddDlg::OnSelAll() 
{
	m_lSum=m_ctrlSeismList.GetItemCount();
	for(int i=0;i<m_lSum;i++)
	{
		m_ctrlSeismList.SetCheck(i,TRUE);
	}
}

void CGraphSeiAddDlg::OnSelNone() 
{
	m_lSum=m_ctrlSeismList.GetItemCount();
	for(int i=0;i<m_lSum;i++)
	{
		m_ctrlSeismList.SetCheck(i,FALSE);
	}
}

void CGraphSeiAddDlg::OnSelInvert() 
{
	m_lSum=m_ctrlSeismList.GetItemCount();
	for(int i=0;i<m_lSum;i++)
	{
		m_ctrlSeismList.SetCheck(i,!m_ctrlSeismList.GetCheck(i));
	}
}

void CGraphSeiAddDlg::OnUpdateSei() 
{
	int index=m_ctrlSeismList.GetNextItem(-1,LVNI_SELECTED);
	if(index<0)
	{
		AfxMessageBox("必须从列表中选择一个地震!");
		return;
	}

	UpdateData();
	
	COleDateTime dt(m_Date.GetYear(),m_Date.GetMonth(),m_Date.GetDay(),
		m_Time.GetHour(),m_Time.GetMinute(),m_Time.GetSecond());
	
	SMapperSeisInfo	si;
	si.dt=dt;
	si.lat=m_fLat;
	si.lon=m_fLon;
	si.depth=m_fDepth;
	si.mag=m_fMag;
	strcpy(si.szPlace,m_sPlace);

	//保存
	m_Sei.SetAtGrow(index,si);

	//显示
	CString str=dt.Format("%Y.%m.%d %H-%M-%S");
	m_ctrlSeismList.SetItemText(index,0,str);
	str.Format("%6.2f",m_fLon);
	m_ctrlSeismList.SetItemText(index,1,str);
	str.Format("%5.2f",m_fLat);
	m_ctrlSeismList.SetItemText(index,2,str);
	str.Format("%3.1f",m_fMag);
	m_ctrlSeismList.SetItemText(index,3,str);
	str.Format("%5.1f",m_fDepth);
	if(m_fDepth>=0)
		m_ctrlSeismList.SetItemText(index,4,str);
	m_ctrlSeismList.SetItemText(index,5,m_sPlace);	
}

⌨️ 快捷键说明

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