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 修改label中文字的行间距
UILabel *label = [[UILabel alloc] init]; label.font = [UIFont systemFontOfSize:]; label.textColor = ...
- CentOS 6.4安装配置LAMP服务器(Apache+PHP5+MySQL)
这篇文章主要介绍了CentOS 6.4安装配置LAMP服务器(Apache+PHP5+MySQL)的方法,需要的朋友可以参考下 文章写的不错,很详细:IDO转载自网络: 准备篇: 1.配置防火墙,开启 ...
- 如何使用GOOGLE高级搜索技巧
如何使用GOOGLE高级搜索技巧 一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发 ...
- Tesseract-OCR 字符识别---样本训练 [转]
Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格式的图像文件并将其转换成文本,目前已支持60多种语言(包括中文). ...
- Java解决题目:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子。。。
题目:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子,假如兔子都不死,问M个月时兔子的数量,M为键盘读入的正整数.(请用Java语言作答) 样例输入: 3 样 ...
- 【原】基于 HAproxy 1.6.3 Keeplived 在 Centos 7 中实现mysql mariadb galera cluster 集群分发读写 —— 上篇
前言 有一段时间没有写blogs,乘着周末开始整理下haproxy + keeplived 实现 mysql mariadb galera cluster 集群访问环境的搭建工作. 本文集中讲hapr ...
- 虚拟机Linux----Ubuntu1204----root登录设置
说明:装好的ubuntu12.04登录时,默认是看不到root用户的,需要设置一下. 1.先用普通用户登录,打开终端,切换为root用户,如下: su root 2.修改 sudo gedit /et ...
- Python HeapSort
__author__ = 'student' print 'hello world hello python' ''' heap sort root leftchild 2n+1 rightchild ...
- Hadoop Resource
http://www.aiopass4sure.com/cloudera-exams/ccd-410-exam-questions/which-process-describes-the-lifecy ...
- TFS 2015 Update 2功能探索
微软刚刚发布了TFS 2015 update 2的测试包,https://blogs.msdn.microsoft.com/bharry/2016/02/10/team-foundation-serv ...