From 2ac26812b2880375bd4291b7b21b35683e581721 Mon Sep 17 00:00:00 2001 From: chrisala Date: Wed, 29 May 2024 12:33:11 +1000 Subject: [PATCH] Calculate area of compound site using features #962 --- .../au/org/ala/ecodata/SiteService.groovy | 14 ++++++- .../au/org/ala/ecodata/SiteServiceSpec.groovy | 37 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) 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]]