GEOS库学习之五:与GDAL/OGR结合使用
要学习GEOS库,肯定绕不开地理方面的东西。如果需要判断的两个多边形或几何图形,不是自己创建的,而是来自shapefile文件,那就得将GEOS库和GDAL/OGR库结合使用了。实际上只需要OGR就行了,但OGR和GDAL是放在一起的。OGR库用来读取和输出shapefile(shp)文件,geos库用来判断空间关系。
需要注意的地方:OGR里面的几何图形类OGRGeometry和GOES里面的类Geometry基本上是一样的,函数也大体相同。OGRGeometry类里面也有类似于Disjoint(),Touches(),Overlaps()这样的函数。但是这些函数是花架子,没有GEOS库的支持是用不成的。如果只有OGR库而没有GEOS库,运行这些函数就会提示GEOS support not enabled.这样的错误,也得不到正确的结果。
在OGR的官方文档中,对Overlaps()函数有这样一句话描述:This method is built on the GEOS library, check it for the definition of the geometry operation. If OGR is built without the GEOS library, this method will always fail, issuing a CPLE_NotSupported error.
大致意思就是这个函数是建立在GEOS库的基础上,没有GEOS库的支持,这个函数运行会出错。
1、编译GEOS。参考http://www.cnblogs.com/denny402/p/4966558.html
2、编译GDAL. 参考http://www.cnblogs.com/sansan/p/3394636.html,注意要先编译GEOS,再编译GDAL,不然会提示找不到geos_c_i.lib这个库。
编译并设置好后,就可以开始代码测试了。
本例的数据及工具版本:
GDAL/OGR: 2.0.0
GEOS: 3.5.0
shp文件:中国国界和省界SHP文件 ,可点此下载
至于SHP文件的读取,可参考 http://www.cnblogs.com/denny402/p/4959867.html
测试代码:
#include "stdafx.h"
#include <iostream>
#include "ogrsf_frmts.h"
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{
GDALAllRegister();
GDALDataset *poDS;
CPLSetConfigOption("SHAPE_ENCODING",""); //解决中文乱码问题
//读取shp文件
poDS = (GDALDataset*) GDALOpenEx("d:/shp/province.shp", GDAL_OF_VECTOR, NULL, NULL, NULL ); if( poDS == NULL )
{
printf( "Open failed.\n%s" );
exit( );
} OGRLayer *poLayer;
poLayer = poDS->GetLayer(); //读取层
poLayer->ResetReading();
OGRFeature *poFeature1,*poFeature2,*poFeature3;
poFeature1=poLayer->GetFeature(); //四川省
poFeature2=poLayer->GetFeature(); //黑龙江省
poFeature3=poLayer->GetFeature(); //青海省
OGRGeometry *p1=poFeature1->GetGeometryRef();
OGRGeometry *p3=poFeature2->GetGeometryRef();
OGRGeometry *p2=poFeature3->GetGeometryRef();
cout<<p1->IsEmpty()<<endl //图形是否为空
<<p1->IsSimple()<<endl //是否是单个几何图形
<<p1->getGeometryType()<<endl //几何图形的类型,polygon返回3
<<p1->getGeometryName()<<endl //几何图形的名称
<<p1->getDimension()<<endl //图形的维度
<<p1->getCoordinateDimension()<<endl //坐标的维度
<<p1->getSpatialReference()<<endl; //空间参考
if(p2->Disjoint(p1))
cout<<"不相交"<<endl;
else
{
if(p2->Touches(p1))
cout<<"接触"<<endl;
else if(p2->Overlaps(p1))
cout<<"部分重叠"<<endl;
else if(p2->Contains(p1))
cout<<"包含"<<endl;
else
cout<<"unknown"<<endl;
} system("pause");
return ;
}
测试结果:四川省和青海省接触
GEOS库学习之五:与GDAL/OGR结合使用的更多相关文章
- GEOS库学习之四:几何关系判断
原理上一篇已经介绍过了,这篇就直接进行程序练习 #include "geos.h" GeometryFactory factory; //创建一条环线,与线的区别就是环线是闭合的. ...
- GEOS库学习之三:空间关系、DE-9IM和谓词
要判断两个多边形的关系,实际上属于几何图形空间关系判断.几何图形并不只有多边形一种,它包括点.线.面构成的任何图形,两两之间相互关系也有很多种,因此空间关系非常复杂.根据前人的研究,总结出了DE-9I ...
- GEOS库的学习之一:介绍和编译
对GEOS库的学习,源于一个项目:要在c++中判断二维平面中两个多边形的关系(无论凹凸).也就是判断两个多边形是否相交.相容等.听起来很简单,可实现起来却比较难,而项目又催得紧.于是我去搜索了一下,看 ...
- GEOS库 介绍 (转)
http://wiki.woodpecker.org.cn/moin/lilin/geos-introduce 介绍 GEOS是一个集合形状的拓扑关系操作实用库(可能这么说不太准确),简单得说,就是判 ...
- day 83 Vue学习之五DIY脚手架、webpack使用、vue-cli的使用、element-ui
Vue学习之五DIY脚手架.webpack使用.vue-cli的使用.element-ui 本节目录 一 vue获取原生DOM的方式 二 DIY脚手架 三 vue-cli脚手架的使用 四 we ...
- 使用VS2010编译64的Geos库
Geos库在cmake中总是报错,所以我决定试试nmake编译64位的库.现将编译过程记录如下: 1.下载Geos,我下的是最新版3.5.0,地址在 http://trac.osgeo.org/geo ...
- python 操作exls学习之路1-openpyxl库学习
这篇要讲到的就是如何利用Python与openpyxl结合来处理xlsx表格数据.Python处理表格的库有很多,这里的openpyxl就是其中之一,但是它是处理excel2007/2010的格式,也 ...
- GEOS库在windows中的编译和测试(vs2012)
版本:vs2012, geos3.5 一.下载和编译 这类的文章比较,不再具体细说,可以参考 http://blog.csdn.net/wangqinghao/article/details/8201 ...
- dlib库学习之一
dlib库学习之一 1.介绍 跨平台 C++ 通用库 Dlib 发布 ,带来了一些新特性,包括概率 CKY 解析器,使用批量同步并行计算模型来创建应用的工具,新增两个聚合算法:中国低语 (Chines ...
随机推荐
- iOS开发之NSTimer使用初探
创建一个定时器(NSTimer) - (void)viewDidLoad { [super viewDidLoad]; [NSTimer scheduledTimerWithTimeInterval: ...
- C语言-11-可变参数的实现方案
概述 某种情况下,我们可能需要一个具有可变参数的函数,C语言提供了一种标准的实现可变参数的方法 C语言实现可变参数的方案是基于标准库的 可变参数的类型 可变参数可以放在一个集合中,可以使用指针类型的参 ...
- Jmeter调试工具---Debug Sampler
一.Debug Sampler介绍: 使用Jmeter开发脚本时,难免需要调试,这时可以使用Jmeter的Debug Sampler,它有三个选项:JMeter properties,JMeter v ...
- js日期时间函数
日期时间脚本库方法列表 Date.prototype.isLeapYear 判断闰年Date.prototype.Format 日期格式化Date.prototype.DateAdd 日期计算Date ...
- 使用Httpclient来替代客户端的jsonp跨域解决方案
最近接手一个项目,新项目需要调用老项目的接口,但是老项目和新项目不再同一个域名下,所以必须进行跨域调用了,但是老项目又不能进行任何修改,所以jsonp也无法解决了,于是想到了使用了Httpclient ...
- 超链接的那些事(三): 属性target
a标签的属性之一 target 1. 定义 规定在何处打开链接文档. 如果a标签中有target属性,浏览器将会载入和显示用这个标签的 href 属性命名的.名称与这个目标吻合的框架或者窗口中 ...
- 第一次配置Android环境
配置Android环境,相信很多人都做过,而且网上的资料也一大堆,我就来分享一下我配置Android的心得吧! 第一步:下载好需要的文件:Android SDK.JDK.Eclipse.ADT ps: ...
- 关于字符编码:为什么在ASCII字符集中小写字母比大写字母大32
今天看字符编码,在ASCII一节,字母'A'用ASCII编码是十进制的65,自然想到了'a'应该和'A'差个26吧,却发现'a'是十进制的97,差了32.突然很想知道为什么. 查了ASCII码表,发现 ...
- Java向上转型与向下转型
一.向上转型 例如:Parent p=new Son(); 这样引用p只能调用子类中重载父类的方法:但属性是父类的:如果想调用子类属性的话,可以用getter()方法. 二.向下转型 子类对象的父类引 ...
- JS的构造及其事件注意点总结
一:js的组成 ECMAscript bom dom 类型包括: number boolean string undefined object function 二:基本函数作用 parseInt ...