Gdal库计算形心方法。

在Gdal库中计算形心的方法如下:

int OGRGeometry::Centroid( OGRPoint *poPoint ) const

其函数实现中,是调用的Geos库中的GEOSGetCentroid()方法,最终在Geos的bool

Geometry::getCentroid(Coordinate& ret) const函数中创建了CentroidArea对象,并将几何对象添加进去,获取到其形心。代码如下:

CentroidArea cent;

cent.add(this);

if ( ! cent.getCentroid(c) )

return false;

可见,关键就是这个类CentroidArea。

返回的形心坐标结果:

ret = Coordinate(cg3.x/3.0/areasum2, cg3.y/3.0/areasum2);

计算流程:

此类的方法add添加几何对象,最终会执行如下步骤(略去内环考虑):

void

CentroidArea::addShell(const CoordinateSequence *pts)

{

bool isPositiveArea=!CGAlgorithms::isCCW(pts);

std::size_t const n=pts->getSize()-1;

for(std::size_t i=0; i<n; ++i)

{

addTriangle(basePt, pts->getAt(i), pts->getAt(i+1), isPositiveArea);

}

addLinearSegments(*pts);

}

函数中的basePt被初始化为环的第一个点。

如代码所述,依次将每一个点加进类中,调用私有方法addTriangle ,其代码如下:

CentroidArea::addTriangle(const Coordinate &p0, const Coordinate &p1,

const Coordinate &p2, bool isPositiveArea)

{

double sign=(isPositiveArea)?1.0:-1.0;

centroid3(p0,p1,p2,triangleCent3);

double area2res=area2(p0,p1,p2);

cg3.x+=sign*area2res*triangleCent3.x;

cg3.y+=sign*area2res*triangleCent3.y;

areasum2+=sign*area2res;

}

成员属性cg3和areasum2得到了值。

其中area2res和triangleCent3计算如下:

double CentroidArea::area2(const Coordinate &p1, const Coordinate &p2, const Coordinate &p3)

{

return (p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y);

}

计算的是面积的2倍。

void CentroidArea::centroid3(const Coordinate &p1, const Coordinate &p2,

const Coordinate &p3, Coordinate &c)

{

c.x=p1.x+p2.x+p3.x;

c.y=p1.y+p2.y+p3.y;

}

c的xy除以3的话就是p1,p2,p3的均值了。

还有其他分支,似是一些备选,这里略过了。

所以是相当遍历所有点,将环的0点和当前点及当前点的下一个点构成一个三角形,进行累计计算。对于每一步:

wiki上的多边形形心计算公式:

一个由N个顶点xi , yi确定的不自交闭多边形的中心能如下计算: [4]

记号 xN , yN与顶点 x0 , y0相同。多边形的面积为:

多边形的中心由下式给出:

以面积中心来求:

面积中心和质量中心非常类似,面积中心只取决于图形的几何形状。如果物体是均匀的,质量中心将位于面积中心

对于两部分组成的图形,将有如下等式:

是特定部分的面积中心到所选参考系的距离。是特定部分的面积。

当一个复杂几何图形可以分成一些已知的简单几何图形时,先计算各部分的面积中心,然后通过下面一般的公式计算整个图形的面积中心:

这里从y-轴到中心的距离是,从x-轴到中心的距离是,中心的坐标是

http://zh.wikipedia.org/wiki/%E5%87%A0%E4%BD%95%E4%B8%AD%E5%BF%83

时间: 2024-10-04 16:05:41

Gdal库计算形心方法。的相关文章

基于GDAL库,读取.grd文件(以海洋地形数据为例)C++版

技术背景 海洋地形数据主要是通过美国全球地形起伏数据(GMT)获得,数据格式为grd(GSBG)二进制数据,打开软件通过是Surfer软件,surfer软件可进行数据的编辑处理,以及进一步的可视化表达等功能操作:由于Surfer软件不支持二次开发,没有提供相应的SDK供开发者进行使用,所以这一切只能通过相应类似的技术进行实现,首先,数据的读取,如何通过编程实现数据的读取操作呢?这里就要说一下GIS软件所使用的一个开源库-GDAL,GDAL库的具体解释资料,请查阅官方网站[https://www.

Linux下非root权限安装与使用GDAL库的方法

学习GDAL的话推荐两个网站. GDAL的官方文档:www.gdal.org 李民录老师的博客:http://blog.csdn.net/liminlu0314/article/category/777646 下面进入正题. 笔者的系统为RHEL4. 建议Linux的使用者习惯非root权限的操作,这是一个好习惯,在工作中会很有帮助. 首先安装GDAL依赖库PROJ.4和GEOS. PROJ.4是提供投影坐标系相关操作的库,GEOS是提供空间分析计算相关的库.都是开源的项目,可以自行Google

GDAL库——读取图像并提取基本信息

GDAL库是一个跨平台的栅格地理数据格式库,包括读取.写入.转换.处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持).它使用了一个单一的抽象数据模型就支持了大多数的栅格数据.这里有GDAL库支持的格式:http://www.gdal.org/formats_list.html 注:本文在Qt开发环境下使用GDAL库. 在Qt中使用GDAL库时,除了要加gdal_priv.h头文件外,还需要在xxx.pro文件内加上LIBS += -lgdal ,文件用可编辑的文档打开. 使用GDAL

