void object::test<3>() { char* wktOuter = "POLYGON((-90 -90, -90 90, 190 -90, -90 -90))"; err_ = OGR_G_CreateFromWkt(&wktOuter, NULL, &g1_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g1_); char* wktInner = "POLYGON((0 0, 10 10, 10 0, 0 0))"; err_ = OGR_G_CreateFromWkt(&wktInner, NULL, &g2_); ensure_equals("Can't import geometry from WKT", OGRERR_NONE, err_); ensure("Can't create geometry", NULL != g2_); ensure_equals("OGR_G_Contains() failed with FALSE", OGR_G_Contains(g1_, g2_), TRUE); ensure_equals("OGR_G_Contains() failed with TRUE", OGR_G_Contains(g2_, g1_), FALSE); }
/** * \brief Convenience function to check if a geometry is contained in a OGR * datasource for a given layer. * * The passed geometry is a wkt representation of a geometry of type GeomType. * pszFile is opened, and the passed geometry is queried against all * geometries in pszLayer. If the passed geometry is contained in *any* of the * geomtries in the layer, TRUE is returned. FALSE is returned otherwise, * including errors. The SRS of all geometries is assumed to be the same. * * \param pszWkt Well-known text representation of a geometry. * \param pszFile File to open * \param pszLayer Layer to extract geometry from, if NULL, use layer 0. * \return TRUE if pszWkt is contained in any geometry in pszLayer, FALSE * otherwise, include errors */ int NinjaOGRContain(const char *pszWkt, const char *pszFile, const char *pszLayer) { int bContains = FALSE; if( pszWkt == NULL || pszFile == NULL ) { return FALSE; } CPLDebug( "WINDNINJA", "Checking for containment of %s in %s:%s", pszWkt, pszFile, pszLayer ? pszLayer : "" ); OGRGeometryH hTestGeometry = NULL; int err = OGR_G_CreateFromWkt( (char**)&pszWkt, NULL, &hTestGeometry ); if( hTestGeometry == NULL || err != CE_None ) { return FALSE; } OGRDataSourceH hDS = OGROpen( pszFile, 0, NULL ); if( hDS == NULL ) { CPLError( CE_Failure, CPLE_AppDefined, "Failed to open datasource: %s", pszFile ); OGR_G_DestroyGeometry( hTestGeometry ); bContains = FALSE; return bContains; } OGRLayerH hLayer; if( pszLayer == NULL ) { hLayer = OGR_DS_GetLayer( hDS, 0 ); } else { hLayer = OGR_DS_GetLayerByName( hDS, pszLayer ); } OGRFeatureH hFeature; if( hLayer != NULL ) { OGRGeometryH hGeometry; OGR_L_ResetReading( hLayer ); while( ( hFeature = OGR_L_GetNextFeature( hLayer ) ) != NULL ) { hGeometry = OGR_F_GetGeometryRef( hFeature ); if( OGR_G_Contains( hGeometry, hTestGeometry ) ) { bContains = TRUE; OGR_F_Destroy( hFeature ); break; } OGR_F_Destroy( hFeature ); } } OGR_G_DestroyGeometry( hTestGeometry ); OGR_DS_Destroy( hDS ); return bContains; }