只是一个很小的程序测试geos库里的touch和intersection算子,可是不知道为什么老出错,请教高手指点迷津。下面是程序:         PrecisionModel *pm = new PrecisionModel();
         GeometryFactory * global_factory= new GeometryFactory(pm);
CoordinateSequence *cl = new CoordinateArraySequence();
cl->add(Coordinate(100,100));
cl->add(Coordinate(100,200));
cl->add(Coordinate(200,200));
cl->add(Coordinate(200,100));
cl->add(Coordinate(100,100));
LinearRing *lr = global_factory->createLinearRing(cl);
         geos::geom::Polygon *poly=NULL;
poly = global_factory->createPolygon(lr,NULL);      CoordinateSequence *cr = new CoordinateArraySequence();
cr->add(geos::geom::Coordinate(150, 150));
cr->add(geos::geom::Coordinate(150, 250));
cr->add(geos::geom::Coordinate(250, 250));
cr->add(geos::geom::Coordinate(250, 150));
cr->add(geos::geom::Coordinate(150, 150)); LinearRing *li = global_factory->createLinearRing(cr);
geos::geom::Polygon *poly1=global_factory->createPolygon(li,NULL);   geos::geom::Geometry *poly2; 
BOOL test;
geos::geom::Geometry *g1=poly;
geos::geom::Geometry *g2=poly1;
 
test=g2->touches(g2);    //出现非法访问错误
poly2=g1->intersection(g2);  //出现buffer overrun错误
global_factory->destroyGeometry(lr);
global_factory->destroyGeometry(li);
if (cr)
{
delete cr;
cr=NULL;
}
if (cl)
{
delete cl;
cl=NULL;
}
global_factory->destroyGeometry(poly);
global_factory->destroyGeometry(poly1);
global_factory->destroyGeometry(poly2);
delete pm;   编译时没有错误,只是每次运行到touch和intersection算法时就出错。前面创建LinearRing已经测试过了,数据确实传递进去了,没有问题。创建Polygon时如果第二个参数传递非NULL时会提示非法访问,设为NULL后Polygon可以创建成功,只是算法为什么不能用呢?
   考虑了很久也上网查了很多资料还是不知道问题出在哪里。有没有用过的高人能告诉我问题在哪,要不然真是要崩溃了呀。

解决方案 »

  1.   

    楼主使用geos的时候用用的应该是静态库就是geos.lib.这个库大概30几m
    这个库是有问题的,我测试也发现了。
    换用geos_i.lib geos_i.dll,问题解决。我刚刚测试你的代码也是先用了静态库,否则这个问题还真心不好发现
    果断给分!!!!!!!!!!
      

  2.   

    geos_i.lib和geos.dll,上面说错了。没有文件的话留邮箱
      

  3.   

    tan34035:用你所说的动态库,能运行通过,可是并没有把数据真的传进去呀,这是怎么回事呢?????
      

  4.   

    我测试已经通过了。你上面的touch和intersection函数都返回false
      

  5.   

    tan34035,touch返回false还可以理解,intersection怎么可能返回空呢??我上面定义的两个polygon明明是又交集的嘛,不信你自己画出来看看...............
      

  6.   

    我试了你的数据,确实是空,建议你用直接创建正方形的方法试试,参看example.cpp中的代码
      

  7.   

    tan34035,我在原来程序基础上加了几句:
        CoordinateSequence *Coor=poly2->getCoordinates();
        Coordinate c=Coor->getAt(0);
        c=Coor->getAt(1);
        c=Coor->getAt(2);
        c=Coor->getAt(3);
        c=Coor->getAt(4);
        c=Coor->getAt(0);
    测试了一下,发现交集poly2的boundry方法得出来的是这几个点:(150,200)(200,200)(200,150)(150,150)(150,200)这五个点,还测了下getArea()和getlength()跟实际情况相符合,说明intersection算法已经实现了,对不对????
     
      

  8.   

    tan34035,错了,用的是getCoordinate()方法,不是boundary()方法