diff --git a/grails-app/conf/application.groovy b/grails-app/conf/application.groovy index 2b7df022f..7ea7c823e 100644 --- a/grails-app/conf/application.groovy +++ b/grails-app/conf/application.groovy @@ -1042,6 +1042,8 @@ license.default = "https://creativecommons.org/licenses/by-nc/3.0/au/" projectActivity.notifyOnChange=true biocollect.baseURL="https://biocollect.ala.org.au" biocollect.projectActivityDataURL="${biocollect.baseURL}/bioActivity/projectRecords" +biocollect.projectArea.simplificationThreshold=10000 +biocollect.projectArea.simplificationTolerance=0.1 // elasticsearch cluster setting // can transport layer connection be made from apps outside JVM diff --git a/grails-app/services/au/org/ala/ecodata/ElasticSearchService.groovy b/grails-app/services/au/org/ala/ecodata/ElasticSearchService.groovy index c0b4965da..3a159656a 100644 --- a/grails-app/services/au/org/ala/ecodata/ElasticSearchService.groovy +++ b/grails-app/services/au/org/ala/ecodata/ElasticSearchService.groovy @@ -1093,7 +1093,7 @@ class ElasticSearchService { // GeoServer requires a single attribute with project area. Cannot use `sites` property (above) since it has // all sites associated with project. // todo: Check if BioCollect requires all sites in `sites` property. If no, merge `projectArea` with `sites`. - projectMap.projectArea = siteService.get(project.projectSiteId, [SiteService.FLAT, SiteService.INDEXING]) + projectMap.projectArea = siteService.getSimpleProjectArea(projectMap.projectSiteId) projectMap.containsActivity = activityService.searchAndListActivityDomainObjects([projectId: projectMap.projectId], null, null, null, [max: 1, offset: 0])?.totalCount > 0 } projectMap.sites?.each { site -> diff --git a/grails-app/services/au/org/ala/ecodata/ProjectService.groovy b/grails-app/services/au/org/ala/ecodata/ProjectService.groovy index b42072ed3..5ba2ca920 100644 --- a/grails-app/services/au/org/ala/ecodata/ProjectService.groovy +++ b/grails-app/services/au/org/ala/ecodata/ProjectService.groovy @@ -4,7 +4,7 @@ import au.org.ala.ecodata.converter.SciStarterConverter import grails.converters.JSON import grails.core.GrailsApplication import groovy.json.JsonSlurper -import org.codehaus.jackson.map.ObjectMapper +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.context.MessageSource import org.springframework.web.servlet.i18n.SessionLocaleResolver @@ -746,6 +746,7 @@ class ProjectService { * And link artifacts to the project. TODO: creating project extent. * @return */ + @Scheduled(cron = "0 0 * * 0") Map importProjectsFromSciStarter() { int ignoredProjects = 0, createdProjects = 0, updatedProjects = 0, page = 1 JsonSlurper slurper = new JsonSlurper() diff --git a/grails-app/services/au/org/ala/ecodata/SiteService.groovy b/grails-app/services/au/org/ala/ecodata/SiteService.groovy index 18e973980..4d8e50ee2 100644 --- a/grails-app/services/au/org/ala/ecodata/SiteService.groovy +++ b/grails-app/services/au/org/ala/ecodata/SiteService.groovy @@ -255,6 +255,29 @@ class SiteService { site } + def getSimpleProjectArea(projectSiteId) { + def threshold = grailsApplication.config.getProperty('biocollect.projectArea.simplificationThreshold') + def tolerance = grailsApplication.config.getProperty('biocollect.projectArea.simplificationTolerance') + log.info("Threshhold ${threshold} Tolerance ${tolerance}") + + def site = get(projectSiteId, [SiteService.FLAT, SiteService.INDEXING]) + + if (site != null) { + def projectArea = geometryAsGeoJson(site) + + if (projectArea?.coordinates != null) { + def coordsSize = projectArea.coordinates.flatten().size() + if (coordsSize > threshold) { + GeometryUtils.simplify(projectArea, tolerance) + } else { + projectArea + } + } + } + + site + } + def create(props) { // assert getCommonService() def site = new Site(siteId: Identifiers.getNew(true,''))