GIS底层开发
文章平均质量分 87
本专栏主要探讨GIS底层开发中的一些常见问题,希望在探索路上追寻到GIS的秘密!
周旭光
2013年6月毕业于福州大学,目前在北京的互联网地图厂商从事地图渲染引擎的研发工作,专注于GIS,专注于C++。如果有什么事可以通过邮箱zhouxuguang236126.com联系到我,也可以加我QQ672218231
展开
-
三维空间坐标的相似变换原理与实现
说到这个博客的题目,可能觉得有点大,在测绘学领域中三维空间坐标的相似变换用得非常多。那么什么是三维坐标的相似变换呢?就是在两个三维直角坐标系中,坐标进行变换,两个坐标系之间变换需要七个参数,即三个平移分量,以及三个旋转参数和一个尺度因子。这里用到的模型采用摄影测量学中的变换模型,具体推导见摄影测量学书籍:原创 2015-04-06 16:13:25 · 14219 阅读 · 4 评论 -
Hilbert曲线简介及生成算法
Hilbert曲线 Hilbert曲线是一种填充曲线,类似的填充曲线还包括Z曲线,格雷码等其他方法。Hilbert曲线依据自身空间填充曲线的特性,可以线性地贯穿二维或者更高维度每个离散单元,并且仅仅穿过一次,并对每个离散单元进行线性排序和编码,该编码作为该单元的唯一标识。空间填充曲线可以将高维空间中没有良好顺序的数据映射到一维空间,经过这种编码方式,空间上相邻的对象会邻近存储在一块,可以减少IO的原创 2016-03-05 18:51:20 · 14538 阅读 · 0 评论 -
GIS中的WKB介绍
GIS中的WKB介绍WKB的全称是The Well-known Binary,也简称WKB,OGC与ISO/TC211都做出了同样的规范,它是用来几何体的表达。即用连续的二进制流来表达几何体,这样在GIS互操作方面也有好处。现代GIS软件的底层模块中可以说都有关于WKB解析代码。在二进制存储中有大尾端和小尾端之分,通常在二进制流的第一个字节就指定,这样在这个字节之后的字节流就可以按照相应的大小尾端原创 2015-10-21 14:20:52 · 17699 阅读 · 0 评论 -
地球椭球面上多边形面积量算(C++代码)
昨天突然测试的时候发现以前产品中写的地球椭球面上面积计算的代码有点问题,于是今天就彻底修正,从QGIS中抠出代码来用C++重写了一下,新代码可以比较准确计算椭球面上多边形的面积,这个基础函数对空间量算功能中的面积量测非常重要,在这里共享出来供大家参考甚至直接拿过去用。 头文件如下: /*** @file DistanceArea.h* @brief原创 2015-05-15 20:32:28 · 9159 阅读 · 11 评论 -
地球椭球体基本要素的计算
地球椭球体基本要素的计算,主要包括纬线弧长、子午线弧长、椭球面上梯形面积,以及同一个椭球体下大地坐标和空间直角坐标之间的转换等。为了方便,写了一个类如下,方便调用,在此也分享给大家:头文件如下:/******************************************************************************** 版权所有(C) 福建省空间信息工程研究中原创 2015-04-06 17:21:56 · 6402 阅读 · 2 评论 -
遥感影像显示相关的技术总结
遥感影像显示相关的技术总结 前言 从事遥感影像和图像处理有一段时间了,今天就把遥感影像显示相关的技术和大家分享一下。 平常我们用的GIS软件或者说遥感软件都能讲遥感影像的数据显示在屏幕上,并且有些显示效果还不错,其中ENVI的显示效果是业界做得比较好的,尤其是ENVI5.0之后的大视图,能够根据真彩色的波段自动选择波段进行显示。遥感影像显示其实就是图像显示,和我们生活中常见的图像显示没原创 2014-10-21 22:09:52 · 10053 阅读 · 5 评论 -
DEM山体阴影原理以及算法详解
山体阴影原理以及算法详解 山体阴影基本原理:山体阴影是假想一个光源在某个方向和某个太阳高度的模拟下,用过临近像元的计算来生成一副0-255的灰度图。 一、山体阴影的主要参数:1、 太阳光线的入射角度:这个角度的量算起点是正北方向,按照顺时针的方向,角度的范围是0到360度,如下图所示,默认的角度是315度,西北方向,如下图所示:2、 太阳高度角:太阳高度角也简称太阳高度。是太阳光线和当地地平面原创 2014-10-12 13:19:50 · 12090 阅读 · 5 评论 -
基于GPU的高分一号影像正射校正的设计与实现
有一段时间没有写博客了,今天就将最近业余时间做的高分一号的正射纠正共享出来,和大家分享。一 RPC正射校正的原理影像正射校正的方法有很多,主要包含两大类:一类是严格的几何纠正模型,另一类是近似几何纠正模型。当遥感影像的成像模型和有关参数已知时,可以根据严格的成像模型来校正图像,这种方法属于严格几何纠正,最具代表的是共线方程法。当传感器成像模型未知或者无法获取相关的辅助参数时,可以用假定的数学模型模原创 2014-09-13 20:41:24 · 13850 阅读 · 10 评论 -
利用GDAL实现影像的几何校正
一、概述 遥感影像和地理坐标进行关联的方式一般有好几种,一种是直接给出了仿射变换系数,即6个参数,左上角地理坐标,纵横方向上的分辨率,以及旋转系数。在这种情况下,求出某一像素点的地理坐标非常容易,直接用公式可以求出,具体代码如下:void CPL_STDCALL GDALApplyGeoTransform(double *padfGeoTransform,原创 2014-06-01 14:40:55 · 25124 阅读 · 10 评论 -
基于OpenCL的数字地形分析之坡度坡向提取
基于OpenCL的数字地形分析之坡度坡向提取 又有一段时间没有发表博客了,可能最近工作有点忙。今天就把最近的学习和研究成果和大家分享一下。对于GIS稍微有点了解的人都知道地形分析中的坡度和坡向,这是数字地形分析中最基本的分析了,对于数字地形分析中很多计算都是邻域分析,所以非常适合数据并行。一、相关概念和公式 坡度严格地讲,是地表任意一点过该点的切平面与水平面之间的夹角。坡度表示了地表的原创 2014-04-13 01:41:24 · 7439 阅读 · 3 评论 -
GDAL影像投影转换
GDAL影像投影转换 又有一段时间没有写博客了,今天就把影像(DEM/遥感影像等)投影转换的经验和大家分享下。那么关于GDAL影像投影转换的文章在网上可以说是有很多,如果你还不清楚地图投影那么我建议你去看一看地图投影和坐标系统的基础知识,在这里就不详细讲解了。 一、影像投影转换的概念影像投影转换就是将一个地理坐标系统转换到另一个坐标系统,如果在同一个椭球基准面下的转换就是严密的转换,如果在同一个椭原创 2013-12-21 16:29:59 · 33585 阅读 · 10 评论 -
关于OGR开源库的一些思考
很久没有写博客了,今天趁着周末有时间,就将我使用OGR的一些做一些总结。 我想你如果正在看这篇文章的话,你应该知道OGR是干什么用的。说白了OGR就是读取各种矢量数据的一个开源的抽象库,其实OGR本身没有读取数据,最终读取基本上都是试用各种数据格式的原生API来实现的。例如,读取shapefile文件就是用到了shapelib这个库,这个库就是C语言的,非常简洁好用。大家都说这个GD原创 2013-11-30 16:37:14 · 6699 阅读 · 2 评论 -
并行计算在GIS矢量数据化简中的应用
在地理信息系统中,矢量数据化简有很广的用途,例如在webgis中减少数据传输量、在制图中对数据进行抽稀等。然而GIS中数据量一般都比较大,利用单核单线程计算可能会觉得速度比较慢,在本文中,将探索利用硬件来加速矢量数据化简的方法,主要包括多核计算和GPU计算。1基于OpenMP的改进算法的多核实现由于目前多核CPU的普及和降价,多核计算成为并行计算的一个重要研究方向。为了充分利用多核原创 2013-10-05 17:29:16 · 6812 阅读 · 2 评论 -
GIS矢量数据化简:一种改进的道格拉斯-普克算法以及C++实现
既然今天有时间,就多写几篇博文算了,也为了明天出去玩好好放松一下。 GIS领域的同志都知道,传统的道格拉斯-普克算法都是递归实现。然而有时候递归=的层次太深的话会出现栈溢出的情况。在此,介绍一种非递归的算法。 要将递归算法改为非递归算法,一般情况下分为两种场景。第一种是问题定义是递归的,如阶乘、斐波那契数列等,对于这类问题,改为递归算法很简单,直接用迭代来做。另外一原创 2013-10-05 16:46:59 · 9180 阅读 · 1 评论 -
四叉树空间索引原理及其实现
四叉树索引的基本思想是将地理空间递归划分为不同层次的树结构。它将已知范围的空间等分成四个相等的子空间,如此递归下去,直至树的层次达到一定深度或者满足某种要求后停止分割。四叉树的结构比较简单,并且当空间数据对象分布比较均匀时,具有比较高的空间数据插入和查询效率,因此四叉树是GIS中常用的空间索引之一。常规四叉树的结构如图所示,地理空间对象都存储在叶子节点上,中间节点以及根节点不存储地理空间对象。原创 2013-10-05 15:59:19 · 101493 阅读 · 35 评论 -
基于边界四边形的凸包生成
这篇博文是去年发出来的,由于某种原因删除了,现在重新挂出来和大家分享。代码的格式可能有点乱了。在地理信息系统(Geograghic Information System ,GIS) 应用中,原始数据经常是一些离散数据,比如雨量分布数据等,由于数据的采集、传输和录入的顺序不同,一般是一些散乱的数据记录,称其为散乱点集 。 凸包问题是计算几何中一个重要问题,在GIS中,动态计算面积、裁原创 2013-10-03 18:10:49 · 5156 阅读 · 1 评论 -
空间参考系统与WKT解析
空间参考系统与WKT解析1、为什么要空间参考系统?空间参考系统,也称为坐标系统。在GIS中为地理数据定位的基准,假设给你一个坐标(442281.875,4422651.589)。如果不给你空间参考系统,你可能根本不知道这个点在哪,是在欧洲还是在我们中国。这样就会给GIS应用带来困难。因此说没有空间参考的地理数据都是没有实际意义的。如果我告诉你他的空间参考系统是WGS84坐标系下的UTM50原创 2013-08-31 17:34:43 · 14046 阅读 · 6 评论 -
GIS中最小轴对齐外接矩形(MBR)
在GIS中,我们会经常碰到最小外包矩形,MBR。最小外包矩形就是包围图元,并且平行于X轴和Y轴的最小外界矩形。到底这个矩形有什么用,设想一下,一个几何体有很多顶点,我们要判断一个图形是否包含另一个图形,就要一个个点点判断,这样为大大延长处理的时间。那如果是针对矩形的判断将会见的很多。又比如在空间索引中,作为几何体图形的近似可以加快索引处理的时间。在空间查询中,例如要查找离我当前位置周围最近的几个餐原创 2013-06-03 21:42:51 · 7769 阅读 · 3 评论 -
GIS软件中的交互式绘图设计与实现
一、概述交互式绘图,我的理解就是用鼠标去进行图形绘制。在GIS软件开发与设计中,经常会用到交互式绘图,例如ARCGIS等软件都有非常复杂的人机交互功能。交互式绘图在GIS可以说占据比较重要的位置。二、图元的面向对象建模交互式绘图中,其实都可以将绘图的元素看做基本图元,如文字、点、线段、折线、多边形、椭圆、圆以及弧段等。为了对这些图元进行表达表达,可以用面向对象的思想来进行建模。首先原创 2013-08-13 19:59:40 · 6371 阅读 · 0 评论 -
浅谈设计模式在GIS中的应用
设计模式在GIS中的应用一、设计模式概述随着面向对象技术的广泛应用,软件复用在越来越多的开发工程中被采用。在研究软件复用的过程中,设计模式的概念被提了出来。所谓设计模式就是一些设计面向对象的软件的经验总结,它的出现可以说是面向对象理论发展的一个重要的里程碑。地理信息系统(GIS)是一种特定而又十分重要的空间信息系统,它是以采集、贮存、管理、处理分析和描述整个或部分地球表面(包括大气层在内)原创 2013-07-28 17:07:10 · 4110 阅读 · 2 评论 -
AGG绘图库编译方法
今天在同事的推荐下,下载了AGG的源代码进行编译,AGG在GIS系统中经常用到,比如mapguide,mapnik等用到了AGG。现在很多导航公司也使用AGG作为地图绘制的引擎。这个引擎绘制出来的效果非常好,据说还可以反锯齿。抱着好奇的心态就试了一下。 1、下载源码,去http://www.antigrain.com/download/index.html就可以下载源码包。2、在V原创 2013-07-16 19:27:11 · 5925 阅读 · 0 评论 -
地图比例尺的计算
地图上的线段长度与实地相应线段长度之比即为比例尺。它表示地图图形的缩小程度,如1∶10万,即图上1厘米长度相当于实地100000厘米(即1000米)。严格讲,只有在表示小范围的大比例尺地图上,由于不考虑地球的曲率,全图比例尺才是一致的。通常绘注在地图上的比例尺称为主比例尺。在地图上,只有某些线或点符合主比例尺。比例尺与地图内容的详细程度和精度有关。一般讲,大比例尺地图,内容详细,几何精度高,可用于转载 2013-01-06 10:32:21 · 11145 阅读 · 0 评论 -
GIS属性数据高效显示
对于GIS软件来说,属性数据的显示是一个比较重要的问题,在基于VC++的GIS底层开发中,一般用ClistCtrl或者DBGrid来显示属性数据。然而这些控件显示效率比较低或者效率高的话比较难操作。通过最近的探索,找到了一个比较好的网格控件来显示属性数据。CGridCtrl这个控件是一个源代码公开的控件,你可以自己修改源代码。控件的特点:●使用鼠标可以进行单元格的选择,还可以辅助c原创 2013-01-03 16:59:45 · 7094 阅读 · 1 评论 -
C++ 编写和调用webservice解决方案
最近,要在毕业论文的c++代码中调用OGC的服务,所以就上网查了一下,主要有以下几种方案: 1、使用gSOAP,跨平台,gSOAP是一个开源的项目,用它可以方便的使用c/c++地进行SOAP客户端和服务器端编程,而不必了解xml和SOAP协议的细节2、mssoap3.0,微软的产品3、atl server 一个ATL的库,目前已经开源4、GIS领域可以使用FDO调用OGC服原创 2012-12-28 10:43:21 · 6485 阅读 · 0 评论 -
GIS算法的一点理解
在GIS这个专业也混了好几年了,但是始终没有对GIS算法有过真正的研究,可以说大部分不懂。 目前关于GIS算法的书籍不是特别多,数来数去也就那么几本,南师大几个老师编写的地理信息系统算法基础,矿大吴立新老师编写的地理信息系统原理与算法,翻译外国的GIS数据结构与算法基础(这本书还是比较贵,才100多页就要40多,就是不知道质量怎么样),不过还有一部分外国的教材,这里就不一一列举原创 2012-11-12 22:01:39 · 16030 阅读 · 7 评论 -
GIS开发人员需要掌握的知识和技能
对于GIS行业,可能很多人不是很了解,对我来说也不是很了解,在此呢,我就我自己的看法发表一下简单的看法,有什么不同的意见可以一起交流。GIS虽说是属于地理科学或者说测绘科学与技术的范畴,但是很大一部分和计算机、数学有很大的联系。对于一个合格的GIS开发人员,可能需要掌握的东西太多了,压在我们身上的担子太重了,下面就不同方面的开发人员所需掌握的技能做一个简单介绍:一、从开发的层次上来分原创 2012-11-03 19:57:37 · 26257 阅读 · 4 评论 -
Oracle Spatial研究
Oracle Spatial是Oracle公司推出的空间数据库组件,通过Oracle数据库系统存储和管理空间数据。 Oracle从9i开始对空间数据提供了较为完备的支持。由于Oracle Spatial本身是ORACLE数据库的一个特殊的部分,因此可以用ORACLE提供的程序接口来对Oracle Spatial管理的空间数据进行操作。目前,ORACLE数据库主要提供两种接口方式对其数据进行存取原创 2012-09-21 08:27:23 · 12509 阅读 · 1 评论 -
GIS中点状地图符号-圆的绘制
在我们的GIS开发中,为了更好地表达和展现空间数据,经常要进行符号的绘制,圆在地图上常常作为定位分级符号,其圆心定位在要素的中心位置,圆的面积表示相应的数量指标。 在计算机中,圆是由多边形逼近的,当多边形的边数多到人眼不能分辨的地步时,就显示成了圆形。然而,变数过多的话,可能会影响绘制的效果,边数过少就不像圆。所以一般的做法是考虑多边形上相邻三点构成的三角形看上去是否是一条直线。具体原创 2012-09-15 11:48:19 · 7471 阅读 · 0 评论 -
R树空间索引
R树在数据库等领域做出的功绩是非常显著的。它很好的解决了在高维空间搜索等问题。举个R树在现实领域中能够解决的例子吧:查找20英里以内所有的餐厅。如果没有R树你会怎么解决?一般情况下我们会把餐厅的坐标(x,y)分为两个字段存放在数据库中,一个字段记录经度,另一个字段记录纬度。这样的话我们就需要遍历所有的餐厅获取其位置信息,然后计算是否满足要求。如果一个地区有100家餐厅的话,我们就要进行100次位置转载 2012-08-23 09:06:18 · 49443 阅读 · 23 评论 -
VC++图形平移功能的实现
在GIS开发中,我们会经常碰到地图平移的操作,那么这个操作在具体的编程实践中怎么去实现? 其实地图平移只需要改变两个绘图参数就可以了,也就是左下角原点的坐标,地图的比例尺不变。具体的代码如下: CDC *pDC = GetDC(); CGISServerDoc* pDoc = GetDocument(); OGRPoint pt1 = pDoc->m_mapWnd.Sc原创 2012-06-24 15:43:44 · 6574 阅读 · 15 评论 -
VC鼠标拖动动态画矩形框
要实现的功能实际上很简单,一般人都用到见惯不惯了,但是实现起来还是有点意思的。问题详细描述:(三步)单击鼠标左键时记录下单击点;鼠标拖动时,显示的矩形框能够动态的跟随显示;释放鼠标左键时擦出矩形框。这样分析其实问题就简单一些了,只需要对鼠标的三个事件进行相应就可以了。代码主要在三处地方修改了:第一处:VIEW类中设置私有变量(VIEW类.h文件中)private:转载 2012-06-23 15:48:18 · 20531 阅读 · 13 评论 -
地理坐标与屏幕坐标转换(VC++)
在底层GIS开发中,我们经常会碰到空间数据可视化问题,当我们拿到地理数据之后,我们该怎么把它展现在我们的计算机屏幕中呢,这或许是一个比较简单的问题。我们知道,地理坐标系是我们用户自定义的坐标系,而现实在计算机屏幕上的坐标是基于屏幕坐标来绘制的,那么改如何转化呢?首先,我们来熟悉几个概念:地理坐标系,通常原点在左下角,X轴的方向是向右递增,Y轴的方向是向上递增。屏幕坐标系,通常它的原原创 2012-06-06 19:43:28 · 10278 阅读 · 10 评论 -
OCCI上载空间数据
众所周知,数据是GIS的血液,一个GIS系统最重要的是数据,而且在整个系统的建设过程中的花费也比较大。为此,许多GIS厂商和数据库厂商逐渐推出空间数据的存储解决方案。其中Oracle Spatial是目前最大的数据库厂商Oracle公司推出的新一代空间数据库,它采用对象关系型数据存储模式来存储空间数据。空间数据在Oracle中是以SDO_GEOMETRY数据类型来存储的,它的定义为:原创 2012-05-31 14:36:41 · 2046 阅读 · 0 评论 -
点与多边形关系(改进射线法)
在GIS软件开发中,经常要用到一些几何的算法,比如三角网构建,多边形的剖分,点,线,面之间的关系。而点与多边形关系的判断是一项非常重要的基础工作。在点与多边形关系的判断中,经常用到的方法是射线法和夹角和方法,其中射线法能够针对带岛的多边形进行判断,而夹角和方法就显得无能为力。射线法的基本思想是:从待判断的点向某一个方向引射线,计算和多边形交点的个数,如果个数是偶数或者0则点在多边形外,如果原创 2012-05-10 09:02:16 · 12784 阅读 · 9 评论 -
GIS坐标转换及其编程实现
最近,在做这个坐标转换的东西,涉及到大地测量学等很深奥的东西,在这里我就不讲解那些难懂的理论了,在此,我将会把代码贴出来和大家分享,其实要编写出这个代码,还真得把大地测量相关的知识弄熟,否则是无法理解代码的。好了废话少说。源代码/** * 空间大地直角坐标->大地坐标 */ public GeoPoint XYZ_BLH(int ellipse, Poi原创 2011-08-19 10:40:19 · 6372 阅读 · 0 评论 -
GIS中要素的捕捉以及C++实现
要素的选择,也称为要素的捕捉,在CAD、计算机图形学和地理信息系统中占据着相当重要的作用。比如,用户要根据鼠标在屏幕上的点击判断出选择的是哪一个点、线和面,这是经常碰到的操作。这种操作可以很方便的进行要素的一些属性信息查看,要素的操作等等。下面就分别说一些针对点、线和面的不同形状要素的选取。点:点的捕捉就是计算点与点之间的距离,为了加快搜索速度,可以设置一个以当前的点为中心,一个合适的距离原创 2013-08-14 15:06:35 · 4499 阅读 · 0 评论 -
常见凸多边形判断方法
凸多边形的判定方法在计算几何和地理信息系统中,多边形的凹凸性判定十分重要。那么什么是凹多边形和凸多边形呢?首先,我们从直观上来理解,凸多边形就是多边形任意两个顶点的连线在多边形内,那么凹多边形就是至少能找出一条线在多边形外。 一些基础概念顶点、向量、向量叉乘、一般来说,多边形是由首尾相连的顶点组成的。这里的顶点就是几何中的点。向量,在2D以及3D几何中,点和向量可以用一个类或者原创 2013-08-21 21:15:33 · 29099 阅读 · 0 评论