pointObj *msGEOSGetCentroid(shapeObj *shape) { #ifdef USE_GEOS GEOSGeom g1, g2; GEOSCoordSeq coords; pointObj *point; if(!shape) return NULL; if(!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom) msGEOSShape2Geometry(shape); g1 = (GEOSGeom) shape->geometry; if(!g1) return NULL; g2 = GEOSGetCentroid(g1); point = (pointObj *) malloc(sizeof(pointObj)); coords = (GEOSCoordSeq) GEOSGeom_getCoordSeq(g2); GEOSCoordSeq_getX(coords, 0, &(point->x)); GEOSCoordSeq_getY(coords, 0, &(point->y)); /* GEOSCoordSeq_getZ(coords, 0, &(point->z)); */ GEOSCoordSeq_destroy(coords); return point; #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSGetCentroid()"); return NULL; #endif }
static YAP_Bool point_list_to_sequence (YAP_Term term, unsigned int size, sequence_t *sequence) { YAP_Float x, y; unsigned int n; YAP_Term head; *sequence = GEOSCoordSeq_create (size, 2); if (*sequence == NULL) return (FALSE); for (n = 0; YAP_IsPairTerm (term) != FALSE; n ++) { assert (n < size); head = YAP_HeadOfTerm (term); if ((Yap_IsNumberTerm (YAP_ArgOfTerm (1, head), &x) == FALSE) || (Yap_IsNumberTerm (YAP_ArgOfTerm (2, head), &y) == FALSE) || (GEOSCoordSeq_setX (*sequence, n, x) == 0) || (GEOSCoordSeq_setY (*sequence, n, y) == 0)) { GEOSCoordSeq_destroy (*sequence); return (FALSE); } term = YAP_TailOfTerm (term); } assert (n == size); assert (YAP_IsAtomTerm (term) != FALSE); assert (strcmp (YAP_AtomName (YAP_AtomOfTerm (term)), "[]") == 0); return (TRUE); }
YAP_Bool point_to_geometry (YAP_Term term, geometry_t *geometry) { sequence_t sequence; YAP_Float x, y; YAP_Functor functor; const char * functor_name; unsigned int arity; assert (geometry != NULL); if (YAP_IsApplTerm (term) == FALSE) return (FALSE); functor = YAP_FunctorOfTerm (term); functor_name = YAP_AtomName (YAP_NameOfFunctor (functor)); arity = YAP_ArityOfFunctor (functor); if ((strcmp (functor_name, NAME_POINT) != 0) || (arity != 2)) return (FALSE); if ((Yap_IsNumberTerm (YAP_ArgOfTerm (1, term), &x) == FALSE) || (Yap_IsNumberTerm (YAP_ArgOfTerm (2, term), &y) == FALSE)) return (FALSE); sequence = GEOSCoordSeq_create (1, 2); if (sequence == NULL) return (FALSE); if ((GEOSCoordSeq_setX (sequence, 0, x) == 0) || (GEOSCoordSeq_setY (sequence, 0, y) == 0)) { GEOSCoordSeq_destroy (sequence); return (FALSE); } *geometry = GEOSGeom_createPoint (sequence); if (*geometry == NULL) return (FALSE); return (TRUE); }
void object::test<2>() { geom1_ = GEOSGeomFromWKT("POLYGON((1 1,1 5,5 5,5 1,1 1))"); // geom2_ = GEOSGeomFromWKT("POINT(8 8)"); geom2_ = GEOSGeomFromWKT("POLYGON((8 8, 9 9, 9 10, 8 8))"); ensure( 0 != geom1_ ); ensure( 0 != geom2_ ); GEOSCoordSequence *coords_; coords_ = GEOSNearestPoints(geom1_, geom2_); ensure( 0 != coords_ ); unsigned int size; GEOSCoordSeq_getSize(coords_, &size); ensure( 2 == size ); double x1, x2, y1, y2; /* Point in geom1_ */ GEOSCoordSeq_getOrdinate(coords_, 0, 0, &x1); GEOSCoordSeq_getOrdinate(coords_, 0, 1, &y1); /* Point in geom2_ */ GEOSCoordSeq_getOrdinate(coords_, 1, 0, &x2); GEOSCoordSeq_getOrdinate(coords_, 1, 1, &y2); ensure( 5 == x1 ); ensure( 5 == y1 ); ensure( 8 == x2 ); ensure( 8 == y2 ); GEOSCoordSeq_destroy(coords_); }
~test_capigeoscoordseq_data() { GEOSCoordSeq_destroy(cs_); cs_ = 0; finishGEOS(); }
void VertexSnapper::snap() { qDebug("VertexSnapper::snap: ENTERING SNAP"); for ( unsigned int i = 0; i < subGeometry.size(); i++ ) { // find close features from the reference layer // vectors of coordinates of close Geometries std::vector<double> closeCoordX; std::vector<double> closeCoordY; qDebug("VertexSnapper::snap: Vectors with coordinates created"); for ( unsigned int j = 0; j < refGeometry.size(); j++) { bool close = isClose( subGeometry[i].getGEOSGeom(), refGeometry[j].getGEOSGeom() ); qDebug("VertexSnapper::snap: isClose checked."); if (close) { // add close coordinates //closeCoord->add( refGeometry[j].getGEOSGeom()->getCoordinates(), false, true );//(*ref_it).getGEOSGeom()->getCoordinates(), false, true ); // get points from geometry //GEOSGeometry* points = GEOSGeom_extractUniquePoints( refGeometry[j].getGEOSGeom() ); const GEOSCoordSequence *coords = GEOSGeom_getCoordSeq( refGeometry[j].getGEOSGeom() ); // NOTE: Only linestring or points is possible //GEOSCoordSequence *coords = GEOSCoordSeq_clone( s ); qDebug("VertexSnapper::snap: GEOSCoordSequence cloned from refGeometry"); // get number of points unsigned int cSize; GEOSCoordSeq_getSize( coords, &cSize ); // add x and y coordinates to the vectors for ( unsigned int k = 0; k < cSize; k++ ) { double x, y; GEOSCoordSeq_getX( coords, k, &x ); GEOSCoordSeq_getY( coords, k, &y ); closeCoordX.push_back(x); closeCoordY.push_back(y); qDebug("VertexSnapper::snap: Close coordinates x, y added to vector"); } //GEOSCoordSeq_destroy(coords); } } // create sequence with close points int dim = GEOSGeom_getDimensions( refGeometry[0].getGEOSGeom() ); GEOSCoordSequence *closeCoord = GEOSCoordSeq_create( closeCoordX.size(), dim ); qDebug("VertexSnapper::snap: GEOSCoordSequence closeCoord created"); for( unsigned int l = 0; l < closeCoordX.size(); l++) { GEOSCoordSeq_setX(closeCoord, l, closeCoordX[l]); GEOSCoordSeq_setY(closeCoord, l, closeCoordY[l]); } // snap vertex snapVertices( &subGeometry[i], closeCoord); newGeometry.push_back( subGeometry[i] ); GEOSCoordSeq_destroy(closeCoord); } } // void VertexSnapper::snap()