BOX3D computeBounds(GEOSContextHandle_t ctx, GEOSGeometry const *geometry) { uint32_t numInputDims; BOX3D output; GEOSGeometry const* ring = GEOSGetExteriorRing_r(ctx, geometry); GEOSCoordSequence const* coords = GEOSGeom_getCoordSeq_r(ctx, ring); GEOSCoordSeq_getDimensions_r(ctx, coords, &numInputDims); uint32_t count(0); GEOSCoordSeq_getSize_r(ctx, coords, &count); double x(0.0); double y(0.0); double z(0.0); for (unsigned i = 0; i < count; ++i) { GEOSCoordSeq_getOrdinate_r(ctx, coords, i, 0, &x); GEOSCoordSeq_getOrdinate_r(ctx, coords, i, 1, &y); if (numInputDims > 2) GEOSCoordSeq_getOrdinate_r(ctx, coords, i, 2, &z); output.grow(x, y, z); } return output; }
BOX3D Polygon::bounds() const { uint32_t numInputDims; BOX3D output; GEOSGeometry* boundary = GEOSGeom_clone_r(m_ctx, m_geom); // Smash out multi* if (GEOSGeomTypeId_r(m_ctx, m_geom) > 3) boundary = GEOSEnvelope_r(m_ctx, m_geom); GEOSGeometry const* ring = GEOSGetExteriorRing_r(m_ctx, boundary); GEOSCoordSequence const* coords = GEOSGeom_getCoordSeq_r(m_ctx, ring); GEOSCoordSeq_getDimensions_r(m_ctx, coords, &numInputDims); uint32_t count(0); GEOSCoordSeq_getSize_r(m_ctx, coords, &count); double x(0.0); double y(0.0); double z(0.0); for (unsigned i = 0; i < count; ++i) { GEOSCoordSeq_getOrdinate_r(m_ctx, coords, i, 0, &x); GEOSCoordSeq_getOrdinate_r(m_ctx, coords, i, 1, &y); if (numInputDims > 2) GEOSCoordSeq_getOrdinate_r(m_ctx, coords, i, 2, &z); output.grow(x, y, z); } GEOSGeom_destroy_r(m_ctx, boundary); return output; }
BOX3D Crop::computeBounds(GEOSGeometry const *geometry) { uint32_t numInputDims; BOX3D output; #ifdef PDAL_HAVE_GEOS GEOSGeometry const* ring = GEOSGetExteriorRing_r(m_geosEnvironment, geometry); GEOSCoordSequence const* coords = GEOSGeom_getCoordSeq_r(m_geosEnvironment, ring); GEOSCoordSeq_getDimensions_r(m_geosEnvironment, coords, &numInputDims); log()->get(LogLevel::Debug) << "Inputted WKT had " << numInputDims << " dimensions" <<std::endl; uint32_t count(0); GEOSCoordSeq_getSize_r(m_geosEnvironment, coords, &count); double x(0.0); double y(0.0); double z(0.0); for (unsigned i = 0; i < count; ++i) { GEOSCoordSeq_getOrdinate_r(m_geosEnvironment, coords, i, 0, &x); GEOSCoordSeq_getOrdinate_r(m_geosEnvironment, coords, i, 1, &y); if (numInputDims > 2) GEOSCoordSeq_getOrdinate_r(m_geosEnvironment, coords, i, 2, &z); output.grow(x, y, z); } #else boost::ignore_unused_variable_warning(geometry); #endif return output; }
void Point::update(const std::string& wkt_or_json, SpatialReference ref) { Geometry::update(wkt_or_json, ref); int t = GEOSGeomTypeId_r(m_geoserr.ctx(), m_geom.get()); if (t == -1) throw pdal_error("Unable to fetch geometry point type"); if (t > 0) throw pdal_error("Geometry type is not point!"); int nGeometries = GEOSGetNumGeometries_r(m_geoserr.ctx(), m_geom.get()); if (nGeometries > 1) throw pdal_error("Geometry count is > 1!"); const GEOSGeometry* g = GEOSGetGeometryN_r(m_geoserr.ctx(), m_geom.get(), 0); GEOSCoordSequence const* coords = GEOSGeom_getCoordSeq_r(m_geoserr.ctx(), g); uint32_t numInputDims; GEOSCoordSeq_getDimensions_r(m_geoserr.ctx(), coords, &numInputDims); uint32_t count(0); GEOSCoordSeq_getSize_r(m_geoserr.ctx(), coords, &count); if (count == 0) throw pdal_error("No coordinates in geometry!"); for (unsigned i = 0; i < count; ++i) { GEOSCoordSeq_getOrdinate_r(m_geoserr.ctx(), coords, i, 0, &x); GEOSCoordSeq_getOrdinate_r(m_geoserr.ctx(), coords, i, 1, &y); if (numInputDims > 2) GEOSCoordSeq_getOrdinate_r(m_geoserr.ctx(), coords, i, 2, &z); } }
Q_NOWARN_UNREACHABLE_POP // Return Nth vertex in GEOSGeometry as a POINT. // May return NULL if the geometry has NO vertexex. static GEOSGeometry *LWGEOM_GEOS_getPointN( const GEOSGeometry *g_in, uint32_t n ) { GEOSContextHandle_t handle = QgsGeos::getGEOSHandler(); uint32_t dims; const GEOSCoordSequence *seq_in = nullptr; GEOSCoordSeq seq_out; double val; uint32_t sz; int gn; GEOSGeometry *ret = nullptr; switch ( GEOSGeomTypeId_r( handle, g_in ) ) { case GEOS_MULTIPOINT: case GEOS_MULTILINESTRING: case GEOS_MULTIPOLYGON: case GEOS_GEOMETRYCOLLECTION: { for ( gn = 0; gn < GEOSGetNumGeometries_r( handle, g_in ); ++gn ) { const GEOSGeometry *g = GEOSGetGeometryN_r( handle, g_in, gn ); ret = LWGEOM_GEOS_getPointN( g, n ); if ( ret ) return ret; } break; } case GEOS_POLYGON: { ret = LWGEOM_GEOS_getPointN( GEOSGetExteriorRing_r( handle, g_in ), n ); if ( ret ) return ret; for ( gn = 0; gn < GEOSGetNumInteriorRings_r( handle, g_in ); ++gn ) { const GEOSGeometry *g = GEOSGetInteriorRingN_r( handle, g_in, gn ); ret = LWGEOM_GEOS_getPointN( g, n ); if ( ret ) return ret; } break; } case GEOS_POINT: case GEOS_LINESTRING: case GEOS_LINEARRING: break; } seq_in = GEOSGeom_getCoordSeq_r( handle, g_in ); if ( ! seq_in ) return nullptr; if ( ! GEOSCoordSeq_getSize_r( handle, seq_in, &sz ) ) return nullptr; if ( ! sz ) return nullptr; if ( ! GEOSCoordSeq_getDimensions_r( handle, seq_in, &dims ) ) return nullptr; seq_out = GEOSCoordSeq_create_r( handle, 1, dims ); if ( ! seq_out ) return nullptr; if ( ! GEOSCoordSeq_getX_r( handle, seq_in, n, &val ) ) return nullptr; if ( ! GEOSCoordSeq_setX_r( handle, seq_out, n, val ) ) return nullptr; if ( ! GEOSCoordSeq_getY_r( handle, seq_in, n, &val ) ) return nullptr; if ( ! GEOSCoordSeq_setY_r( handle, seq_out, n, val ) ) return nullptr; if ( dims > 2 ) { if ( ! GEOSCoordSeq_getZ_r( handle, seq_in, n, &val ) ) return nullptr; if ( ! GEOSCoordSeq_setZ_r( handle, seq_out, n, val ) ) return nullptr; } return GEOSGeom_createPoint_r( handle, seq_out ); }