Hi Vinayan
It is recommended to use the C-api of geos, not the C++ one (C-api is
more stable). Therefore, the qgis code uses only the C-api and you can
use QgsGeometry::asGeos() in the plugin instead of wkt-export / wkt-import.
For cascaded union, there is the method GEOSUnaryUnion(const
GEOSGeometry* g1) in the c-api. The argument seems to be a geometry
collection, which can be created with GEOSGeom_createCollection.
Regards,
Marco
On 24.01.2013 06:32, vinayan wrote:
Hi,
I am trying to find gaps inside a polygon layer much like the ESRI
topology rule("must not have gaps"). I did this initially by making an
extent polygon and then subtracting the union of all geometries from
this extent polygon.
All this worked well and for around 100 polygons in the extent the
performance is ok. But when the count goes up, the performance is
drastically down. The issue, I think is because I am creating the
union iteratively as below.
for ( it = mFeatureList1.begin(); it != FeatureListEnd; ++it )
{
g2 = it->feature.geometry();
g1 = g1->combine( g2 );
}
From what I read from Martin Davis'
blog(http://lin-ear-th-inking.blogspot.in/2007/11/fast-polygon-merging-in-jts-using.html),
the cascaded polygon union improves the performance of union by a
large ratio.
I want to use the below method that exist in Geos. But I am not sure
how to use it.
I got this far(also pasted in pastebin http://pastebin.com/rniMLuZW),
std::vector<geos::geom::Polygon*> geomCollection;
QList<FeatureLayer>::ConstIterator FeatureListEnd = mFeatureList1.end();
for ( it = mFeatureList1.begin(); it != FeatureListEnd; ++it )
{
g1 = it->feature.geometry();
const std::string wkt = g1->exportToWkt().toStdString();
geos::geom::Polygon* geom =
dynamic_cast<geos::geom::Polygon*>(geos::io::WKTReader().read(wkt));
//error is here....
geomCollection.push_back(geom);
}
geos::geom::Geometry* unionedPoly =
geos::operation::geounion::CascadedPolygonUnion::Union(&geomCollection);
The error is,
/home/vinayan/QgisGitWorking/Quantum-GIS/src/plugins/topology/topolTest.cpp:746:
error: cannot dynamic_cast
‘geos::io::WKTReader().geos::io::WKTReader::read((* & wkt))’ (of type
‘struct geos::geom::Geometry*’) to type ‘struct geos::geom::Polygon*’
(target is not pointer or reference to complete type)
This has more to do with my c++ knowledge than anything i guess..but
if anyone can help where I am going wrong, it would be a good step
forward for me. If it works well, I am sure this function would find
use in other parts of Qgis where slow unions are involved.
Thanks in advance,
Vinayan
_______________________________________________
Qgis-developer mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/qgis-developer
--
Dr. Marco Hugentobler
Sourcepole - Linux & Open Source Solutions
Weberstrasse 5, CH-8004 Zürich, Switzerland
[email protected] http://www.sourcepole.ch
Technical Advisor QGIS Project Steering Committee
_______________________________________________
Qgis-developer mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/qgis-developer