MFC读shapefile线或面文件画地图

MFC读shapefile线或面文件画地图

源代码

头文件声明成员变量

	RECT m_clientRECT;
	CDC *m_Province_Boundary_memDC;
	CBitmap *m_Province_Boundary_memBmp;
	//最小经度与最大纬度
	float m_minlon;
	float m_maxlat;
	//画图比例
	int m_ratio;

oncreate函数定义变量,内存画图

	GetParentFrame()->GetClientRect(&m_clientRECT);
	m_clientDC = GetDC();

	m_Province_Boundary_memBmp = new CBitmap();
	m_Province_Boundary_memDC = new CDC();
	m_Province_Boundary_memDC->CreateCompatibleDC(m_clientDC);
	m_Province_Boundary_memBmp->CreateCompatibleBitmap(m_clientDC,memw,memh);
	m_Province_Boundary_memDC->SelectObject(*m_Province_Boundary_memBmp);
	
	m_minlon = 73;
	m_maxlat = 54; 
	m_ratio = 3600 / 40;

画图函数

	CString strFilePath;//shapefile文件路径
	CString strName = _T("Province_Boundary.shp");//shapefile文件名
	strFilePath.Format(_T(".\\Map\\%s"), strName);//shapefile文件放在项目目录创建的Map文件夹中
	
	CPen pen(PS_SOLID, 2, clr);//创建画笔,2为线宽,clr是颜色
	CPen *pen_Old = m_Province_Boundary_memDC->SelectObject(&pen);//选择画笔

	FILE* fp = fopen(strFilePath, _T("rb"));
    if (fp == NULL) {
        AfxMessageBox(_T"打开shapefile文件失败");
        exit(0);
    }
	//读取文件头
	int fc;                  //File Code:9994
	int ud;                  //Unused
    int fl;                  //文件的实际长度
    int vr;                  //版本号
    int ft;                  //几何类型
	                         //0 Null Shape 表示这个 Shapefile 文件不含坐标
                             //1 Point 表示 Shapefile 文件记录的是点状目标,但不是多点
                             //3 PolyLine 表示 Shapefile 文件记录的是线状目标
                             //5 Polygon 表示 Shapefile 文件记录的是面状目标
    double xi;               //空间数据所占空间范围的 X 方向最小值
    double yi;               //空间数据所占空间范围的 Y 方向最小值
    double xa;               //空间数据所占空间范围的 X 方向最大值
    double ya;               //空间数据所占空间范围的 Y 方向最大值
    double zi;               //空间数据所占空间范围的 Z 方向最小值
    double za;               //空间数据所占空间范围的 Z 方向最大值
    double mi;               //Measure最小值
    double ma;               //Meature最大值

	fread(&fc, sizeof(int), 1, fp);     //读取File Code
	for(int i=0;i<5;i++) fread(&ud, sizeof(int), 1, fp); //读取Unused
	fread(&fl, sizeof(int), 1, fp);     //读取文件的实际长度
    fread(&vr, sizeof(int), 1, fp);     //读取版本号
    fread(&ft, sizeof(int), 1, fp);     //读取几何类型
    fread(&xi, sizeof(double), 1, fp);
    fread(&yi, sizeof(double), 1, fp);
    fread(&xa, sizeof(double), 1, fp);
    fread(&ya, sizeof(double), 1, fp);
    fread(&zi, sizeof(double), 1, fp);
    fread(&za, sizeof(double), 1, fp);
    fread(&mi, sizeof(double), 1, fp);
    fread(&ma, sizeof(double), 1, fp);

	//读取实体内容
	if(ft == 3||ft == 5){       //线类型或者面类型
		int num;                 //记录序号
		int len;                 //记录长度
		while((fread(&num, sizeof(int), 1, fp) != 0)){  //逐条读记录
			fread(&len, sizeof(int), 1, fp);         //读取当前记录长度
			int ftp;                                 //当前记录类型记录
            double area[4];                          //当前记录坐标范围
			int partnum;                             //当前记录包含的子线段/子环个数
            int pointnum;                            //当前记录坐标点数
            int *part;                               //每个子线段/子环的第一个坐标点在所有坐标中的位置
			fread(&ftp, sizeof(int), 1, fp);         //读ftp
            for(int i = 0; i < 4; i++) fread(area + i, sizeof(double), 1, fp); //读area
            fread(&partnum, sizeof(int), 1, fp);      //读partnum
            fread(&pointnum, sizeof(int), 1, fp);     //读pointnum
            part = new int[partnum];                 //根据子线段/子环个数动态分配part数组内存
            
			for(int i = 0; i < partnum; i++) fread(part + i, sizeof(int), 1, fp);

			int pointnum1 = 0;//真实点数

			for(int i = 0; i < partnum; i++){
				if(i != partnum - 1) pointnum1 =  part[i + 1] - part[i];//每个子环的长度 ,非最后一个环
				else pointnum1 = pointnum - part[i];	//最后一个环
				double *pointsx;                         //x坐标临时存储数组
				double *pointsy;                         //y坐标临时存储数组
				pointsx = new double[pointnum1];           //动态分配内存
				pointsy = new double[pointnum1];

				for(int j = 0; j < pointnum1; j++){
					 fread(pointsx + j, sizeof(double), 1, fp);
					 fread(pointsy + j, sizeof(double), 1, fp);
				}

				//非闭环(首尾两个点不一致),跳过
				if(pointsx[0] != pointsx[pointnum1 - 1] || pointsy[0] != pointsy[pointnum1 - 1]){
					delete []pointsx;
					delete []pointsy;
					continue;
				}

				for(int j = 0; j < pointnum1; j++){
					pointsx[j] = (pointsx[j] - m_minlon) * m_ratio;
					pointsy[j] = (m_maxlat - pointsy[j]) * m_ratio;
					if(j > 0){
						//此处在内存画布中画地图
						m_Province_Boundary_memDC->MoveTo(pointsx[j - 1], pointsy[j - 1]);
						m_Province_Boundary_memDC->LineTo(pointsx[j], pointsy[j]);
					}
				}
				delete []pointsx;
				delete []pointsy;
			}
		}
	}

	m_Province_Boundary_memDC->SelectObject(pen_Old);
	DeleteObject(pen);
	fclose(fp);

