GIS暑期实习报告.docx
《GIS暑期实习报告.docx》由会员分享,可在线阅读,更多相关《GIS暑期实习报告.docx(34页珍藏版)》请在冰点文库上搜索。
GIS暑期实习报告
GIS 暑期实习
报告
班号:
064081—28
姓名:
任远
完成日期:
2011-07-14
提交日期:
2011-07-14
第一部分.....................................................................................................................................................................1
程序设计思路:
....................................................................................................................................1
程序实现过程:
....................................................................................................................................1
1.定义图形类:
.................................................................................................................................1
2.读取 Shape 文件并存储在图形类中...........................................................................................2
3.文件的显示 ...................................................................................................................................4
4.图形的放大、缩小和漫游 ............................................................................................................6
5.缓冲区的创建 ...............................................................................................................................7
6.视图的重绘 .................................................................................................................................11
程序运行结果:
..................................................................................................................................11
1.图形的显示:
...............................................................................................................................12
2.缓冲区分析:
...............................................................................................................................12
第二部分...................................................................................................................................................................12
程序实现过程:
..................................................................................................................................12
1.建立 VB 工程.............................................................................................................................12
2.通过代码加载数据 .....................................................................................................................13
3.图层操作 .....................................................................................................................................13
4.显示图层要素类型 .....................................................................................................................14
5.地图属性的查询 .........................................................................................................................15
6.地图信息可视化 .........................................................................................................................16
程序运行结果:
..................................................................................................................................17
1.加载图层 .....................................................................................................................................17
2.图形的放大、缩小、漫游............................................................................................................17
3.显示图层要素信息 .....................................................................................................................18
4.地图属性的查询 .........................................................................................................................18
5.地图信息可视化 .........................................................................................................................18
第一部分
程序设计思路:
首先定义图形类,在图形类的定义中编写图形绘制方法和缓冲区创建方法,将缩放倍数与
平移坐标作为这些方法的传入参数以适应后面所要实现的种各功能。
然后编写函数将 shape
文件中的数据读入图形类中,采用图形类基类的指针的结点以链表方式存储。
接下来在视图
类中通过调用图形绘制方法来显示图形,改变缩放倍数与平移坐标等传入参数可以实现图
形的放大缩小与漫游。
当需要进行缓冲区分析时,则在视图类中调用缓冲区创建方法进行缓
冲区的创建。
程序实现过程:
1.定义图形类:
首先定义图形类基类 CShape,然后定义派生图形类 CSPoint(点类)、CPolyLine(线类)、
CPolygon(多边形类):
1)定义图形类基类 CShape
class CShape:
public CObject
{
public:
CShape(){}; //构造函数
int ShapeType;//图形几何类型
virtual void Draw(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX,
double mY, double n);//图形绘制方法
virtual void CreateBuffer(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX,
double mY, double n,double BufferRadius, COLORREF Color); //创建缓冲区方法
~CShape(){};//析构函数
};
2)定义派生图形类 CSPoint
class CSPoint:
virtual public CShape
{
public:
CSPoint(){};
public:
double x;//点坐标
double y;
virtual void Draw(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX,
double mY, double n);//点绘制方法
virtual void CreateBuffer(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX,
double mY, double n,double BufferRadius, COLORREF Color);//点缓冲区创建方法
~CSPoint(){};
};
1
3)定义派生图形类 CPolyLine
class CPolyLine:
virtual public CShape
{
public:
CPolyLine(){};
public:
double Box[4]; //坐标范围
int NumParts;//子线段个数
int NumPoints; //坐标点数
int* Parts;//子线段起始位置数组
double* PointsX;//线上各点 X 坐标数组
double* PointsY;//线上各点 Y 坐标数组
virtual void Draw(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX,
double mY, double n);//线绘制方法
virtual void CreateBuffer(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX,
double mY, double n,double BufferRadius, COLORREF Color);//线缓冲区创建方法
~CPolyLine(){};
};
4)定义派生图形类 CPolygon
class CPolygon:
virtual public CPolyLine
{
public:
CPolygon(){};
virtual void Draw(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX,
double mY, double n);//多边形绘制方法
virtual void CreateBuffer(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX,
double mY, double n,double BufferRadius, COLORREF Color); //多边形缓冲区创建方法
~CPolygon(){};
};
2.读取 Shape 文件并存储在图形类中
在 CGISDoc 中声明并定义链表和文件读取函数,用来将 Shape 文件读入图形类并存储
在链表中。
这里在链表中保存图形类基类的指针,用图形类基类的指针来指向派生图形类
的对象。
在 CGISView 中响应菜单项【打开】,在消息响应函数中首先调用文件读取函数将 shape
文件中的数据读入图形类并存储在链表中,然后遍历链表调用图形绘制方法显示图形。
1)菜单项【打开】的消息响应函数
void CGISView:
:
OnFileOpen()
{
// TODO:
Add your command handler code here
CGISDoc* pDoc = GetDocument(); //获取文档类指针
2
CFileDialog dlg(TRUE,NULL,NULL,0,"(*.shp)|*.shp"); //创建文件打开对话框
dlg.m_ofn.lpstrTitle = "打开文件 ";
CString path;
if( dlg.DoModal() !
= IDOK )
return;
path = dlg.GetPathName();//获得打开文件路径
FILE* fp=fopen(path,"rb");//打开文件
if(!
fp)
return;
pDoc->ReadShp(fp);//调用文档类中的文件读取函数
//从文档类中获得图幅范围
double Xmax=pDoc->Xmax;
double Xmin=pDoc->Xmin;
double Ymax=pDoc->Ymax;
double Ymin=pDoc->Ymin;
CClientDC dc(this);//获得客户区
CRect rectClient;
GetClientRect(rectClient);
CSize sizeClient=rectClient.Size(); //获得客户区大小
double nx=(Xmax-Xmin)/(double(sizeClient.cx)-100);
double ny=(Ymax-Ymin)/(double(sizeClient.cy)-100);
n=(nx>ny)?
nx:
ny;//计算图幅缩放比例
mX=((Xmax-Xmin)/n-sizeClient.cx)/2;
mY=((Ymax-Ymin)/n-sizeClient.cy)/2;//计算图形平移距离
CTypedPtrList& shapeList = pDoc->m_shapeList; //图形类链表
POSITION pos = shapeList.GetHeadPosition();
while (pos !
= NULL)
{
CShape* m_shape = shapeList.GetNext(pos);
m_shape->Draw(&dc,Xmin,Ymin,Ymax,mX,mY,n); //调用图形绘制方法
}
}
2)Shape 文件读取函数
(1)读取完整文件:
完整文件的读取包括头文件的读取与分类型的实体信息读取:
void CGISDoc:
:
ReadShp(FILE*m_ShpFile_fp)
{
int type=OnReadShphead(m_ShpFile_fp);//读取头文件并返回图形类型值
switch(type)//根据图形类型值确定实体信息读取方法
{
3
case 1:
OnReadPointShp(m_ShpFile_fp);//读取点实体信息
break;
case 3:
OnReadLineShp(m_ShpFile_fp);//读取线实体信息
break;
case 5:
OnReadAreaShp(m_ShpFile_fp);//读取多边形实体信息
break;
default:
return;
}
}
(2)头文件的读取
(3)分类型的实体信息读取
由于这里是使用示例代码读取文件,因此对于
(2)、(3)部分的代码这里不再列出。
3.文件的显示
文件的显示是通过在视图类的消息响应函数以及重绘函数中调用图形类中的图形绘制方
法来实现的,而图形绘制方法则封装在各图形类中。
在图形绘制中,首先根据客户区的大小进行图形的缩放与平移,然后进行图形的绘制。
在图形绘制方法中,Xmin、Ymin、Xmax、Ymax 为图幅坐标范围,mX、mY 为平移坐标大
小,n 为缩放比例。
1)点类的图形绘制方法
void CSPoint:
:
Draw(CDC* pDC,double Xmin, double Ymin, double Ymax, double mX, double
mY, double n)
{
double X, Y;
//进行坐标转换
X=(x-Xmin)/n-mX;
Y=((Ymax+Ymin)-y-Ymin)/n-mY;
pDC->Ellipse(int(X)-3, int(Y)-3, int(X)+3, int(Y)+3);
}
2)线类的图形绘制方法
void CPolyLine:
:
Draw(CDC* pDC, double Xmin, double Ymin, double Ymax, double mX,
double mY, double n)
{
int i, j;
int pointNum;
for(i=0;i{
//绘制子线段
if(i!
=NumParts-1)
pointNum=Parts[i+1]-Parts[i];
else
4
pointNum=NumPoints-Parts[i];
//将线上原始点的坐标进行转换后存入 CPoint 数组中
CPoint* point=new CPoint[pointNum];
for(j=Parts[i];j{
double X,Y;
X=PointsX[j]-Xmin;
Y=(Ymax+Ymin)-PointsY[j]-Ymin;
point[j-Parts[i]].x=int(X/n-mX);
point[j-Parts[i]].y=int(Y/n-mY);
}
pDC->Polyline(point,PartPoints);
delete[] point;
}
}
3)多边形类的图形绘制方法
void CPolygon:
:
Draw(CDC* pDC, double Xmin, double Ymin, double Ymax, double mX,
double mY, double n)
{
int i, j;
double Ymid=(Ymin+Ymax)/2;
int pointNum;
for(i=0;i{
//绘制子线段
if(i!
=NumParts-1)
pointNum=Parts[i+1]-Parts[i];
else
pointNum=NumPoints-Parts[i];
//将多边形边界上原始点的坐标进行转换后存入 CPoint 数组中
CPoint* point=new CPoint[pointNum];
for(j=Parts[i];j{
double X,Y;
X=PointsX[j]-Xmin;
Y=(Ymax+Ymin)-PointsY[j]-Ymin;
point[j-Parts[i]].x=int(X/n-mX);
point[j-Parts[i]].y=int(Y/n-mY);
}
5
pDC->Polygon(point,PartPoints);
delete[] point;
}
}
4)显示窗口大小的调整
为了更好的显示图形,这里在创建窗口前对窗口的大小进行设定,在创建窗口时设置窗
口大小为 800*800。
具体的做法为在 CMainFrame.cpp 文件中的 CMainFrame:
:
PreCreateWindow
(CREATESTRUCT & cs)函数加入如下代码:
cs.style&=~WS_EX_CLIENTEDGE;
CRect rect(0, 0, 800, 800);
AdjustWindowRectEx(&rect, cs.style, TRUE,cs.dwExStyle);
cs.cx = rect.right - rect.left;
cs.cy = rect.bottom - rect.top;
4.图形的放大、缩小和漫游
在菜单中添加菜单项【视图】并为其添加子菜单项【放大】、【缩小】、【漫游】,并分别为其添加
消息响应函数。
在视图类中添加变量 m_zoom 和 m_wander 作为指标值本别指示当前状态是否为放大、缩
小和漫游。
在消息响应函数中只改变当前状态指标值,真正的功能实现放在对鼠标事件的响应中。
主要的相应步骤为首先判断当前状态,然后根据当前状态调整缩放比例与平移坐标,最后强
制视图重绘。
1)鼠标左键按下
void CGISView:
:
OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO:
Add your message handler code here and/or call default
start=point;
if(m_zoom==1)//放大
{
n*=0.5;//调整缩放比例
nout++;
//计算平移坐标
mX+=(pow(2,