• GEOS介绍和安装
    时间:2014-05-14   作者:寒江孤舟   出处:douban.com

    GEOS是“Geometry Engine, Open Source”的含义,提供了OGC规范中简单几何要素对象操作的C++语言的实现。在地理信息系统领域,拓扑模型是重要的,其计算方法简单但是难得以实现。使得GEOS不同于其他项目的也正是“空间谓词”与“空间操作”。空间谓词是比较两个空间对象并返回一个布尔变量值作为结果,它表明了存在于两个空间对象之间特殊的关系。比如典型的空间谓词有Contains(), Intersects(), Touches(), and Crosses()函数等。GEOS项目中对该些函数的实现是异常强壮的,即使是奇异几何对象或是临时的坐标系统运算也不能使其运算不正常或计算错误。目前绝大多数的商业软件仍然在最基础的空间谓词处理上相对成熟,这正是GEOS项目的重要意义。“空间操作”则主要是对两个几何对象进行计算并且返回一个新的几何实体。比较典型的操作函数如Difference(), Union()以及Buffer()等。GEOS中的操作算法已经被广泛的经过了测试。GEOS类库被各类开源空间信息软件项目广泛应用,使用GEOS,它们可以基于最新的规范的几何实体来完成,同时也拥有了复杂空间方法的实现。

    介绍

    GEOS是一个集合形状的拓扑关系操作实用库(可能这么说不太准确),简单得说,就是判断两个几何形状之间关系和对两个几何形状进行操作以形成新的几何形状的库。其实学geos的好地方不是在GEOS的主站。而是在另一个地方,JTS Topology Suite (JTS)
    事实上,GEOS是仿照JTS做的。它其实是JTS的C++实现。

    这里有几份文档,一份是开发者指南,一份是JTS技术说明书

    GEOS主要支持几种操作和计算:

    空间关系计算,主要支持几种计算

    相等(Equals): 几何形状拓扑上相等。
    脱节(Disjoint): 几何形状没有共有的点。
    相交(Intersects): 几何形状至少有一个共有点(区别于脱节)
    接触(Touches): 几何形状有至少一个公共的边界点,但是没有内部点。
    交叉(Crosses): 几何形状共享一些但不是所有的内部点。
    内含(Within): 几何形状A的线都在几何形状B内部。
    包含(Contains): 几何形状B的线都在几何形状A内部(区别于内含)
    重叠(Overlaps): 几何形状共享一部分但不是所有的公共点,而且相交处有他们自己相同的区域。

    一些情况下,确切定义有些微妙。你可以参考JTS技术说明书来完全确定在任何情况下的返回情况。

    以上的运算返回的都是true或者false。

    另外一种是空间叠加分析操作。主要有下面几个操作:

    缓冲区分析(Buffer): 包含所有的点在一个指定距离内的多边形和多多边形。
    凸壳分析(ConvexHull): 包含几何形体的所有点的最小凸壳多边形,(就是外包多边形啦)
    交叉分析(Intersection): 交叉操作就是多边形AB中所有共同点的集合。
    联合分析(Union): AB的联合操作就是AB所有点的集合。
    差异分析(Difference): AB形状的差异分析就是A里有B里没有的所有点的集合。

    对称差异分析(SymDifference): AB形状的对称差异分析就是位于A中或者B中但不同时在AB中的所有点的集合

    另外还支持多边形化,连接有向线段,压出节点等等操作。

    geos for python的安装

    windows下的安装

    纯粹的GEOS安装

    纯粹的GEOS在windows下的安装挺复杂,因为geos本来是为unix类系统写得.作者好像在windows下花的时间不是很多.所以代码很多在windows下都会出错.不过我还是把它安装上了.

    下载geos的geos-2.1.4版(更高的版本我没有试过)解压,假设解压路径下面都表示为$GEOSHOME
    进入$GEOSHOME\source\headers\geos,把platform.h.vc改名为platform.h,把version.h.in改名为version.h
    进入$GEOSHOME\source
    登记vcvars32.bat,如"D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat",依你的vs安装路径和版本自己看着办.
    运行nmake /f makefile.vc,注意,不要去$GEOSHOME\VisualStudio下开vc工程,那个工程如果没有经过修改是不会运行成功的.nmake运行成功后,就有了geos.lib了,很好,现在geos的C++版已经可以用了.
    下面进入$GEOSHOME\swig\python目录
    运行swig -c++ -python -modern -o geos_wrap.cxx ../geos.i (注意,这里的前提是你有swig,没有去下一个swig for windows,然后把swig.exe所在目录加入path环境变量
    打开setup.py,去掉有stdc++.lib的那行,然后把libgeos.a改成geos.lib
    运行python setup.py build
    运行python setup.py install
    ok,成了!

    让geos作为ogr的辅助支持

    上面的编译方法实在有些……,不过有一种简单的办法也可以用到geos的功能,就是让ogr添加geos支持。这种方法比较稳妥,也比较容易成功。

    先参考上面的步骤编译出geos.lib静态库。

    然后打开gdal主目录下的nmake.opt修改:

    GEOS_CFLAGS = -IE:/clibs/geos-2.1.4/source/headers -DHAVE_GEOS
    GEOS_LIB     = E:/clibs/geos-2.1.4/source/geos.lib

    这两行,把前面的“#”号去掉,然后把两个路径修改成geos下对应的目录。注意:第一个需要修改的是从-I开始到-D结束,写得是GEOS头文件所在的headers目录,而且-D前面有空格。第二个是从=开始,到行末,写的是geos.lib所处路径

    然后重新编译gdal库。然后 nmake /f makefile.vc install安装后就可以用GEOS支持了。

    其实geos支持本来就应该在编译gdal时直接添加了。到后面再加就有点浪费感情了。:-)

    测试安装是否成功

    做个例子试一下,看是否添加成功:

    >>> import ogr
    >>> wkt = "POINT (1 1)"
    >>> geom = ogr.CreateGeometryFromWkt(wkt)
    >>> buf = geom.Buffer(1)
    >>> buf.ExportToWkt()
    'POLYGON ((2 1,1.998629534754652 0.947664043758551,1.994521895368586 0.895471536
    735323,1.98768834059584 0.843565534964204,1.97814760073505 0.792088309188096,1.9
    65925826291005 0.741180954904707,1.951056516297928 0.690983005633592,1.933580426
    500956 0.64163205046448,1.913545457647471 0.593263356935137,1.891006524194483 0.
    546009500272454,1.866025403791921 0.500000000012961,1.83867056795439 0.455360964
    998779,1.809016994385503 0.412214747722056,1.777145961469214 0.370679608965282,1
    .743144825491414 0.330869393656712,1.707106781202421 0.292893218829326,1.6691306
    06376652 0.256855174538628,1.629320391069609 0.22285403855904,1.587785252314266
    0.190983005640886,1.544639035038874 0.161329432070062,1.500000000025921 0.133974
    596230527,1.453990499767549 0.1089934758259,1.406736643105877 0.08645454237079,1
    .358367949577434 0.066419573515133,1.309016994409106 0.048943483715945,1.2588190
    45138659 0.034074173720615,1.207911690855819 0.021852399274284,1.15643446508014
    0.012311659411183,1.104528463309327 0.005478104636107,1.052335956286284 0.001370
    465247698,1.000000000044896 0.0,0.947664043803385 0.001370465242998,0.8954715367
    79973 0.005478104626721,0.843565535008546 0.012311659397137,0.792088309232011 0.
    021852399255615,0.741180954948073 0.034074173697375,0.69098300567629 0.048943483
    688198,0.641632050506393 0.066419573482955,0.593263356976151 0.086454542334269,0
    .546009500312456 0.108993475785135,0.500000000051841 0.133974596185631,0.4553609
    65036432 0.161329432021158,0.412214747758377 0.190983005588108,0.370679609000173
     0.222854038502531,0.330869393690077 0.256855174478545,0.292893218861073 0.29289
    3218765832,0.25685517456867 0.330869393589983,0.222854038587295 0.37067960889549
    9,0.190983005667276 0.412214747649411,0.161329432094515 0.455360964923472,0.1339
    74596252976 0.499999999935197,0.108993475846283 0.546009500192447,0.086454542389
    052 0.593263356853106,0.066419573531224 0.641632050380649,0.04894348372982 0.690
    983005548192,0.034074173732236 0.741180954817972,0.021852399283619 0.79208830910
    0263,0.012311659418207 0.843565534875514,0.0054781046408 0.89547153664602,0.0013
    70465250047 0.947664043668878,0.0 0.999999999910204,0.001370465240648 1.05233595
    6151776,0.005478104622028 1.104528463175373,0.012311659390113 1.156434464947106,
    0.02185239924628 1.20791169072407,0.034074173685754 1.258819045008556,0.04894348
    3674323 1.309016994281006,0.066419573466864 1.358367949451687,0.086454542316006
    1.406736642982829,0.10899347576475 1.453990499647536,0.13397459616318 1.49999999
    9909273,0.161329431996703 1.54463903492591,0.190983005561715 1.587785252205296,0
    .222854038474274 1.629320390964932,0.256855174448499 1.669130606276555,0.2928932
    18734082 1.707106781107177,0.330869393556614 1.743144825401285,0.370679608860604
     1.777145961384448,0.412214747613085 1.809016994306332,0.455360964885815 1.83867
    056788103,0.499999999896312 1.866025403724574,0.546009500152441 1.89100652413333
    3,0.593263356812088 1.913545457592686,0.641632050338733 1.933580426452686,0.6909
    83005505492 1.951056516256306,0.741180954774604 1.965925826256144,0.792088309056
    347 1.978147600707046,0.843565534831169 1.98768834057477,0.895471536601369 1.994
    521895354507,0.947664043624043 1.998629534747603,0.999999999865308 2.0,1.0523359
    56106943 1.998629534761701,1.104528463130724 1.994521895382665,1.156434464902764
     1.98768834061691,1.207911690680157 1.978147600763054,1.258819044965192 1.965925
    826325865,1.30901699423831 1.95105651633955,1.358367949409777 1.933580426549225,
    1.406736642941818 1.913545457702254,1.453990499607537 1.89100652425563,1.4999999
    99870396 1.866025403859266,1.544639034888262 1.838670568027747,1.587785252168979
     1.809016994464671,1.629320390930046 1.777145961553976,1.669130606243195 1.74314
    4825581537,1.707106781075436 1.70710678129766,1.743144825371249 1.66913060647674
    5,1.777145961356199 1.629320391174281,1.809016994279947 1.58778525242323,1.83867
    0567856582 1.544639035151832,1.86602540370213 1.500000000142563,1.89100652411295
    4 1.453990499887555,1.913545457574428 1.406736643228919,1.933580426436599 1.3583
    67949703174,1.951056516242435 1.3090169945372,1.965925826244526 1.25881904526875
    5,1.978147600697713 1.207911690987561,1.987688340567748 1.156434465213167,1.9945
    21895349815 1.104528463443274,1.998629534745254 1.052335956420784,2 1))'
    >>>

    好大的一个缓冲区!不过这个多边形的圆也太恶心了吧!

    Linux下的安装

    这还要我说吗?


    ./configure
    make
    make install


    自己去折腾吧!

    要OGR支持,只要在GDAL编译的时候加入GEOS的编译开关(似乎只要在编译gdal前编译安装好GEOS,在configure GDAL的时候就会自动加入GEOS支持,当然各个系统不一定)重新编译GDAL就可以了。

    不懂编译开关的设置?那就用./configure --help看看吧!一大堆?慢慢看。一堆英文看不懂?不是吧,我四级没过都看懂了。实在看不懂?那么你就apt yum urpmi 什么的搞个二进制包吧!

    祝你好运!

    网友留言/评论

    我要留言/评论

    相关文章

    有关技术管理经理的一些思考:这些天里工作的环境发生了一些微小的变化,可能以后对基层开发的程序员也会有更加具体的影响。上周参加 Open Party 时,重点听了《那些失败的项目们》,分析了一个项目的提出、实施,直到最后失败的过程。我也在想一个技术团队究竟应该用怎样的一种管理方式,才能让技术团队的效率达到更优。
    如何成为一位优秀的创业CEO:做创业公司的 CEO 可以说是世界上最有挑战性的事情之一。你得让客户喜欢你的产品,得组建团队,还要想办法从客户、合作者和投资者那里拿到资金;并且要指导整个工作流程的优化。
    关于独立游戏开发5个过程的相关建议:作为一名独立游戏开发者,在制作游戏过程中尽量多学些东西这一点极为重要。我认为这一过程包含以下几个步骤:1.想法 2.原型 3.迭代 4.测试 5.完工。我希望针对这个过程的每个阶段提供一些对你们有所帮助的建议,以便你们加快开发速度,提升游戏质量。
    代码审查:好事?坏事?:在软件开发领域,代码审查看起来是一个少有争议、相当平和的话题。
    如何避免重构带来的危险:重构代码很危险,它会给测试工作增加巨大的负担。除非你的程序需要重构,一定不要轻易重构代码。我这里所说的并不是把一个for循环改成while循环,或把一个StringBuffer改成StringBuilder,我说的是大动作,例如重写一个方法,一个函数,甚至整个类或包。如果你缺乏对一个方法或一个类的了解,那你重构它的条件就不充分。即使你有一个天才的计划,你也需要和团队一起设计其中重大的修改。
    Facebook如何提高软件质量?:刘彪是微软测试技术团队的一名软件设计工程师,他在自己的博客上分享了Facebook如何提高软件质量的原则、手段和背后的原因。
    程序员如何保持优秀:优秀便接近成功,金钱和名望比较难以控制。
    关于实施有效站会(Stand-Up Meeting)的三个技巧:通常的站会(tand-Up meetings)的形式总是让我感觉有点怪怪的。它有时会造成一些并不期望的效果。这篇文章里,我将向大家介绍一些在我们blossom公司里经过修改后的站会措施。
    软件项目管理中的“免坑”指南:“谁也无法改变现状,唯有无数程序员血洒大地,才能使项目重建天日。”这一点也不夸张,软件项目做烂了就是个坑,参与者也不过是填坑的。就像是在魔兽世界战场遇到国家队一样,你赢也赢不了,出也出不去。
    如何有效地报告Bug?:自由软件开发者Simon Tatham针对如何有效地报告Bug发表了自己的看法,他列举了一系列拙劣Bug报告的例子,并提出了改正建议。