diff --git a/grails-app/services/au/org/ala/ecodata/SiteService.groovy b/grails-app/services/au/org/ala/ecodata/SiteService.groovy index 4e5c746bc..37db8dbe7 100644 --- a/grails-app/services/au/org/ala/ecodata/SiteService.groovy +++ b/grails-app/services/au/org/ala/ecodata/SiteService.groovy @@ -623,7 +623,19 @@ class SiteService { def populateLocationMetadataForSite(Map site) { - def siteGeom = geometryAsGeoJson(site) + Map siteGeom + if (site.type == Site.TYPE_COMPOUND) { + siteGeom = [ + type:'GeometryCollection', + geometries: [ + site.features.collect{it.geometry} + ] + ] + } + else { + siteGeom = geometryAsGeoJson(site) + } + if (siteGeom) { GeometryJSON gjson = new GeometryJSON() Geometry geom = gjson.read((siteGeom as JSON).toString()) diff --git a/src/test/groovy/au/org/ala/ecodata/SiteServiceSpec.groovy b/src/test/groovy/au/org/ala/ecodata/SiteServiceSpec.groovy index cc81daa90..c3fe1bc5a 100644 --- a/src/test/groovy/au/org/ala/ecodata/SiteServiceSpec.groovy +++ b/src/test/groovy/au/org/ala/ecodata/SiteServiceSpec.groovy @@ -305,6 +305,43 @@ class SiteServiceSpec extends MongoSpec implements ServiceUnitTest sites.externalIds.idType == [[ExternalId.IdType.MONITOR_PLOT_GUID], [ExternalId.IdType.MONITOR_PLOT_GUID]] } + def "The site area is calculated from the FeatureCollection for a compound site"() { + setup: + def coordinates = [[148.260498046875, -37.26530995561874], [148.260498046875, -37.26531995561874], [148.310693359375, -37.26531995561874], [148.310693359375, -37.26531995561874], [148.260498046875, -37.26530995561874]] + def extent = buildExtent('drawn', 'Polygon', coordinates) + Map site = [type: Site.TYPE_COMPOUND, extent: extent, features: [ + [ + type : "Feature", + geometry: [ + type : "Polygon", + coordinates: coordinates + ] + ], + [ + type : "Feature", + geometry: [ + type : "Polygon", + coordinates: coordinates + ] + ] + ]] + + when: + service.populateLocationMetadataForSite(site) + + then: + 1 * spatialServiceMock.intersectGeometry(_, _) >> [:] + site.extent.geometry.aream2 == 4938.9846950349165d + + when: + site.type = Site.TYPE_WORKS_AREA + service.populateLocationMetadataForSite(site) + + then: + 1 * spatialServiceMock.intersectGeometry(_, _) >> [:] + site.extent.geometry.aream2 == 2469.492347517461 + + } private Map buildExtent(source, type, coordinates, pid = '') { return [source:source, geometry:[type:type, coordinates: coordinates, pid:pid]]