在客户区显示

CClientDC dc(this);
dc.BitBlt(0, 0, m_clientRECT.right, m_clientRECT.bottom, m_Province_Boundary_memDC, 0, 0, SRCCOPY);

注意

m_ratio; 决定地图大小
m_minlon; m_maxlat;两者确定左上角的经纬度

显示结果

在这里插入图片描述

  • 0
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 天目湖流域的流域边界线shapefile文件是一种地理信息文件,用于描述天目湖的流域边界线的矢量数据。该文件可以被地理信息系统软件和其他相关软件取和使用。 shapefile文件是ESRI(Environmental Systems Research Institute)公司开发的一种常见的地理信息数据格式。它由多个文件组成,包括一个.shp文件、一个.shx文件和一个.dbf文件等。其中,.shp文件存储了矢量数据的几何形状信息,.shx文件用于索引数据的位置,.dbf文件保存了属性数据。 天目湖流域是指天目湖流域区域内的水域、流域边界线和相关的地理特征。流域边界线shapefile文件以矢量数据的形式,精确地描述了天目湖流域的边界线,可以用于进行流域的分析和地理空间分析。 使用这个shapefile文件,可以进行多种分析,如流域面积计算、流域形状分析、水文建模等。同时,还可以将该文件与其他相关的地理信息数据进行叠加分析,比如土地利用数据、高程数据等,以获得更详细的天目湖流域信息。 总之,天目湖流域边界线shapefile文件提供了对天目湖流域边界线的几何形状和属性数据的描述,为研究和管理天目湖流域提供了重要的地理信息支持。 ### 回答2: 天目湖流域位于浙江省临安市天目山地区,是一个重要的淡水湖泊。为了研究和保护天目湖流域的水资源,我们需要一个流域边界线shapefile文件shapefile是一种GIS数据格式,可以包含点、线和面等要素,用于描述地理空间数据。流域边界线shapefile文件,通常包括流域的轮廓线和相关属性信息。 制作天目湖流域的shapefile文件,首先需要收集地理数据。这些数据可以从地图、卫星影像或GPS测量中获取。然后,通过地理信息系统(GIS)软件,将这些数据进行处理和编辑,制作出流域边界线。 在实际操作中,可以使用软件如ArcGIS或QGIS来创建shapefile文件。首先,导入收集到的地理数据为基础数据。然后,利用工具如编辑器和绘图工具,在地图上描绘出天目湖流域的边界线。根据需要,可以添加额外的属性信息,如流域的名称、面积、降水量等。 完成流域边界线的绘制后,需要对数据进行验证和校正。可以通过比较不同数据源的一致性,或者与实地调查结果进行对比,确保边界线的准确性和完整性。 最后,将制作好的shapefile文件保存,并可以导入到其他GIS软件中进行分析和应用。这个shapefile文件可以为研究者提供流域范围和相关属性数据,方便他们进行流域研究、资源管理和环境评估等工作。 总而言之,制作天目湖流域边界线shapefile文件是一个包括收集数据、绘制边界线、添加属性信息和验证校正的过程。这个文件为研究和管理天目湖流域提供了基础数据,有助于更好地了解并保护该地区的水资源。 ### 回答3: 天目湖流域流域边界线shapefile文件是一种地理信息系统(GIS)文件格式,用于存储天目湖流域的边界线数据。shapefile文件通常由多个文件组成,包括.shp、.shx、.dbf等文件。 .shp文件shapefile文件的主文件,其中包含了边界线的几何形状信息,如点、线、面等。在天目湖流域的情况下,这个文件可能包含了湖泊、河流、山脉等边界线的几何形状。 .shx文件shapefile文件的索引文件,用于加快数据的取和查询速度。它存储了每个几何形状的位置和记录号的索引。 .dbf文件shapefile文件的属性表文件,用于存储与每个几何形状相关的属性数据,如流域的名称、面积、海拔等信息。 这些文件可以被地理信息系统软件(如ArcGIS、QGIS等)打开和使用。通过加载天目湖流域流域边界线shapefile文件,我们可以显示和分析天目湖流域的边界线数据。 使用这些数据,我们可以进行各种地理空间分析,如确定流域的面积、河流的长度、湖泊的周长等。它们还可以用于地质、环境和城市规划等领域的研究和决策支持。 总之,天目湖流域流域边界线shapefile文件是一种用于存储和分析天目湖流域地理信息的标准文件格式,它包含了边界线的几何形状和属性数据,可以被地理信息系统软件用于各种地理空间分析和决策支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值