如何用孔GEOS库创建一个Polygon

时间:2014-01-29 23:26:27

标签: c++ geos

我正在使用GEOS库,我正在尝试创建一个带有洞的Polygon。根据{{​​3}},我必须传入代表外部“shell”的LinearRing和代表shell中的洞的std::vector<Geometry*>。第一个参数很简单,但第二个参数给我带来了麻烦。 Polygon希望第二个参数中的元素为LineString s(LineStringGeometry的子类);否则,它会抛出一个例外,说明这些洞需要LineString。如果我只是将LineString转换为Geometry,那么它会抛出异常。如果我没有强制转换它,我会收到一个编译错误,指出一种类型的指针不能转换为另一种类型的指针。我无法弄清楚该做什么。

这是一个演示错误的简短代码示例:

geos::geom::CoordinateSequence* temp = factory->getCoordinateSequenceFactory()->create((std::size_t) 0, 0);

temp->add(geos::geom::Coordinate(0, 0));
temp->add(geos::geom::Coordinate(100, 0));
temp->add(geos::geom::Coordinate(100, 100));
temp->add(geos::geom::Coordinate(0, 100));
temp->add(geos::geom::Coordinate(0, 0));

geos::geom::LinearRing *shell=factory->createLinearRing(temp);

temp = factory->getCoordinateSequenceFactory()->create((std::size_t) 0, 0);

temp->add(geos::geom::Coordinate(1, 1));
temp->add(geos::geom::Coordinate(10, 1));
temp->add(geos::geom::Coordinate(10, 10));
temp->add(geos::geom::Coordinate(1, 10));
temp->add(geos::geom::Coordinate(1, 1));

geos::geom::LinearRing *hole=factory->createLinearRing(temp);
holes->push_back((geos::geom::Geometry*) hole);

factory->createPolygon(shell,holes);

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我解决了。

我有一个包含geos/geom/GeometryFactory.h的包含行。在该文件中,有geos::geom::LinearRing的前向声明,但它没有说该类是geos::geom::Geometry的子类。因此,编译器将其视为两个不同的类。 #include <geos/geom/LinearRing.h>修复了它。