GDAL库学习笔记(1):无缝拼接Google卫星图

开工之前要先了解一下瓦片地图,瓦片地图金字塔模型是一种多分辨率层次模型,从瓦片金字塔的底层到顶层,分辨率越来越低,但表示的地理范围不变.实现原理就是,首先确定地图服务平台所要提供的缩放级别的数量N,把缩放级别最低.地图比例尺最大的地图图片作为金字塔的底层,即第0层,并对其进行分块,从地图图片的左上角开始,从左至右.从上到下进行切割,分割成相同大小(比如256x256像素)的正方形地图瓦片,形成第0层瓦片矩阵;在第O层地图图片的基础上,按每2x2像素合成为一个像素的方法生成第1层地图图片,并对其进

改动GDAL库支持RPC像方改正模型

近期在做基于RPC的像方改正模型.方便对数据进行測试,改动了GDAL库中的RPC纠正模型,使之能够支持RPC像方改正參数. 以下是RPC模型的公式,rn,cn为归一化之后的图像行列号坐标,PLH为归一化后的经度纬度高程. 将上面的公式变形,使用偏移系数和缩放系数带入,能够得到图像的行列号坐标与经纬度坐标之间的坐标转换关系.整理后的公式例如以下所看到的.下标带s的为缩放系数,下标为0的表示偏移系数,rc为图像行列号,此处的PLH为地面经纬度坐标.P1-P4为有理函数的多项式系数. 使用像方改正模型

修改GDAL库支持RPC像方改正模型

最近在做基于RPC的像方改正模型,方便对数据进行测试,修改了GDAL库中的RPC纠正模型,使之可以支持RPC像方改正参数. 下面是RPC模型的公式,rn,cn为归一化之后的图像行列号坐标,PLH为归一化后的经度纬度高程. 将上面的公式变形,使用偏移系数和缩放系数带入,可以得到图像的行列号坐标与经纬度坐标之间的坐标转换关系.整理后的公式如下所示,下标带s的为缩放系数,下标为0的表示偏移系数,rc为图像行列号,此处的PLH为地面经纬度坐标,P1-P4为有理函数的多项式系数. 使用像方改正模型的公式如

关于基于GDAL库QT软件平台下C++语言开发使用说明

背景前提 地理空间数据抽象库(GDAL)是一个用于读取和编写栅格和矢量地理空间数据格式的计算机软件库,由开源地理空间基金会在许可的X / MIT风格免费软件许可下发布. 作为一个库,它为调用应用程序提供了一个抽象数据模型,用于所有支持的格式. 它还可以构建有各种有用的命令行接口实用程序,用于数据转换和处理. PROJ.4库支持投影和转换.(摘自维基百科) 相关的OGR库(OGR Simple Features Library [2])是GDAL源代码树的一部分,它为简单的特征矢量图形数据提供了类

lib库dll库的使用方法与关系

一.lib库 lib库有两种:一种是静态lib(static Lib),也就是最常见的lib库,在编译时直接将代码加入程序当中.静态lib中,一个lib文件实际上是任意个obj文件的集合,obj文件是cpp文件编译生成的. 另一种lib包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供.也就是平时编写dll时附带产生的lib,其中Lib只是Dll的附带品,是DLL导出的函数列表文件而已. 共同点:两者都是二进制文件,都是在链接时调用,使用stati

gdal库的学习和使用

1.windows下的编译 1.1.解压后打开nmake.opt,设置GDAL_HOME 1.2.进入vs的command promot,进入正常的那个即可,64位的没试过,可以参考gdal官网 1.3.nmake /f makefile.vc 1.4.nmake /f makefile.vc install 1.5.nmake /f makefile.vc devinstall 2.打开文件 #include "gdal_priv.h" #include "cpl_conv