GEOSGeometry *getPolygon(bool &error) {
//free the returned value with GEOSGeom_destroy
error = false;
if (points.size() < 3) {
error = true;
return 0;
} else {
GEOSCoordSequence *seq = GEOSCoordSeq_create(points.size()+1, 2);
for (int a=0;a<points.size();++a) {
GEOSCoordSeq_setX(seq, a, points[a].x());
GEOSCoordSeq_setY(seq, a, points[a].y());
}
GEOSCoordSeq_setX(seq, points.size(), points[0].x());
GEOSCoordSeq_setY(seq, points.size(), points[0].y());
GEOSGeometry *ring = GEOSGeom_createLinearRing(seq);
return GEOSGeom_createPolygon(ring, NULL, 0);
}
}
GEOSGeometry *poly = getPolygon(error);
if (error) {
} else {
GEOSGeometry *cpoint = GEOSGetCentroid(poly);
const GEOSCoordSequence *cseq = GEOSGeom_getCoordSeq(cpoint);
double x=0, y=0;
GEOSCoordSeq_getX(cseq, 0, &x);
GEOSCoordSeq_getY(cseq, 0, &y);
GEOSGeom_destroy(poly);
GEOSGeom_destroy(cpoint);
}
}
GEOSGeometry *getPolygon(bool &error) {
//free the returned value with GEOSGeom_destroy
error = false;
if (points.size() < 3) {
error = true;
return 0;
} else {
GEOSCoordSequence *seq = GEOSCoordSeq_create(points.size()+1, 2);
for (int a=0;a<points.size();++a) {
GEOSCoordSeq_setX(seq, a, points[a].x());
GEOSCoordSeq_setY(seq, a, points[a].y());
}
GEOSCoordSeq_setX(seq, points.size(), points[0].x());
GEOSCoordSeq_setY(seq, points.size(), points[0].y());
GEOSGeometry *ring = GEOSGeom_createLinearRing(seq);
return GEOSGeom_createPolygon(ring, NULL, 0);
}
}
QPointF getCenter(bool &error) {
GEOSGeometry *poly = getPolygon(error);
if (error) {
return QPointF();
} else {
GEOSGeometry *cpoint = GEOSGetCentroid(poly);
const GEOSCoordSequence *cseq = GEOSGeom_getCoordSeq(cpoint);
double x=0, y=0;
GEOSCoordSeq_getX(cseq, 0, &x);
GEOSCoordSeq_getY(cseq, 0, &y);
GEOSGeom_destroy(poly);
GEOSGeom_destroy(cpoint);
return QPointF(x, y);
}
}
To copy to clipboard, switch view to plain text mode
Bookmarks