使用OpenGL绘制 shapefile文件 完成最基本的gis操作

主要内容概述

  1.解析shapefile(.shp)文件。‘

  2.将经纬度数据按照墨卡托投进行投影(调用proj.4库)完成。

  3.将数据用OpenGL的方式进行绘制。

  上述3方面只是完成初步的绘制,对于要完成一个复杂的地理信息系统还有很大的差距,

下面介绍我设计的简单的地理信息框架(用于交流,进步)。先上个图,根据图来说更加易懂。

其中地图框架中包含多个物理地理图层,是真实存在的图层,所有在该图层下的数据都会被绘制到图层上(即一张图片)。

物理图层中包含了多个逻辑图层(Layer),是为了方便应用层使用而设计的逻辑图层,用于将地图要素进行分类管理

使用,最后Layer中包含的是真正的地图要素数据,是真正绘制使用的数据。

  在实际的应用中,可以把影像数据作为一个物理图层,将矢量要素数据作为一个物理图层,最后将两个图层合成输出。

当然在实际应用中,我增加了一个图层,即实时绘制层,即将距离测量,面积测量,角度测量等做在该层,这样在地图刷新的

时候重新绘制的数据不多,提高程序的性能。

  先上一个图,我目前做的简单的gis框架(只是满足我目前的需求,主要的特点就是速度快)。如下图所示。

初步的完成上面的框架设计后,我得到了上面的结果,在这想与大家分享的是OpenGL在处理多边形填充区域的时候比较麻烦,我将矢量线和面做了两个

逻辑图层,这样做可以选择显示线和面两中模式。在完成这个效果图的时候为了追求效率,遇到最大的问题是绘制文字,众所周知OpenGL没有绘制文字

的功能,需要自己做,其用到了我前面的随笔,有兴趣的可以自行参考。

  为了做标会功能,在做界面花费了我很多精力,为了让软件具备跨平台的目的(可以再Andriod手机平台上用),界面我采用OpenGL封装了一个轻量级的

界面库(这个很不值得),网上也有很多开源的界面库,比如Mygui,FastUI,CEGUI等,我都有用过,要不在效率上满足不了我的要求,要么占用较大的内存,

最后自己只有自己写了,上图。

编辑各种常用的图形界面如下:

最后,我增加了一个曲线模板,即可以把比较好的样式保存成模板,想用的使用直接拖出来就直接可以应用。

如下所示。

完成了。后续如果大家觉得还好,我会继续写,并把代码分享出来。

时间: 2024-08-15 02:18:49

使用OpenGL绘制 shapefile文件 完成最基本的gis操作的相关文章

las点转为Shapefile文件,获取高程信息

将LiDAR点文件转换为Shapefile文件,方便ArcGIS9.3版本操作 const char *pSrcFileName = "D:\\LidarTestData\\1.las"; std::ifstream ifs;ifs.open(pSrcFileName, std::ios::in | std::ios::binary); if(ifs == NULL) { cout<<"null"<<endl; } liblas::Reade

OpenGl 绘制一个立方体

OpenGl 绘制一个立方体 为了绘制六个正方形,我们为每个正方形指定四个顶点,最终我们需要指定6*4=24个顶点.但是我们知道,一个立方体其实总共只有八个顶点,要指定24次,就意味着每个顶点其实重复使用了三次,这样可不是好的现象.最起码,像上面这样重复烦琐的代码,是很容易出错的.稍有不慎,即使相同的顶点也可能被指定成不同的顶点了. 如果我们定义一个数组,把八个顶点都放到数组里,然后每次指定顶点都使用指针,而不是使用直接的数据,这样就避免了在指定顶点时考虑大量的数据,于是减少了代码出错的可能性.

shapefile文件

基本信息编辑 ESRI公司的Shapefile文件是描述空间数据的几何和属性特征的非拓扑实体矢量数据结构的一种格式. 内容编辑 一个Shapefile文件最少包括三个文件: 主文件(*.shp).--存储地理要素的几何图形的文件. 索引文件(*.shx).--存储图形要素与属性信息索引的文件. dBASE表文件(*.dbf),--存储要素信息属性的dBase表文件. 除此之外还有可选的文件包括: 空间参考文件(*.prj). 几何体的空间索引文件(*.sbn 和 *.sbx). 只读的Shape

AE中Shapefile文件添加到SDE数据集

linder_lee 原文 AE中Shapefile文件添加到SDE数据集(c#) 主要完成用C#,通过AE将本地Shapefile文件导入到SDE的指定数据集下面. 首先说下思路: (1) 通过OpenFileDialog打开本地的Shp文件: (2)通过获取的Shp文件创建FeatureClass,获取shp的字段 IFields,并判断图层类别; (3)连接SDE中指定数据集,并创建新的FeatureClass: (4)将shp文件对应的 FeatureClass里的Feature复制到S

opengl绘制图片

#include <GL/glew.h>#include <glut.h>#include "FreeImage.h"#include <stdio.h> #include <malloc.h> #pragma comment(lib, "FreeImage.lib") GLuint texture; // Storage For One Texture ( NEW ) /*void loadTexture(){ FI

OpenGL绘制简单场景,实现旋转缩放平移和灯光效果

本项目实现了用OpenGL绘制一个简单场景,包含正方体.球体和网格,实现了物体的旋转.缩放.平移和灯光效果.附有项目完整代码,有详细注释.适合初学者熟悉opengl使用. 开发情况 开发环境VS2012+OpenGL 开发平台 Intel core i5,Intel HD Graphics Family 本项目实现了绘制一个场景(包括立方体.球体.网格),对各物体实现平移.旋转.缩放功能,添加了光源并简单设置了物体材质. 本项目示例代码下载(里面有详细注释) 感谢nehe的框架! 场景介绍 初始

OpenGL绘制棱锥,剔除

/** * 缓冲区工具类 */public class BufferUtil { /**  * 将浮点数组转换成字节缓冲区  */ public static ByteBuffer arr2ByteBuffer(float[] arr){  ByteBuffer ibb = ByteBuffer.allocateDirect(arr.length * 4);  ibb.order(ByteOrder.nativeOrder());  FloatBuffer fbb = ibb.asFloatBu

openGL绘制正方形

/** * 缓冲区工具类 */public class BufferUtil { /**  * 将浮点数组转换成字节缓冲区  */ public static ByteBuffer arr2ByteBuffer(float[] arr){  ByteBuffer ibb = ByteBuffer.allocateDirect(arr.length * 4);  ibb.order(ByteOrder.nativeOrder());  FloatBuffer fbb = ibb.asFloatBu

OpenGl绘制螺旋线

/** * 缓冲区工具类 */public class BufferUtil { /**  * 将浮点数组转换成字节缓冲区  */ public static ByteBuffer arr2ByteBuffer(float[] arr){  ByteBuffer ibb = ByteBuffer.allocateDirect(arr.length * 4);  ibb.order(ByteOrder.nativeOrder());  FloatBuffer fbb = ibb.asFloatBu