要学习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结合使用的更多相关文章

  1. GEOS库学习之四:几何关系判断

    原理上一篇已经介绍过了,这篇就直接进行程序练习 #include "geos.h" GeometryFactory factory; //创建一条环线,与线的区别就是环线是闭合的. ...

  2. GEOS库学习之三:空间关系、DE-9IM和谓词

    要判断两个多边形的关系,实际上属于几何图形空间关系判断.几何图形并不只有多边形一种,它包括点.线.面构成的任何图形,两两之间相互关系也有很多种,因此空间关系非常复杂.根据前人的研究,总结出了DE-9I ...

  3. GEOS库的学习之一:介绍和编译

    对GEOS库的学习,源于一个项目:要在c++中判断二维平面中两个多边形的关系(无论凹凸).也就是判断两个多边形是否相交.相容等.听起来很简单,可实现起来却比较难,而项目又催得紧.于是我去搜索了一下,看 ...

  4. GEOS库 介绍 (转)

    http://wiki.woodpecker.org.cn/moin/lilin/geos-introduce 介绍 GEOS是一个集合形状的拓扑关系操作实用库(可能这么说不太准确),简单得说,就是判 ...

  5. day 83 Vue学习之五DIY脚手架、webpack使用、vue-cli的使用、element-ui

      Vue学习之五DIY脚手架.webpack使用.vue-cli的使用.element-ui   本节目录 一 vue获取原生DOM的方式 二 DIY脚手架 三 vue-cli脚手架的使用 四 we ...

  6. 使用VS2010编译64的Geos库

    Geos库在cmake中总是报错,所以我决定试试nmake编译64位的库.现将编译过程记录如下: 1.下载Geos,我下的是最新版3.5.0,地址在 http://trac.osgeo.org/geo ...

  7. python 操作exls学习之路1-openpyxl库学习

    这篇要讲到的就是如何利用Python与openpyxl结合来处理xlsx表格数据.Python处理表格的库有很多,这里的openpyxl就是其中之一,但是它是处理excel2007/2010的格式,也 ...

  8. GEOS库在windows中的编译和测试(vs2012)

    版本:vs2012, geos3.5 一.下载和编译 这类的文章比较,不再具体细说,可以参考 http://blog.csdn.net/wangqinghao/article/details/8201 ...

  9. dlib库学习之一

    dlib库学习之一 1.介绍 跨平台 C++ 通用库 Dlib 发布 ,带来了一些新特性,包括概率 CKY 解析器,使用批量同步并行计算模型来创建应用的工具,新增两个聚合算法:中国低语 (Chines ...

随机推荐

  1. 深入理解java虚拟机(1)------内存区域与内存溢出

    在C++领域,关于C++的内存存储,结构等等,有一本书:深度探索C++对象模型,讲解的非常透彻. 而Java确把这一工作交给了虚拟机来处理. 我们首先来看看关于内存的问题. 1.问题: 1)java ...

  2. navicat 连接sqlserver提示要安装 sql server native client

    navicat 连接sqlserver提示要安装 sql server native client 解决方法:其实navicat自带sqlncli_x64.msi,就在安装目录下,安装后问题解决!

  3. IE8下解决position:flxed无效的问题

    只需将文档类型声明改成如下方式即可 <!DOCTYPE html>

  4. C语言流程控制

    顺序结构 顺序结构是最常用的结构,即从上到下的执行语句. int num=5; num++; num=13; 条件结构 条件结构是当表达式为真的时候执行语句块,C语言提供了两种条件结构 if...el ...

  5. 简单谈谈RAID

    RAID是“Redundant Array of Independent Disk”的缩写,翻译过来叫做独立磁盘的冗余阵列,其实就是磁盘的存储.访问.备份技术.在谈RAID之前,先简单学习一下存储器的 ...

  6. Docker tips

    1.将Docker daemon的监听端口写入配置文件 配置文件: /etc/default/docker (CentOS: /etc/sysconfig/docker) 写入:DOCKER_OPTS ...

  7. 基于go-ceph创建CEPH块设备及快照

    一.代码执行前准备 1.系统中安装了CEPH集群 2.GOPATH目录下存在src/github.com/noahdesu/go-ceph代码库 3.在ubuntu 14.04下还需apt-get l ...

  8. 递归:codevs 1251 括号

    codevs 1251 括号  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 计算乘法时,我们可以添加括号,来改变相乘的顺 ...

  9. UVA 12266 Stock prices --优先队列

    优先队列. 做法:维护两个优先队列:quesell  和  quebuy, 一个是小值优先,一个是大值优先.每次push的时候,都取各自的Top元素,比较价格,如果卖的比卖的出价低,则成交,各自的要买 ...

  10. 用Access作为后台数据库支撑,书写一个用C#写入记录的案例

    具体的步骤: 1.创建并打开一个OleDbConnection对象 2.创建插入的SQL语句 3.创建一个OleDbCommand对象 4.使用OleDbCommand对象来插入数据 5.关闭OleD ...