只是一个很小的程序测试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可以创建成功,只是算法为什么不能用呢?
考虑了很久也上网查了很多资料还是不知道问题出在哪里。有没有用过的高人能告诉我问题在哪,要不然真是要崩溃了呀。
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可以创建成功,只是算法为什么不能用呢?
考虑了很久也上网查了很多资料还是不知道问题出在哪里。有没有用过的高人能告诉我问题在哪,要不然真是要崩溃了呀。
这个库是有问题的,我测试也发现了。
换用geos_i.lib geos_i.dll,问题解决。我刚刚测试你的代码也是先用了静态库,否则这个问题还真心不好发现
果断给分!!!!!!!!!!
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算法已经实现了,对不对????