diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..7316204 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,31 @@ +# This is a basic workflow to help you get started with Actions + +name: docs + +# Controls when the workflow will run +on: + # Triggers the workflow on push or pull request events but only for the master branch + push: + branches: [ main ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - uses: actions/setup-python@v2 + - run: pip install --upgrade pip && pip install install mkdocs-material && pip install mkdocs-minify-plugin + - run: git config user.name 'github-actions[bot]' && git config user.email 'github-actions[bot]@users.noreply.github.com' + - name: Publish docs + run: mkdocs gh-deploy --force diff --git a/.github/workflows/homol.yml b/.github/workflows/homol.yml new file mode 100644 index 0000000..7c5b9f4 --- /dev/null +++ b/.github/workflows/homol.yml @@ -0,0 +1,139 @@ +name: Build and Deploy in Homology Server + +on: + push: + branches: + - develop + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Configurar Node.js + uses: actions/setup-node@v2 + with: + node-version: '16.4.2' + + + - name: Define a variável application_name + run: | + echo "branch=${GITHUB_REF##*/}" >> $GITHUB_ENV + repo_full_name=$GITHUB_REPOSITORY + repo_name=${repo_full_name##*/} + echo "START_TIME=$(date -u +%s)" >> $GITHUB_ENV + echo "Nome do repositório: $repo_name" + + echo "application_name=app_araticum" >> $GITHUB_ENV + + echo "LAST_COMMIT_HASH=$(git log --pretty=format:%h -n 1)" >> $GITHUB_ENV + echo "LAPIG_AUTHOR_NAME=$(git show -s --pretty=%an)" >> $GITHUB_ENV + echo "LAPIG_AUTHOR_EMAIL=$(git show -s --pretty=%ae)" >> $GITHUB_ENV + echo "LAPIG_AUTHOR_DATE=$(git log -1 --format=%cd --date=local)" >> $GITHUB_ENV + echo "LAPIG_PROJECT_NAME=$(git config --local remote.origin.url)" >> $GITHUB_ENV + echo "LAPIG_LAST_COMMIT=$(git show --summary | grep 'commit' | awk '{print $2}')" >> $GITHUB_ENV + echo "LAPIG_COMMIT_COMMENT=$(git log -1 --pretty=%B)" >> $GITHUB_ENV + echo "LAPIG_COMMIT_DATE=$(git show -s --format=%ci)" >> $GITHUB_ENV + echo "LAPIG_BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV + echo "NODE_OPTIONS=--max-old-space-size=8096" >> $GITHUB_ENV + + - name: Use Git outputs + run: | + echo "Author Name: $LAPIG_AUTHOR_NAME" + echo "Author Email: $LAPIG_AUTHOR_EMAIL" + echo "Author Date: $LAPIG_AUTHOR_DATE" + echo "Project Name: $LAPIG_PROJECT_NAME" + echo "Last Commit: $LAPIG_LAST_COMMIT" + echo "Commit Comment: $LAPIG_COMMIT_COMMENT" + echo "Commit Date: $LAPIG_COMMIT_DATE" + echo "Branch Name: $LAPIG_BRANCH_NAME" + + - name: Create version.json + run: echo '{"commitId":"$LAST_COMMIT_HASH"}' > version.json + + - name: Determine branch + id: get_branch + run: echo "::set-output name=branch::${GITHUB_REF##*/}" + + - name: Build Server and client + run: | + npm set progress=false + cd ${{ github.workspace }}/src/server && npm install + cd ${{ github.workspace }}/src/client && npm install + cd ${{ github.workspace }}/src/client && ng build --stats-json --source-map=false --no-progress + + + - name: Validate and Build + run: | + git pull origin develop + docker build -t ${{secrets.REGISTRYHOMOL}}/$application_name:${LAST_COMMIT_HASH} -t ${{secrets.REGISTRYHOMOL}}/$application_name:latest -f docker/homologation/Dockerfile . --no-cache + + + - name: Login to Docker Registry + run: echo "${{ secrets.HARBOR_PASS }}" | docker login -u "${{ secrets.HARBOR_USER }}" --password-stdin "${{ secrets.URL_PRIVATE_REGISTRY }}" + + - name: Push Image to Registry + run: | + docker push ${{secrets.REGISTRYHOMOL}}/$application_name:${LAST_COMMIT_HASH} + docker push ${{secrets.REGISTRYHOMOL}}/$application_name:latest + + - name: Remove image locally + run: | + docker rmi ${{secrets.REGISTRYHOMOL}}/$application_name:${LAST_COMMIT_HASH} + docker rmi ${{secrets.REGISTRYHOMOL}}/$application_name:latest + + + - name: Add SSH key to known_hosts + run: | + mkdir -p ~/.ssh + ssh-keyscan -t rsa ${{secrets.SERVER_HOMOL_KNOWN}} >> ~/.ssh/known_hosts 2>/dev/null + chmod 644 ~/.ssh/known_hosts + echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa + chmod 600 ~/.ssh/id_rsa + + - name: Pull Image on Server + run: | + ssh ${{secrets.SERVER_HOMOL_SSH}} "docker pull ${{secrets.REGISTRYHOMOL}}/$application_name:latest" + + + - name: Deploy Container + run: | + + delete_status=$(ssh ${{secrets.SERVER_HOMOL_SSH}} "curl -v -X DELETE -w "%{http_code}" http://${{secrets.SERVER_HOMOL}}/containers/$application_name?force=true 2>/dev/null") + echo "Delete Status: $delete_status" + + create_status=$(ssh ${{secrets.SERVER_HOMOL_SSH}} "curl -v -X POST -H 'Content-Type: application/json' -d @${{secrets.CONFIG_FILES}}$application_name.json -s -o /dev/null -w "%{http_code}" http://${{secrets.SERVER_HOMOL}}/containers/create?name=$application_name 2>/dev/null") + echo "Create Status: $create_status" + + echo "CREATE_STATUS=$create_status" >> $GITHUB_ENV + echo "DELETE_STATUS=$delete_status" >> $GITHUB_ENV + - name: Start Container + run: | + start_status=$(ssh ${{secrets.SERVER_HOMOL_SSH}} "curl -v -X POST -s -o /dev/null -w "%{http_code}" http://${{secrets.SERVER_HOMOL}}/containers/$application_name/start 2>/dev/null") + echo "Start Status: $start_status" + echo "START_STATUS=$start_status" >> $GITHUB_ENV + + - name: Send message to Telegram + run: | + end_time=$(date -u +%s) + echo "LAPIG_DURATION=$((end_time - START_TIME))" >> $GITHUB_ENV + curl -s -X POST "https://api.telegram.org/bot${TOKEN}/sendMessage" -d "chat_id=${CHAT_ID}" -d "parse_mode=markdown" -d "text=*Project*: *${LAPIG_PROJECT_NAME}*\n*Branch*: ${LAPIG_BRANCH_NAME}\n*Author*: *${LAPIG_AUTHOR_NAME}*\n*Author_Email*: *${LAPIG_AUTHOR_EMAIL}*\n*Commit_ID*: *${LAPIG_LAST_COMMIT}*\n*Message_Commit*: *${LAPIG_COMMIT_COMMENT}*\n*Date_Commit*: *${LAPIG_COMMIT_DATE}*\n*Duration*: *${LAPIG_DURATION}*'" + + - name: Send message to Discord + run: | + if [[ "${{ job.status }}" == "success" && "$START_STATUS" == "204" && "$DELETE_STATUS" == "204" && "$CREATE_STATUS" == "201" ]]; then + echo "avatar_url='${{vars.LAPIG_SUCCESS}}'" >> $GITHUB_ENV + else + echo "avatar_url='${{vars.LAPIG_ERROR}}'" >> $GITHUB_ENV + fi + echo "discordDesc='Result: ${{ job.status }}\n Project: $LAPIG_PROJECT_NAME\n Commit: $LAPIG_LAST_COMMIT\n Author: $LAPIG_AUTHOR_NAME\n Author_Email: $LAPIG_AUTHOR_EMAIL\n Message: $LAPIG_COMMIT_COMMENT\n Date: $LAPIG_COMMIT_DATE\n Delete Status: $delete_status\n Create Status: $create_status\n Start Status: $start_status\n Duration: $LAPIG_DURATION seconds'" >> $GITHUB_ENV + + echo "discordFooter='${{ github.workflow }} (#${{ github.run_number }})'" >> $GITHUB_ENV + echo "discordTitle='${{ github.workflow }} (build #${{ github.run_number }})'" >> $GITHUB_ENV + + + curl -H "Content-Type: application/json" -X POST -d '{"content": "${discordTitle}", "embeds": [ { "title": "${$discordTitle}", "description": "${discordDesc}", "footer": { "text": "${discordFooter}" } } ], "username": "GitHub Actions", "avatar_url": "${avatar_url}" }' https://discord.com/api/webhooks/${{ secrets.DISCORD_KEY }} + diff --git a/.gitignore b/.gitignore index 9b39b85..56a0282 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,9 @@ *.tar.gz *.rar +*.Jenkinsfile +*.Dockerfile + # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* src/server/.env diff --git a/Jenkinsfile b/Jenkinsfile index 3f04f37..b48a734 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,16 +1,15 @@ - node { - + node { + load "$JENKINS_HOME/.envvars" - def exists=fileExists "src/server/package-lock.json" - def exists2=fileExists "src/client/package-lock.json" def application_name= "app_araticum" + def NODE_VERSION= "14.16.0" stage('Checkout') { - git branch: 'develop', + git branch: 'main', url: 'https://github.com/lapig-ufg/restauracao-araticum.git' } stage('Validate') { - sh 'git pull origin develop' + sh 'git pull origin main' } stage('SonarQube analysis') { @@ -18,7 +17,7 @@ def scannerHome = tool 'sonarqube-scanner'; withSonarQubeEnv("sonarqube") { sh "${tool("sonarqube-scanner")}/bin/sonar-scanner \ - -Dsonar.projectKey=araticum \ + -Dsonar.projectKey=agrotoxicos\ -Dsonar.sources=. \ -Dsonar.css.node=. \ -Dsonar.host.url=$SonarUrl \ @@ -34,28 +33,17 @@ //BUILD APPLICATION echo "Build main site distribution" sh "npm set progress=false" - if (exists) { - echo 'Yes' - sh "cd src/server && npm ci" - } else { - echo 'No' - sh "cd src/server && npm install" - } - if (exists2) { - echo 'Yes' - sh "cd src/client && npm ci" - } else { - echo 'No' - sh "cd src/client && npm install" - } - + sh "cd src/server && npm install" + sh "cd src/client && npm install" + + //VERIFY IF BUILD IS COMPLETE AND NOTIFY IN DISCORD ABOUT OF THE RESULT sh "export NODE_OPTIONS=--max-old-space-size=8096" def status = sh(returnStatus: true, script: "cd src/client && ng build --stats-json --source-map=false --no-progress") if (status != 0) { echo "FAILED BUILD!" currentBuild.result = 'FAILED' - def discordImageSuccess = 'https://www.jenkins.io/images/logos/formal/256.png' + def discordImageSuccess = 'https://www.jenkins.io/images/logos/formal/256.png' def discordImageError = 'https://www.jenkins.io/images/logos/fire/256.png' def Author_Name=sh(script: "git show -s --pretty=%an", returnStdout: true).trim() @@ -92,54 +80,53 @@ autoCancelled = true error('Aborting the build.') } - + } } stage('Building Image') { - dockerImage = docker.build registryhomol + "/$application_name:$BUILD_NUMBER" + dockerImage = docker.build registryprod + "/$application_name:$BUILD_NUMBER", "--build-arg --no-cache -f Dockerfile ." } stage('Push Image to Registry') { - + docker.withRegistry( "$Url_Private_Registry", "$registryCredential" ) { dockerImage.push("${env.BUILD_NUMBER}") dockerImage.push("latest") - + } - + } stage('Removing image Locally') { - sh "docker rmi $registryhomol/$application_name:$BUILD_NUMBER" - sh "docker rmi $registryhomol/$application_name:latest" + sh "docker rmi $registryprod/$application_name:$BUILD_NUMBER" + sh "docker rmi $registryprod/$application_name:latest" } - stage ('Pull imagem on DEV') { + stage ('Pull imagem on PROD') { sshagent(credentials : ['KEY_FULL']) { - sh "$SERVER_HOMOL_SSH 'docker pull $registryhomol/$application_name:latest'" + sh "$SERVER_PROD_SSH 'docker pull $registryprod/$application_name:latest'" } } + stage('Deploy container on PROD') { + + configFileProvider([configFile(fileId: "$File_Json_Id_ARATICUM_PROD", targetLocation: 'container-araticum-deploy-prod.json')]) { - stage('Deploy container on DEV') { - - configFileProvider([configFile(fileId: "$File_Json_Id_ARATICUM_HOMOL", targetLocation: 'container-araticum-deploy-homol.json')]) { - - def url = "http://$SERVER_HOMOL/containers/$application_name?force=true" + def url = "http://$SERVER_PROD/containers/$application_name?force=true" def response = sh(script: "curl -v -X DELETE $url", returnStdout: true).trim() echo response - url = "http://$SERVER_HOMOL/containers/create?name=$application_name" - response = sh(script: "curl -v -X POST -H 'Content-Type: application/json' -d @container-araticum-deploy-homol.json -s $url", returnStdout: true).trim() + url = "http://$SERVER_PROD/containers/create?name=$application_name" + response = sh(script: "curl -v -X POST -H 'Content-Type: application/json' -d @container-araticum-deploy-prod.json -s $url", returnStdout: true).trim() echo response } - + } - stage('Start container on DEV') { + stage('Start container on PROD') { - final String url = "http://$SERVER_HOMOL/containers/$application_name/start" + final String url = "http://$SERVER_PROD/containers/$application_name/start" final String response = sh(script: "curl -v -X POST -s $url", returnStdout: true).trim() echo response - - + + } stage('Send message to Discord') { @@ -180,7 +167,7 @@ thumbnail: 'SUCCESS'.equals(currentBuild.currentResult) ? discordImageSuccess : discordImageError } - + stage('Send message to Telegram') { def Author_Name=sh(script: "git show -s --pretty=%an", returnStdout: true).trim() @@ -198,5 +185,5 @@ """) } } - + } diff --git a/README.md b/README.md index c425f54..9fceed1 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ # Platform Restauração Araticum - +A Articulação pela Restauração do Cerrado é uma rede colaborativa e multisetorial, que visa atuar + como uma coalizão cujo objetivo é promover a restauração em larga escala do Bioma. diff --git a/docker/homologation/Dockerfile b/docker/homologation/Dockerfile new file mode 100644 index 0000000..4150209 --- /dev/null +++ b/docker/homologation/Dockerfile @@ -0,0 +1,17 @@ +FROM registry.lapig.iesa.ufg.br/lapig-images-prod/app_araticum:base + +# Clone app and npm install on server +ENV URL_TO_APPLICATION_GITHUB="https://github.com/lapig-ufg/restauracao-araticum.git" +ENV BRANCH="main" + +LABEL maintainer="Renato Gomes " + +RUN if [ -d "/APP/restauracao-araticum" ]; then rm -Rf /APP/restauracao-araticum; fi && \ + cd /APP && git clone -b ${BRANCH} ${URL_TO_APPLICATION_GITHUB} + +ADD ../../src/server/node_modules /APP/restauracao-araticum/src/server/node_modules +ADD ./src/client/dist/client /APP/restauracao-araticum/src/client/dist/client + +CMD [ "/bin/bash", "-c", "/APP/src/server/prod-start.sh; tail -f /dev/null"] + +ENTRYPOINT [ "/APP/Monitora.sh"] diff --git a/Dockerfile b/docker/production/Dockerfile similarity index 65% rename from Dockerfile rename to docker/production/Dockerfile index b763250..0cac3b7 100644 --- a/Dockerfile +++ b/docker/production/Dockerfile @@ -1,4 +1,4 @@ -FROM registry.lapig.iesa.ufg.br/lapig-images-homol/app_araticum:base +FROM registry.lapig.iesa.ufg.br/lapig-images-homol/app_araticum:base # Clone app and npm install on server ENV URL_TO_APPLICATION_GITHUB="https://github.com/lapig-ufg/restauracao-araticum.git" @@ -6,9 +6,10 @@ ENV BRANCH="develop" LABEL maintainer="Renato Gomes " -RUN cd /APP && git clone -b ${BRANCH} ${URL_TO_APPLICATION_GITHUB} && \ - cd /APP/restauracao-araticum/src/server && npm install && rm -rf /APP/plataform-base - +RUN if [ -d "/APP/restauracao-araticum" ]; then rm -Rf /APP/restauracao-araticum; fi && \ + cd /APP && git clone -b ${BRANCH} ${URL_TO_APPLICATION_GITHUB} + +ADD ../../src/server/node_modules /APP/restauracao-araticum/src/server/node_modules ADD ./src/client/dist/client /APP/restauracao-araticum/src/client/dist/client CMD [ "/bin/bash", "-c", "/APP/src/server/prod-start.sh; tail -f /dev/null"] diff --git a/docs/docs/01-guia_dados_geograficos.md b/docs/01-guia_dados_geograficos.md similarity index 100% rename from docs/docs/01-guia_dados_geograficos.md rename to docs/01-guia_dados_geograficos.md diff --git a/docs/docs/01-guia_funcionalidades.md b/docs/01-guia_funcionalidades.md similarity index 100% rename from docs/docs/01-guia_funcionalidades.md rename to docs/01-guia_funcionalidades.md diff --git a/docs/docs/01-guia_metricas_de_qualidade.md b/docs/01-guia_metricas_de_qualidade.md similarity index 100% rename from docs/docs/01-guia_metricas_de_qualidade.md rename to docs/01-guia_metricas_de_qualidade.md diff --git a/docs/docs/01-guia_relatorios.md b/docs/01-guia_relatorios.md similarity index 100% rename from docs/docs/01-guia_relatorios.md rename to docs/01-guia_relatorios.md diff --git a/docs/docs/02-arq_execucao_dpat.md b/docs/02-arq_execucao_dpat.md similarity index 100% rename from docs/docs/02-arq_execucao_dpat.md rename to docs/02-arq_execucao_dpat.md diff --git a/docs/docs/02-arq_geral.md b/docs/02-arq_geral.md similarity index 100% rename from docs/docs/02-arq_geral.md rename to docs/02-arq_geral.md diff --git a/docs/docs/02-arq_servidor_de_aplicacao.md b/docs/02-arq_servidor_de_aplicacao.md similarity index 100% rename from docs/docs/02-arq_servidor_de_aplicacao.md rename to docs/02-arq_servidor_de_aplicacao.md diff --git a/docs/docs/02-arq_servidor_de_mapas.md b/docs/02-arq_servidor_de_mapas.md similarity index 100% rename from docs/docs/02-arq_servidor_de_mapas.md rename to docs/02-arq_servidor_de_mapas.md diff --git a/docs/docs/03-dad_rasters.md b/docs/03-dad_rasters.md similarity index 100% rename from docs/docs/03-dad_rasters.md rename to docs/03-dad_rasters.md diff --git a/docs/docs/03-dad_vetoriais.md b/docs/03-dad_vetoriais.md similarity index 100% rename from docs/docs/03-dad_vetoriais.md rename to docs/03-dad_vetoriais.md diff --git a/docs/docs/04-metricas_de_avaliacao.md b/docs/04-metricas_de_avaliacao.md similarity index 100% rename from docs/docs/04-metricas_de_avaliacao.md rename to docs/04-metricas_de_avaliacao.md diff --git a/docs/docs/index.md b/docs/docs/index.md deleted file mode 100644 index fbf0c3f..0000000 --- a/docs/docs/index.md +++ /dev/null @@ -1,9 +0,0 @@ - -![Cerrado DPAT](imgs/00/topo.png) - -# Documentação Cerrado DPAT - -O Cerrado Deforestation Polygon Assessment Tool (Cerrado DPAT) é uma ferramenta online e gratuita criada com o propósito de caracterizar as áreas desmatadas detectadas pelos sistemas PRODES-Cerrado e DETER-Cerrado. Atualmente é utilizada por gestores, pesquisadores e todos aqueles que necessitam de informações sobre o bioma, especialmente sobre as características do desmatamento e áreas naturais susceptíveis a este tipo de evento. - -Essa é uma documentação para a plataforma [Cerrado DPAT](http://cerradodpat.ufg.br), desenvolvida pelo [Laboratório de Processamento de Images e Geoprocessamento da Universidade Federal de Goiás (LAPIG/UFG)](http://www.lapig.iesa.ufg.br) no âmbito do [projeto Desenvolvimento de sistemas de prevenção de incêndios florestais e monitoramento da cobertura vegetal no Cerrado brasileiro](http://fip.mma.gov.br/projeto-fm/) financiado pelo Banco Mundial. - diff --git a/docs/docs/egoml/1_DetermineWOERanges.egoml b/docs/egoml/1_DetermineWOERanges.egoml similarity index 100% rename from docs/docs/egoml/1_DetermineWOERanges.egoml rename to docs/egoml/1_DetermineWOERanges.egoml diff --git a/docs/docs/egoml/2_DetermineWOECoefficients.egoml b/docs/egoml/2_DetermineWOECoefficients.egoml similarity index 100% rename from docs/docs/egoml/2_DetermineWOECoefficients.egoml rename to docs/egoml/2_DetermineWOECoefficients.egoml diff --git a/docs/docs/egoml/3_CalcProbabiltyMap.egoml b/docs/egoml/3_CalcProbabiltyMap.egoml similarity index 100% rename from docs/docs/egoml/3_CalcProbabiltyMap.egoml rename to docs/egoml/3_CalcProbabiltyMap.egoml diff --git a/docs/docs/imgs/00/logo-cerrado-dpat.png b/docs/imgs/00/logo-cerrado-dpat.png similarity index 100% rename from docs/docs/imgs/00/logo-cerrado-dpat.png rename to docs/imgs/00/logo-cerrado-dpat.png diff --git a/docs/docs/imgs/00/topo.png b/docs/imgs/00/topo.png similarity index 100% rename from docs/docs/imgs/00/topo.png rename to docs/imgs/00/topo.png diff --git a/docs/docs/imgs/01/analise_area_submetida.jpg b/docs/imgs/01/analise_area_submetida.jpg similarity index 100% rename from docs/docs/imgs/01/analise_area_submetida.jpg rename to docs/imgs/01/analise_area_submetida.jpg diff --git a/docs/docs/imgs/01/analise_automatica.jpg b/docs/imgs/01/analise_automatica.jpg similarity index 100% rename from docs/docs/imgs/01/analise_automatica.jpg rename to docs/imgs/01/analise_automatica.jpg diff --git a/docs/docs/imgs/01/areas_especiais.jpg b/docs/imgs/01/areas_especiais.jpg similarity index 100% rename from docs/docs/imgs/01/areas_especiais.jpg rename to docs/imgs/01/areas_especiais.jpg diff --git a/docs/docs/imgs/01/areas_submetidas_car.png b/docs/imgs/01/areas_submetidas_car.png similarity index 100% rename from docs/docs/imgs/01/areas_submetidas_car.png rename to docs/imgs/01/areas_submetidas_car.png diff --git a/docs/docs/imgs/01/bfast.png b/docs/imgs/01/bfast.png similarity index 100% rename from docs/docs/imgs/01/bfast.png rename to docs/imgs/01/bfast.png diff --git a/docs/docs/imgs/01/camadadedados.jpg b/docs/imgs/01/camadadedados.jpg similarity index 100% rename from docs/docs/imgs/01/camadadedados.jpg rename to docs/imgs/01/camadadedados.jpg diff --git a/docs/docs/imgs/01/camdados_desmatamento.jpg b/docs/imgs/01/camdados_desmatamento.jpg similarity index 100% rename from docs/docs/imgs/01/camdados_desmatamento.jpg rename to docs/imgs/01/camdados_desmatamento.jpg diff --git a/docs/docs/imgs/01/camdados_desmatamento.png b/docs/imgs/01/camdados_desmatamento.png similarity index 100% rename from docs/docs/imgs/01/camdados_desmatamento.png rename to docs/imgs/01/camdados_desmatamento.png diff --git a/docs/docs/imgs/01/campo_1.png b/docs/imgs/01/campo_1.png similarity index 100% rename from docs/docs/imgs/01/campo_1.png rename to docs/imgs/01/campo_1.png diff --git a/docs/docs/imgs/01/campo_3.png b/docs/imgs/01/campo_3.png similarity index 100% rename from docs/docs/imgs/01/campo_3.png rename to docs/imgs/01/campo_3.png diff --git a/docs/docs/imgs/01/campo_4.jpg b/docs/imgs/01/campo_4.jpg similarity index 100% rename from docs/docs/imgs/01/campo_4.jpg rename to docs/imgs/01/campo_4.jpg diff --git a/docs/docs/imgs/01/campo_relatorio.jpg b/docs/imgs/01/campo_relatorio.jpg similarity index 100% rename from docs/docs/imgs/01/campo_relatorio.jpg rename to docs/imgs/01/campo_relatorio.jpg diff --git a/docs/docs/imgs/01/concordancia_campos.jpg b/docs/imgs/01/concordancia_campos.jpg similarity index 100% rename from docs/docs/imgs/01/concordancia_campos.jpg rename to docs/imgs/01/concordancia_campos.jpg diff --git a/docs/docs/imgs/01/dashboard.jpg b/docs/imgs/01/dashboard.jpg similarity index 100% rename from docs/docs/imgs/01/dashboard.jpg rename to docs/imgs/01/dashboard.jpg diff --git a/docs/docs/imgs/01/estatisticas_desmatamento.jpg b/docs/imgs/01/estatisticas_desmatamento.jpg similarity index 100% rename from docs/docs/imgs/01/estatisticas_desmatamento.jpg rename to docs/imgs/01/estatisticas_desmatamento.jpg diff --git a/docs/docs/imgs/01/exemplo_area_prioritaria.jpg b/docs/imgs/01/exemplo_area_prioritaria.jpg similarity index 100% rename from docs/docs/imgs/01/exemplo_area_prioritaria.jpg rename to docs/imgs/01/exemplo_area_prioritaria.jpg diff --git a/docs/docs/imgs/01/fluxograma.png b/docs/imgs/01/fluxograma.png similarity index 100% rename from docs/docs/imgs/01/fluxograma.png rename to docs/imgs/01/fluxograma.png diff --git a/docs/docs/imgs/01/image10.jpg b/docs/imgs/01/image10.jpg similarity index 100% rename from docs/docs/imgs/01/image10.jpg rename to docs/imgs/01/image10.jpg diff --git a/docs/docs/imgs/01/image19.jpg b/docs/imgs/01/image19.jpg similarity index 100% rename from docs/docs/imgs/01/image19.jpg rename to docs/imgs/01/image19.jpg diff --git a/docs/docs/imgs/01/image9.jpg b/docs/imgs/01/image9.jpg similarity index 100% rename from docs/docs/imgs/01/image9.jpg rename to docs/imgs/01/image9.jpg diff --git a/docs/docs/imgs/01/metodologia_quali.jpg b/docs/imgs/01/metodologia_quali.jpg similarity index 100% rename from docs/docs/imgs/01/metodologia_quali.jpg rename to docs/imgs/01/metodologia_quali.jpg diff --git a/docs/docs/imgs/01/nivelmunicipal.jpg b/docs/imgs/01/nivelmunicipal.jpg similarity index 100% rename from docs/docs/imgs/01/nivelmunicipal.jpg rename to docs/imgs/01/nivelmunicipal.jpg diff --git a/docs/docs/imgs/01/pol_car.jpg b/docs/imgs/01/pol_car.jpg similarity index 100% rename from docs/docs/imgs/01/pol_car.jpg rename to docs/imgs/01/pol_car.jpg diff --git a/docs/docs/imgs/01/qrcode.jpg b/docs/imgs/01/qrcode.jpg similarity index 100% rename from docs/docs/imgs/01/qrcode.jpg rename to docs/imgs/01/qrcode.jpg diff --git a/docs/docs/imgs/01/relatorio_desmatamento.jpg b/docs/imgs/01/relatorio_desmatamento.jpg similarity index 100% rename from docs/docs/imgs/01/relatorio_desmatamento.jpg rename to docs/imgs/01/relatorio_desmatamento.jpg diff --git a/docs/docs/imgs/01/serie_historica_landsat.png b/docs/imgs/01/serie_historica_landsat.png similarity index 100% rename from docs/docs/imgs/01/serie_historica_landsat.png rename to docs/imgs/01/serie_historica_landsat.png diff --git a/docs/docs/imgs/01/superficies_2_tamanhos.jpg b/docs/imgs/01/superficies_2_tamanhos.jpg similarity index 100% rename from docs/docs/imgs/01/superficies_2_tamanhos.jpg rename to docs/imgs/01/superficies_2_tamanhos.jpg diff --git a/docs/docs/imgs/01/suscep_oeste_baiano.png b/docs/imgs/01/suscep_oeste_baiano.png similarity index 100% rename from docs/docs/imgs/01/suscep_oeste_baiano.png rename to docs/imgs/01/suscep_oeste_baiano.png diff --git a/docs/docs/imgs/01/suscep_x_d2016.jpg b/docs/imgs/01/suscep_x_d2016.jpg similarity index 100% rename from docs/docs/imgs/01/suscep_x_d2016.jpg rename to docs/imgs/01/suscep_x_d2016.jpg diff --git a/docs/docs/imgs/01/tela-inicial.png b/docs/imgs/01/tela-inicial.png similarity index 100% rename from docs/docs/imgs/01/tela-inicial.png rename to docs/imgs/01/tela-inicial.png diff --git a/docs/docs/imgs/01/uploaddados.jpg b/docs/imgs/01/uploaddados.jpg similarity index 100% rename from docs/docs/imgs/01/uploaddados.jpg rename to docs/imgs/01/uploaddados.jpg diff --git a/docs/docs/imgs/01/uploaddadosqrcode.jpg b/docs/imgs/01/uploaddadosqrcode.jpg similarity index 100% rename from docs/docs/imgs/01/uploaddadosqrcode.jpg rename to docs/imgs/01/uploaddadosqrcode.jpg diff --git a/docs/docs/imgs/02/database.png b/docs/imgs/02/database.png similarity index 100% rename from docs/docs/imgs/02/database.png rename to docs/imgs/02/database.png diff --git a/docs/docs/imgs/02/interoperabilidade.png b/docs/imgs/02/interoperabilidade.png similarity index 100% rename from docs/docs/imgs/02/interoperabilidade.png rename to docs/imgs/02/interoperabilidade.png diff --git a/docs/docs/imgs/02/mapfile.png b/docs/imgs/02/mapfile.png similarity index 100% rename from docs/docs/imgs/02/mapfile.png rename to docs/imgs/02/mapfile.png diff --git a/docs/docs/imgs/02/mapfile2.png b/docs/imgs/02/mapfile2.png similarity index 100% rename from docs/docs/imgs/02/mapfile2.png rename to docs/imgs/02/mapfile2.png diff --git a/docs/docs/imgs/02/ows-schema.png b/docs/imgs/02/ows-schema.png similarity index 100% rename from docs/docs/imgs/02/ows-schema.png rename to docs/imgs/02/ows-schema.png diff --git a/docs/docs/imgs/02/ows-standalone/dpat-1.png b/docs/imgs/02/ows-standalone/dpat-1.png similarity index 100% rename from docs/docs/imgs/02/ows-standalone/dpat-1.png rename to docs/imgs/02/ows-standalone/dpat-1.png diff --git a/docs/docs/imgs/02/ows-standalone/dpat-2.png b/docs/imgs/02/ows-standalone/dpat-2.png similarity index 100% rename from docs/docs/imgs/02/ows-standalone/dpat-2.png rename to docs/imgs/02/ows-standalone/dpat-2.png diff --git a/docs/docs/imgs/02/ows-standalone/exec-ows-1.png b/docs/imgs/02/ows-standalone/exec-ows-1.png similarity index 100% rename from docs/docs/imgs/02/ows-standalone/exec-ows-1.png rename to docs/imgs/02/ows-standalone/exec-ows-1.png diff --git a/docs/docs/imgs/02/ows-standalone/exec-ows-2.png b/docs/imgs/02/ows-standalone/exec-ows-2.png similarity index 100% rename from docs/docs/imgs/02/ows-standalone/exec-ows-2.png rename to docs/imgs/02/ows-standalone/exec-ows-2.png diff --git a/docs/docs/imgs/02/ows-standalone/exec-ows-3.png b/docs/imgs/02/ows-standalone/exec-ows-3.png similarity index 100% rename from docs/docs/imgs/02/ows-standalone/exec-ows-3.png rename to docs/imgs/02/ows-standalone/exec-ows-3.png diff --git a/docs/docs/imgs/02/ows-standalone/exec-ows-4.png b/docs/imgs/02/ows-standalone/exec-ows-4.png similarity index 100% rename from docs/docs/imgs/02/ows-standalone/exec-ows-4.png rename to docs/imgs/02/ows-standalone/exec-ows-4.png diff --git a/docs/docs/imgs/02/ows-standalone/exec-ows-5.png b/docs/imgs/02/ows-standalone/exec-ows-5.png similarity index 100% rename from docs/docs/imgs/02/ows-standalone/exec-ows-5.png rename to docs/imgs/02/ows-standalone/exec-ows-5.png diff --git a/docs/docs/imgs/02/ows-standalone/exec-ows-6.png b/docs/imgs/02/ows-standalone/exec-ows-6.png similarity index 100% rename from docs/docs/imgs/02/ows-standalone/exec-ows-6.png rename to docs/imgs/02/ows-standalone/exec-ows-6.png diff --git a/docs/docs/imgs/02/ows-standalone/exec-ows-7.png b/docs/imgs/02/ows-standalone/exec-ows-7.png similarity index 100% rename from docs/docs/imgs/02/ows-standalone/exec-ows-7.png rename to docs/imgs/02/ows-standalone/exec-ows-7.png diff --git a/docs/docs/imgs/02/ows-standalone/exec-ows-8.png b/docs/imgs/02/ows-standalone/exec-ows-8.png similarity index 100% rename from docs/docs/imgs/02/ows-standalone/exec-ows-8.png rename to docs/imgs/02/ows-standalone/exec-ows-8.png diff --git a/docs/docs/imgs/02/softArch.png b/docs/imgs/02/softArch.png similarity index 100% rename from docs/docs/imgs/02/softArch.png rename to docs/imgs/02/softArch.png diff --git a/docs/docs/imgs/02/telaCamada.png b/docs/imgs/02/telaCamada.png similarity index 100% rename from docs/docs/imgs/02/telaCamada.png rename to docs/imgs/02/telaCamada.png diff --git a/docs/docs/imgs/02/telaCamadas2.png b/docs/imgs/02/telaCamadas2.png similarity index 100% rename from docs/docs/imgs/02/telaCamadas2.png rename to docs/imgs/02/telaCamadas2.png diff --git a/docs/docs/imgs/03/exemplo_bandas.png b/docs/imgs/03/exemplo_bandas.png similarity index 100% rename from docs/docs/imgs/03/exemplo_bandas.png rename to docs/imgs/03/exemplo_bandas.png diff --git a/docs/docs/imgs/03/mer.png b/docs/imgs/03/mer.png similarity index 100% rename from docs/docs/imgs/03/mer.png rename to docs/imgs/03/mer.png diff --git a/docs/docs/imgs/04/campo_2.png b/docs/imgs/04/campo_2.png similarity index 100% rename from docs/docs/imgs/04/campo_2.png rename to docs/imgs/04/campo_2.png diff --git a/docs/docs/imgs/04/campo_tree_folders.png b/docs/imgs/04/campo_tree_folders.png similarity index 100% rename from docs/docs/imgs/04/campo_tree_folders.png rename to docs/imgs/04/campo_tree_folders.png diff --git a/docs/docs/imgs/04/campos_realizados.png b/docs/imgs/04/campos_realizados.png similarity index 100% rename from docs/docs/imgs/04/campos_realizados.png rename to docs/imgs/04/campos_realizados.png diff --git a/docs/docs/imgs/04/dinamica_etapa1.jpg b/docs/imgs/04/dinamica_etapa1.jpg similarity index 100% rename from docs/docs/imgs/04/dinamica_etapa1.jpg rename to docs/imgs/04/dinamica_etapa1.jpg diff --git a/docs/docs/imgs/04/dinamica_etapa2.jpg b/docs/imgs/04/dinamica_etapa2.jpg similarity index 100% rename from docs/docs/imgs/04/dinamica_etapa2.jpg rename to docs/imgs/04/dinamica_etapa2.jpg diff --git a/docs/docs/imgs/04/dinamica_etapa3.jpg b/docs/imgs/04/dinamica_etapa3.jpg similarity index 100% rename from docs/docs/imgs/04/dinamica_etapa3.jpg rename to docs/imgs/04/dinamica_etapa3.jpg diff --git a/docs/docs/imgs/04/dinamica_etapa4.jpg b/docs/imgs/04/dinamica_etapa4.jpg similarity index 100% rename from docs/docs/imgs/04/dinamica_etapa4.jpg rename to docs/imgs/04/dinamica_etapa4.jpg diff --git a/docs/docs/imgs/04/ex_avenzamaps.png b/docs/imgs/04/ex_avenzamaps.png similarity index 100% rename from docs/docs/imgs/04/ex_avenzamaps.png rename to docs/imgs/04/ex_avenzamaps.png diff --git a/docs/docs/imgs/04/ex_dificuldade.png b/docs/imgs/04/ex_dificuldade.png similarity index 100% rename from docs/docs/imgs/04/ex_dificuldade.png rename to docs/imgs/04/ex_dificuldade.png diff --git a/docs/docs/imgs/04/ex_tabelafinal.png b/docs/imgs/04/ex_tabelafinal.png similarity index 100% rename from docs/docs/imgs/04/ex_tabelafinal.png rename to docs/imgs/04/ex_tabelafinal.png diff --git a/docs/docs/imgs/04/ex_trecho.png b/docs/imgs/04/ex_trecho.png similarity index 100% rename from docs/docs/imgs/04/ex_trecho.png rename to docs/imgs/04/ex_trecho.png diff --git a/docs/docs/imgs/04/ex_trecho_detalhe.png b/docs/imgs/04/ex_trecho_detalhe.png similarity index 100% rename from docs/docs/imgs/04/ex_trecho_detalhe.png rename to docs/imgs/04/ex_trecho_detalhe.png diff --git a/docs/docs/imgs/04/ex_tvi.png b/docs/imgs/04/ex_tvi.png similarity index 100% rename from docs/docs/imgs/04/ex_tvi.png rename to docs/imgs/04/ex_tvi.png diff --git a/docs/docs/imgs/04/formula_tam_amostra.png b/docs/imgs/04/formula_tam_amostra.png similarity index 100% rename from docs/docs/imgs/04/formula_tam_amostra.png rename to docs/imgs/04/formula_tam_amostra.png diff --git a/docs/docs/imgs/04/grafico_acuracia.png b/docs/imgs/04/grafico_acuracia.png similarity index 100% rename from docs/docs/imgs/04/grafico_acuracia.png rename to docs/imgs/04/grafico_acuracia.png diff --git a/docs/docs/imgs/04/lista_arquivos_pdf.png b/docs/imgs/04/lista_arquivos_pdf.png similarity index 100% rename from docs/docs/imgs/04/lista_arquivos_pdf.png rename to docs/imgs/04/lista_arquivos_pdf.png diff --git a/docs/docs/imgs/04/prodes19_acc.png b/docs/imgs/04/prodes19_acc.png similarity index 100% rename from docs/docs/imgs/04/prodes19_acc.png rename to docs/imgs/04/prodes19_acc.png diff --git a/docs/docs/imgs/04/ptos_val0019.png b/docs/imgs/04/ptos_val0019.png similarity index 100% rename from docs/docs/imgs/04/ptos_val0019.png rename to docs/imgs/04/ptos_val0019.png diff --git a/docs/docs/imgs/04/tab_acc.png b/docs/imgs/04/tab_acc.png similarity index 100% rename from docs/docs/imgs/04/tab_acc.png rename to docs/imgs/04/tab_acc.png diff --git a/docs/docs/imgs/04/tab_val.png b/docs/imgs/04/tab_val.png similarity index 100% rename from docs/docs/imgs/04/tab_val.png rename to docs/imgs/04/tab_val.png diff --git a/docs/imgs/logos/araticum_banner.jpeg b/docs/imgs/logos/araticum_banner.jpeg new file mode 100644 index 0000000..90d1580 Binary files /dev/null and b/docs/imgs/logos/araticum_banner.jpeg differ diff --git a/docs/imgs/logos/favicon.ico b/docs/imgs/logos/favicon.ico new file mode 100644 index 0000000..6a01283 Binary files /dev/null and b/docs/imgs/logos/favicon.ico differ diff --git a/docs/imgs/logos/icone.png b/docs/imgs/logos/icone.png new file mode 100644 index 0000000..1d8b6ad Binary files /dev/null and b/docs/imgs/logos/icone.png differ diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..636b4c4 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,8 @@ + +![Cerrado DPAT](imgs/logos/araticum_banner.jpeg) + +# Documentação da Plataforma da Rede de Articulação pela Restauração do Cerrado + +A Plataforma da Rede de Articulação pela Restauração do Cerrado (Araticum) é uma ferramenta online criada com o propósito de divulgar os dados referentes às áreas de Restauração da Rede Araticum, que é apoiado pela WWF-Brasil, junto às instituições como o Pacto pela Restauração da Mata Atlântica, Aliança pela Restauração da Amazônia e muitas outras, têm como objetivo acelerar a restauração nos principais biomas do país. Até 2030, o objetivo da instituição é chegar na marca de 12 milhões de hectares estejam restaurados ou em restauração com vegetação nativa, incluindo ecossistemas aquáticos. Desta forma, ``O caminho é fazer as instituições conversarem e fortalecer quem está na ponta'', aponta Thiago Belote, especialista em restauração do WWF-Brasil [link para notícia](https://www.p22on.com.br/2021/06/01/conexoes-em-rede/). + +Essa é a documentação técnica para a plataforma [Araticum](https://araticum.lapig.iesa.ufg.br/), desenvolvida pelo [Laboratório de Processamento de Images e Geoprocessamento da Universidade Federal de Goiás (LAPIG/UFG)](http://www.lapig.iesa.ufg.br) no âmbito da [Rede Araticum] (https://www.instagram.com/rede.araticum/) financiado pelo WWF-Brasil. diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml deleted file mode 100644 index 196a5b5..0000000 --- a/docs/mkdocs.yml +++ /dev/null @@ -1,24 +0,0 @@ -site_name: Documentação - Plataforma da Rede de Articulação pela Restauração do Cerrado -site_author: Luiz Pascoal, Renato Gomes Silvério Tharles de Sousa Andrade - -theme: 'readthedocs' - -nav: - - 'HOME': 'index.md' - - 'Guia do usuário': - - 'Dados Geográficos': '01-guia_dados_geograficos.md' - - 'Métricas de Qualidade': '01-guia_metricas_de_qualidade.md' - - 'Funcionalidades': '01-guia_funcionalidades.md' - - 'Relatórios': '01-guia_relatorios.md' - - - 'Dados': - - 'Vetoriais': '03-dad_vetoriais.md' - - 'Rasters': '03-dad_rasters.md' - - - 'Arquitetura de Software': - - 'Visão geral': '02-arq_geral.md' - - 'Servidor de mapas': '02-arq_servidor_de_mapas.md' - - 'Servidor de aplicação': '02-arq_servidor_de_aplicacao.md' - - 'Deployment da arquitetura do Cerrado DPAT': '02-arq_execucao_dpat.md' - - - 'Métricas de Avaliação': '04-metricas_de_avaliacao.md' diff --git a/docs/docs/pdfs/AGU_Nogueira_et_al.pdf b/docs/pdfs/AGU_Nogueira_et_al.pdf similarity index 100% rename from docs/docs/pdfs/AGU_Nogueira_et_al.pdf rename to docs/pdfs/AGU_Nogueira_et_al.pdf diff --git a/docs/docs/pdfs/AGU_Parente_et_al.pdf b/docs/pdfs/AGU_Parente_et_al.pdf similarity index 100% rename from docs/docs/pdfs/AGU_Parente_et_al.pdf rename to docs/pdfs/AGU_Parente_et_al.pdf diff --git a/docs/docs/sh/clip_landsat.sh b/docs/sh/clip_landsat.sh similarity index 100% rename from docs/docs/sh/clip_landsat.sh rename to docs/sh/clip_landsat.sh diff --git a/docs/docs/sh/run.sh b/docs/sh/run.sh similarity index 100% rename from docs/docs/sh/run.sh rename to docs/sh/run.sh diff --git a/docs/docs/tabs/resultados_acuracia_prodes.xlsx b/docs/tabs/resultados_acuracia_prodes.xlsx similarity index 100% rename from docs/docs/tabs/resultados_acuracia_prodes.xlsx rename to docs/tabs/resultados_acuracia_prodes.xlsx diff --git a/docs/docs/tabs/validacao_classes_prodes_2000-2019.csv b/docs/tabs/validacao_classes_prodes_2000-2019.csv similarity index 100% rename from docs/docs/tabs/validacao_classes_prodes_2000-2019.csv rename to docs/tabs/validacao_classes_prodes_2000-2019.csv diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..5c16dd1 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,131 @@ +site_name: Plataforma da Rede de Articulação pela Restauração do Cerrado +site_url: https://araticum.lapig.iesa.ufg.br/ +site_author: Luiz Pascoal, Renato Gomes Silvério e Tharles de Sousa Andrade +site_description: >- + A Articulação pela Restauração do Cerrado é uma rede colaborativa e multisetorial, que visa atuar + como uma coalizão cujo objetivo é promover a restauração em larga escala do Bioma. + +# Repository +repo_name: lapig-ufg/restauracao-araticum +repo_url: https://github.com/lapig-ufg/restauracao-araticum + +# Copyright +copyright: Copyright © 2022 Araticum - Articulação pela Restauração do Cerrado + +# Configuration +theme: + name: material + + # Static files + static_templates: + - 404.html + + # Don't include MkDocs' JavaScript + include_search_page: false + search_index_only: true + + # Default values, taken from mkdocs_theme.yml + language: pt + features: + - content.code.annotate + # - content.tabs.link + # - header.autohide + # - navigation.expand + - navigation.indexes + # - navigation.instant + - navigation.sections + - navigation.tabs + # - navigation.tabs.sticky + - navigation.top + - navigation.tracking + - search.highlight + - search.share + - search.suggest + - toc.follow + # - toc.integrate + palette: + - scheme: default + primary: teal + accent: blue grey + toggle: + icon: material/toggle-switch + name: Switch to dark mode + - scheme: slate + primary: red + accent: red + toggle: + icon: material/toggle-switch-off-outline + name: Switch to light mode + font: + text: Roboto + code: Roboto Mono + favicon: imgs/logos/favicon.ico + icon: + logo: logo + +# Plugins +plugins: + - search + - minify: + minify_html: true + +# Extensions +markdown_extensions: + - abbr + - admonition + - attr_list + - def_list + - footnotes + - meta + - md_in_html + - toc: + permalink: true + - pymdownx.arithmatex: + generic: true + - pymdownx.betterem: + smart_enable: all + - pymdownx.caret + - pymdownx.details + - pymdownx.emoji: + emoji_generator: !!python/name:materialx.emoji.to_svg + emoji_index: !!python/name:materialx.emoji.twemoji + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.keys + - pymdownx.magiclink: + repo_url_shorthand: true + user: squidfunk + repo: mkdocs-material + - pymdownx.mark + - pymdownx.smartsymbols + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format + - pymdownx.tabbed: + alternate_style: true + - pymdownx.tasklist: + custom_checkbox: true + - pymdownx.tilde + +nav: + - 'HOME': 'index.md' + - 'Guia do usuário': + - 'Dados Geográficos': '01-guia_dados_geograficos.md' + - 'Métricas de Qualidade': '01-guia_metricas_de_qualidade.md' + - 'Funcionalidades': '01-guia_funcionalidades.md' + - 'Relatórios': '01-guia_relatorios.md' + + - 'Dados': + - 'Vetoriais' : '03-dad_vetoriais.md' + - 'Rasters' : '03-dad_rasters.md' + + - 'Arquitetura de Software': + - 'Visão geral' : '02-arq_geral.md' + - 'Servidor de mapas' : '02-arq_servidor_de_mapas.md' + - 'Servidor de aplicação' : '02-arq_servidor_de_aplicacao.md' + - 'Deployment da arquitetura do Cerrado DPAT' : '02-arq_execucao_dpat.md' + + - 'Métricas de Avaliação' : '04-metricas_de_avaliacao.md' diff --git a/qodana.yaml b/qodana.yaml new file mode 100644 index 0000000..b6e742a --- /dev/null +++ b/qodana.yaml @@ -0,0 +1,32 @@ +#-------------------------------------------------------------------------------# +# Qodana analysis is configured by qodana.yaml file # +# https://www.jetbrains.com/help/qodana/qodana-yaml.html # +#-------------------------------------------------------------------------------# +version: "1.0" + +#Specify inspection profile for code analysis +profile: + name: qodana.starter + +#Enable inspections +#include: +# - name: + +#Disable inspections +#exclude: +# - name: +# paths: +# - + +#The following options are only applied in CI/CD environment +#These options are ignored during local run + +#Execute shell command before Qodana execution +#bootstrap: sh ./prepare-qodana.sh + +#Install IDE plugins before Qodana execution +#plugins: +# - id: #(plugin id can be found at https://plugins.jetbrains.com) + +#Specify Qodana linter for analysis +linter: jetbrains/qodana-js:latest diff --git a/src/client/src/app/@core/interceptors/no-cache-headers.interceptor.ts b/src/client/src/app/@core/interceptors/no-cache-headers.interceptor.ts index 49b9f27..9bc32bd 100755 --- a/src/client/src/app/@core/interceptors/no-cache-headers.interceptor.ts +++ b/src/client/src/app/@core/interceptors/no-cache-headers.interceptor.ts @@ -4,8 +4,6 @@ import { Injectable } from '@angular/core'; export class NoCacheHeaders implements HttpInterceptor { intercept(req: HttpRequest, next: HttpHandler) { const authReq = req.clone({ - // Prevent caching in IE, in particular IE11. - // See: https://support.microsoft.com/en-us/help/234067/how-to-prevent-caching-in-internet-explorer setHeaders: { 'Cache-Control': 'no-cache', Pragma: 'no-cache' diff --git a/src/client/src/app/components/general-map/general-map.component.html b/src/client/src/app/components/general-map/general-map.component.html index 9364bd4..2f95163 100644 --- a/src/client/src/app/components/general-map/general-map.component.html +++ b/src/client/src/app/components/general-map/general-map.component.html @@ -2,7 +2,6 @@
- @@ -11,15 +10,11 @@ - - - -
@@ -64,13 +59,13 @@
{{'legend.title' | translate}}
- {{layer.get('key')}}
- {{layer.get('key')}}
diff --git a/src/client/src/app/components/general-map/general-map.component.scss b/src/client/src/app/components/general-map/general-map.component.scss index bbf38da..2273cae 100644 --- a/src/client/src/app/components/general-map/general-map.component.scss +++ b/src/client/src/app/components/general-map/general-map.component.scss @@ -1,8 +1,6 @@ @import "src/app/@core/styles/default_theme"; @import "src/app/@core/styles/reponsive"; - @include media('>=desktop') { - .map-container { height: $height; width: $map-width; @@ -18,16 +16,13 @@ } } - :host ::ng-deep .map { position: relative; - .coordinates { z-index: 101; position: absolute; top: 11px; right: 11px; - .coordinates-container { display: flex; color: black; @@ -38,7 +33,6 @@ justify-content: space-between; align-items: center; box-shadow: 0 11px 15px -7px rgb(0 0 0 / 20%), 0 24px 38px 3px rgb(0 0 0 / 14%), 0 9px 46px 8px rgb(0 0 0 / 12%); - i { color: white; font-size: 18px; @@ -450,8 +444,6 @@ } } } - - .legend-card { position: relative; margin: 6px; @@ -463,14 +455,12 @@ perspective: 800px; transform-style: preserve-3d; } - .abstract, .details { $bg: rgba(white, 1); width: 100%; position: relative; background: $bg; - .group-card:hover & { background: darken($bg, 2%); } @@ -519,15 +509,12 @@ transform-origin: top center; backface-visibility: hidden; transition: .6s ease all; - img { max-width: 82%; } - } .legend-card-active { transition: .6s ease all; - .details { max-height: none; visibility: visible; @@ -537,7 +524,6 @@ .details-inner { padding: 8px; } - .cdk-drag-preview { box-sizing: border-box; border-radius: 4px; @@ -545,23 +531,18 @@ 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12); } - .cdk-drag-placeholder { opacity: 0; } - .cdk-drag-animating { transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); } - .legend-card:last-child { border: none; } - .legend-card.cdk-drop-list-dragging .legend-card-content:not(.cdk-drag-placeholder) { transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); } - .map-loading, .map-loading:before, .map-loading:after { @@ -571,7 +552,6 @@ width: 1em; height: 4em; } - .map-loading { font-size: 10px !important; color: $primary; @@ -587,24 +567,20 @@ left: 50%; z-index: 1001; } - .map-loading:before, .map-loading:after { position: absolute; top: 0; content: ''; } - .map-loading:before { left: -1.5em; -webkit-animation-delay: -0.32s; animation-delay: -0.32s; } - .map-loading:after { left: 1.5em; } - .gallery-btn{ width: 100%; display: flex; diff --git a/src/client/src/app/components/general-map/general-map.component.ts b/src/client/src/app/components/general-map/general-map.component.ts index 4635a12..1445f7b 100644 --- a/src/client/src/app/components/general-map/general-map.component.ts +++ b/src/client/src/app/components/general-map/general-map.component.ts @@ -55,6 +55,8 @@ import turfCentroid from "@turf/centroid"; import { environment } from "../../../environments/environment"; import { GoogleAnalyticsService } from "../services/google-analytics.service"; import { GalleryService } from '../services/gallery.service'; +import MaskFilter from 'ol-ext/filter/Mask'; +import CropFilter from 'ol-ext/filter/Crop'; pdfMake.vfs = pdfFonts.pdfMake.vfs; @Component({ @@ -77,7 +79,7 @@ export class GeneralMapComponent implements OnInit, Ruler, AfterContentChecked { } } - @Input() openMenu = true as boolean; + @Input() openMenu = true as boolean; @Output() onHide = new EventEmitter(); @Output() onMapReadyLeftSideBar = new EventEmitter(); @Output() onSelectLayerSwipe = new EventEmitter(); @@ -154,7 +156,7 @@ export class GeneralMapComponent implements OnInit, Ruler, AfterContentChecked { public highlightStyle: Style; public defaultStyle: Style; public geoJsonStyles: any; - + public maskFilter: MaskFilter public displayGallery: boolean; public gallery = [] as any; public galleryResponsiveOptions: any[] = [ @@ -190,7 +192,7 @@ export class GeneralMapComponent implements OnInit, Ruler, AfterContentChecked { public isMobile: boolean; constructor( - public localizationService: LocalizationService, + public localizationService: LocalizationService, private downloadService: DownloadService, private decimalPipe: DecimalPipe, private cdRef: ChangeDetectorRef, @@ -209,12 +211,12 @@ export class GeneralMapComponent implements OnInit, Ruler, AfterContentChecked { this.loadingDown = false; this.legendExpanded = true; this.displayGallery = false; - + this.maskFilter = null; //IF para identificar quando o caso é mobile. if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|Opera Mini/i.test(navigator.userAgent)) { this.legendExpanded = false; this.isMobile = true; - } else{ + } else { this.isMobile = false; } @@ -258,9 +260,9 @@ export class GeneralMapComponent implements OnInit, Ruler, AfterContentChecked { } this.defaultRegion = { - type: 'country', - text: 'Brasil', - value: 'BRASIL' + type: 'biome', + text: 'Cerrado', + value: 'CERRADO' } this.selectRegion = this.defaultRegion; @@ -300,7 +302,7 @@ export class GeneralMapComponent implements OnInit, Ruler, AfterContentChecked { source: new XYZ({ wrapX: false, url: - 'https://api.mapbox.com/styles/v1/mapbox/light-v10/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw' + 'https://api.mapbox.com/styles/v1/mapbox/light-v10/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoiamFpcm9tciIsImEiOiJjbG0wd253b3MwZHBoM2ptMXg2eWNnZTk0In0.aLY0DcNuQrcpk_mFUHODuw' }), visible: true }) @@ -315,7 +317,7 @@ export class GeneralMapComponent implements OnInit, Ruler, AfterContentChecked { source: new XYZ({ wrapX: false, url: - 'https://api.mapbox.com/styles/v1/mapbox/dark-v10/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw' + 'https://api.mapbox.com/styles/v1/mapbox/dark-v10/tiles/{z}/{x}/{y}?access_token=pk.eyJ1IjoiamFpcm9tciIsImEiOiJjbG0wd253b3MwZHBoM2ptMXg2eWNnZTk0In0.aLY0DcNuQrcpk_mFUHODuw' }), visible: false }) @@ -644,7 +646,7 @@ export class GeneralMapComponent implements OnInit, Ruler, AfterContentChecked { let defaultLayer = ''; this._descriptor.groups.forEach(group => { group.layers.forEach(layer => { - if(layer.visible){ + if (layer.visible) { defaultLayer = layer.selectedType; } }); @@ -727,7 +729,7 @@ export class GeneralMapComponent implements OnInit, Ruler, AfterContentChecked { if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|BB|PlayBook|IEMobile|Windows Phone|Kindle|Silk|Opera Mini/i.test(navigator.userAgent)) { this.legendExpanded = false; this.isMobile = true; - } else{ + } else { this.isMobile = false; } setTimeout(() => { @@ -740,6 +742,7 @@ export class GeneralMapComponent implements OnInit, Ruler, AfterContentChecked { this.map.on('singleclick', (evt) => this.onDisplayFeatureInfo(evt)); this.onMapReadyLeftSideBar.emit(map); this.onMapReadyRightSideBar.emit(map); + this.createCropFilter(); } hideLayers() { @@ -775,6 +778,14 @@ export class GeneralMapComponent implements OnInit, Ruler, AfterContentChecked { let msfilter = '&MSFILTER=' + filters.join(' AND ') + // if(msfilter.includes('true')){ + // msfilter = msfilter.replace('true', " bioma = 'CERRADO'") + // } else if(msfilter.includes('&MSFILTER=1=1 AND true')){ + // msfilter = msfilter.replace('&MSFILTER=1=1 AND true', "&MSFILTER=bioma = 'CERRADO'") + // } else if(msfilter.includes('&MSFILTER=')){ + // msfilter = "&MSFILTER= bioma = 'CERRADO'" + // } + // console.log(msfilter) let layername = layerType!.valueType @@ -916,7 +927,7 @@ export class GeneralMapComponent implements OnInit, Ruler, AfterContentChecked { }) } - updateObjectMapLayers(){ + updateObjectMapLayers() { } @@ -951,7 +962,6 @@ export class GeneralMapComponent implements OnInit, Ruler, AfterContentChecked { }); this.OlLayers[layerType.valueType].setVisible(layerType.visible); - this.handleLayersLegend(layerType); if (this.swiperControl.layers.length > 0) { @@ -2135,8 +2145,21 @@ export class GeneralMapComponent implements OnInit, Ruler, AfterContentChecked { } } - closeDetailsWindow(){ + closeDetailsWindow() { this.controlOptions = !this.controlOptions; this.onCloseDetailsWindow.emit(this.controlOptions); } + + createCropFilter() { + this.mapService.getMask().subscribe(maskGeoJson => { + const features = new GeoJSON().readFeatures(maskGeoJson, { + dataProjection: 'EPSG:4326', + featureProjection: 'EPSG:3857' + }) + this.maskFilter = new MaskFilter({ feature: features[0], inner: false, fill: new Fill({ color: [66, 75, 52, 0.30] }) }) + this.map.getLayers().forEach(layer => { + layer.addFilter(this.maskFilter) + }) + }); + } } diff --git a/src/client/src/app/components/left-side-bar/area/area.component.html b/src/client/src/app/components/left-side-bar/area/area.component.html index f72f145..d2ad1c1 100644 --- a/src/client/src/app/components/left-side-bar/area/area.component.html +++ b/src/client/src/app/components/left-side-bar/area/area.component.html @@ -54,14 +54,47 @@
{{'area.analyzed_area_title' | translate | uppercase}}
- {{'area.analyzed_area_total_area' | translate }} - - {{layerFromConsulta.analyzedArea.shape_upload.area_upload | number:'1.2-2' }} - ha + + + + + + + {{'area.analyzed_area_total_area' | translate }} + {{layerFromConsulta.analyzedArea.shape_upload.area_upload | number:'1.2-2' }}ha + +
+ +
+
+ {{'area.araticum.projects' | translate}} +
+ + + + Projects + Restoration Area + Methods + + + + + {{project.projeto}} + {{project.area_restaurada | number:'1.2-2' }} + ha + {{project.metodo_padrao.join(', ')}} + + + +
+
+ {{'area.araticum.initiatives' | translate}} +
+

+ {{layerFromConsulta.araticumProjects.initiatives.join(', ')}} +

+
- {{'area.analyzed_area_total_area' | translate }} - - {{layerFromUpload.analyzedArea.shape_upload.area_upload | number:'1.2-2' }} - ha + + + + + + + {{'area.analyzed_area_total_area' | translate }} + {{layerFromUpload.analyzedArea.shape_upload.area_upload | number:'1.2-2' }}ha + +
+
+
+ {{'area.araticum.projects' | translate}} +
+ + + + Projects + Restoration Area + Methods + + + + + {{project.projeto}} + {{project.area_restaurada | number:'1.2-2' }} + ha + {{project.metodo_padrao.join(', ')}} + + + +
+
+ {{'area.araticum.initiatives' | translate}} +
+

+ {{layerFromUpload.araticumProjects.initiatives.join(', ')}} +

+
-
diff --git a/src/client/src/app/components/left-side-bar/area/area.component.scss b/src/client/src/app/components/left-side-bar/area/area.component.scss index 9e16563..666b18e 100644 --- a/src/client/src/app/components/left-side-bar/area/area.component.scss +++ b/src/client/src/app/components/left-side-bar/area/area.component.scss @@ -26,6 +26,7 @@ padding-left: 20px; } .upload-token { + padding-top: 10px; padding-bottom: 10px; text-align: center; } diff --git a/src/client/src/app/components/left-side-bar/area/area.component.ts b/src/client/src/app/components/left-side-bar/area/area.component.ts index 3f66636..12851bd 100644 --- a/src/client/src/app/components/left-side-bar/area/area.component.ts +++ b/src/client/src/app/components/left-side-bar/area/area.component.ts @@ -11,11 +11,16 @@ import VectorLayer from 'ol/layer/Vector'; import Style from 'ol/style/Style'; import VectorSource from 'ol/source/Vector'; import Stroke from 'ol/style/Stroke'; - +import { environment } from "../../../../environments/environment"; import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http'; import { AreaService } from '../../services/area.service'; import { Descriptor } from "../../../@core/interfaces"; import { GoogleAnalyticsService } from '../../services/google-analytics.service'; +import { LocalizationService } from 'src/app/@core/internationalization/localization.service'; +import pdfMake from 'pdfmake/build/pdfmake'; +import pdfFonts from 'pdfmake/build/vfs_fonts'; +pdfMake.vfs = pdfFonts.pdfMake.vfs; + @Component({ @@ -74,16 +79,12 @@ export class AreaComponent implements OnInit { // Nas demais deve-se criar o controle para cada análise. public isPromiseFinished = { areainfo: false, - // desmatperyear: false, - // car: false, - // terraclass: false, - // focos: false, - // queimadas: false + projectsAraticum: false }; selectedIndexUpload: number; - constructor(private areaService: AreaService, private googleAnalyticsService: GoogleAnalyticsService) { + constructor(private areaService: AreaService, public localizationService: LocalizationService, private googleAnalyticsService: GoogleAnalyticsService) { this.httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) }; @@ -201,14 +202,88 @@ export class AreaComponent implements OnInit { } - async printRegionsIdentification(token) { - console.log("TO DO") + printRegionsIdentification(token) { + let dd = { + pageSize: { width: 400, height: 400 }, + + // by default we use portrait, you can change it to landscape if you wish + pageOrientation: 'portrait', + + content: [], + styles: { + titleReport: { + fontSize: 16, + bold: true + }, + textFooter: { + fontSize: 9 + }, + textImglegend: { + fontSize: 9 + }, + header: { + fontSize: 18, + bold: true, + margin: [0, 0, 0, 10] + }, + data: { + bold: true, + }, + subheader: { + fontSize: 16, + bold: true, + margin: [0, 10, 0, 5] + }, + codCar: { + fontSize: 11, + bold: true, + }, + textObs: { + fontSize: 11, + }, + tableDpat: { + margin: [0, 5, 0, 15], + fontSize: 11, + }, + tableHeader: { + bold: true, + fontSize: 13, + color: 'black' + }, + token: { + bold: true, + fontSize: 16, + }, + metadata: { + background: '#0b4e26', + color: '#fff' + } + } + } + + // @ts-ignore + dd.content.push({ image: this.localizationService.translate('area.token.logo'), width: 50, alignment: 'center' }); + // @ts-ignore + dd.content.push({ text: this.localizationService.translate('area.token.description'), alignment: 'center', margin: [10, 10, 20, 0] }); + // @ts-ignore + dd.content.push({ text: token, alignment: 'center', style: 'token', margin: [20, 20, 20, 10] }); + + // @ts-ignore + dd.content.push({ qr: token.toString(), fit: '200', alignment: 'center' }); + + const filename = this.localizationService.translate('area.token.title') + ' - ' + token + '.pdf' + // const win = window.open('', '_blank'); + // pdfMake.createPdf(dd).open({}, win); + pdfMake.createPdf(dd).download(filename); + + this.googleAnalyticsService.eventEmitter("Print_Identification_Token_Layer", "Upload", "uploadLayer"); } analyzeUploadShape(fromConsulta = false) { this.isPromiseFinished = { - areainfo: false + areainfo: false, + projectsAraticum: false }; let params: string[] = []; @@ -223,11 +298,12 @@ export class AreaComponent implements OnInit { } this.doAnalysisAreaInfo(fromConsulta, params) //Trigger Analysis AreaInfo - + this.doAnalysisAraticumProjects(fromConsulta, params) //Trigger Analysis AraticumProjects } async doAnalysisAreaInfo(fromConsulta, params) { let self = this; + let analiseName = 'areainfo' if (fromConsulta) { this.layerFromConsulta.analyzedAreaLoading = true; // criar um loading para cada análise, para controlar a abertura do card. @@ -239,7 +315,7 @@ export class AreaComponent implements OnInit { this.layerFromConsulta.analyzedArea = result; this.layerFromConsulta.analyzedAreaLoading = false; - this.checkIfAllPromiseAreDone(fromConsulta, 'areainfo') + this.checkIfAllPromiseAreDone(fromConsulta, analiseName ) } catch (err) { self.layerFromConsulta.analyzedAreaLoading = false; @@ -256,7 +332,50 @@ export class AreaComponent implements OnInit { this.layerFromUpload.analyzedArea = result; this.layerFromUpload.analyzedAreaLoading = false; - this.checkIfAllPromiseAreDone(fromConsulta, 'areainfo') + this.checkIfAllPromiseAreDone(fromConsulta, analiseName) + } catch (err) { + self.layerFromUpload.analyzedAreaLoading = false; + self.layerFromUpload.error = true; + } + + } + + } + + async doAnalysisAraticumProjects(fromConsulta, params) { + let self = this; + let analiseName = 'araticumProjects' + + if (fromConsulta) { + this.layerFromConsulta.analyzedAreaLoading = true; // criar um loading para cada análise, para controlar a abertura do card. + this.layerFromConsulta.error = false; + + try { + + let result = await this.areaService.analysisAraticumProjects(params.join('&')).toPromise() + this.layerFromConsulta[analiseName] = result; + this.layerFromConsulta.analyzedAreaLoading = false; + + this.checkIfAllPromiseAreDone(fromConsulta, analiseName) + + } catch (err) { + self.layerFromConsulta.analyzedAreaLoading = false; + self.layerFromConsulta.error = true; + } + + // console.log(this.layerFromConsulta) + + } else { + this.layerFromUpload.analyzedAreaLoading = true; + + this.layerFromUpload.error = false; + + try { + let result = await this.areaService.analysisAraticumProjects(params.join('&')).toPromise() + this.layerFromUpload[analiseName] = result; + this.layerFromUpload.analyzedAreaLoading = false; + + this.checkIfAllPromiseAreDone(fromConsulta, analiseName) } catch (err) { self.layerFromUpload.analyzedAreaLoading = false; self.layerFromUpload.error = true; @@ -264,6 +383,8 @@ export class AreaComponent implements OnInit { } + + } clearUpload(fromConsulta = false) { @@ -373,12 +494,10 @@ export class AreaComponent implements OnInit { if (done) { if (fromConsulta) { - let dados = { token: this.layerFromConsulta.token, analysis: this.layerFromConsulta.analyzedArea } - this.saveCompleteAnalysis(dados) } else { @@ -409,6 +528,8 @@ export class AreaComponent implements OnInit { let params: string[] = [] params.push('token=' + this.layerFromConsulta.token) + params.push('origin=' + environment.APP) + params.push('lang=' + this.localizationService.currentLang()) try { diff --git a/src/client/src/app/components/left-side-bar/left-side-bar.component.html b/src/client/src/app/components/left-side-bar/left-side-bar.component.html index fc334e3..6c2d5f5 100644 --- a/src/client/src/app/components/left-side-bar/left-side-bar.component.html +++ b/src/client/src/app/components/left-side-bar/left-side-bar.component.html @@ -57,7 +57,7 @@

{{ layersTitle }} -
{{group.labelGroup}}
+
{{ layersTitle }} -
{{layer.labelLayer}}
+

@@ -206,8 +206,11 @@
{{layer.labelLayer}}
+ +

+
diff --git a/src/client/src/app/components/left-side-bar/left-side-bar.component.ts b/src/client/src/app/components/left-side-bar/left-side-bar.component.ts index 960fb63..9049ded 100644 --- a/src/client/src/app/components/left-side-bar/left-side-bar.component.ts +++ b/src/client/src/app/components/left-side-bar/left-side-bar.component.ts @@ -525,5 +525,9 @@ export class LeftSideBarComponent implements AfterViewInit { let bodyStyles = window.getComputedStyle(document.body); return bodyStyles.getPropertyValue('--' + name).trim(); } + isHtmlString(str: string): boolean { + const doc = new DOMParser().parseFromString(str, 'text/html'); + return Array.from(doc.body.childNodes).some(node => node.nodeType === 1); + } } diff --git a/src/client/src/app/components/main/main.component.html b/src/client/src/app/components/main/main.component.html index 3b4c17f..2a8669e 100644 --- a/src/client/src/app/components/main/main.component.html +++ b/src/client/src/app/components/main/main.component.html @@ -1,4 +1,5 @@
+
+

+

+

+

- {{'wellcome.p1' | translate}} + {{'wellcome.p5' | translate}} + {{'terms.view' | translate}}

-

+ +
+

+

+

+

+

+

+

+

+

+

+

+

+
+
+ {{'right_sidebar.title' | translate}}--> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

{{'right_sidebar.title' | translate}}

- - -
{{selectRegion.text}}
@@ -19,13 +262,10 @@
{{selectRegion.text}}
{{'right_sidebar.cards_titles.resumoTitle' | translate}}
-
-
- -
+
{{'right_sidebar.region_types.'+selectRegion.type | translate}}
{{selectRegion.text}}
@@ -36,13 +276,15 @@
{{selectRegion.text}}
{{'right_sidebar.resumo_card.area_pastagem' | translate}}
-
{{infoResumo.pasture.area | number:'1.2-3' }} ha ({{infoResumo.pasture.percentOfRegionArea}} +
{{infoResumo.restoration.area | number:'1.2-3' }} ha + ({{infoResumo.restoration.percentOfRegionArea}} {{'right_sidebar.resumo_card.complement_text' | translate}} {{selectRegion.text}})
-
+
Obs.
-
+
+
- -
@@ -70,14 +311,13 @@
{{selectRegion.text}}
{{'right_sidebar.cards_titles.area1Title' | translate}}
-
- +
@@ -95,12 +335,9 @@

{{chart.text}}

-
- -
@@ -111,7 +348,7 @@

{{chart.text}}

-
+
@@ -136,7 +373,6 @@

{{chart.text}}

-
@@ -147,7 +383,7 @@

{{chart.text}}

-
+
@@ -172,7 +408,6 @@

{{chart.text}}

-
@@ -188,28 +423,20 @@

{{chart.text}}

-
- - - +
- - @@ -234,7 +459,6 @@

{{chart.text}}

- diff --git a/src/client/src/app/components/right-side-bar/mobile/right-side-bar-mobile.component.scss b/src/client/src/app/components/right-side-bar/mobile/right-side-bar-mobile.component.scss index 2f4ee52..8be1801 100644 --- a/src/client/src/app/components/right-side-bar/mobile/right-side-bar-mobile.component.scss +++ b/src/client/src/app/components/right-side-bar/mobile/right-side-bar-mobile.component.scss @@ -1,29 +1,30 @@ @import "../right-side-bar.component.scss"; -@include media('>=phone' , '<=desktop') { -.layer-card-header { - padding:10px; - } - - :host ::ng-deep p-paginator .p-dropdown{ - height:2rem; - width:70px; - top:-480px !important; - left:90px; - display:none !important; - } - .graphicTitle{ - position:unset !important; - } - .details-inner{ - display:inline !important; - } - .matButton{ - display:none; - } - .hide{ - display:none; - } +@include media('>=phone', '<=desktop') { + .layer-card-header { + background: lighten($primary, 60%); + border-radius: 5px; + padding: 10px; + } + :host ::ng-deep p-paginator .p-dropdown { + height: 2rem; + width: 70px; + top: -480px !important; + left: 90px; + display: none !important; + } + .graphicTitle { + position: unset !important; + } + .details-inner { + display: inline !important; + } + .matButton { + display: none; + } + .hide { + display: none; + } // :host ::ng-deep .p-paginator .p-dropdown .p-dropdown-label{ // font-size:9px; // margin:0; @@ -43,14 +44,17 @@ // min-width:43px; // } - .layer-merge{ - margin-bottom:11px;margin-top:10px;margin-left:5px;margin-right:5px; + .layer-merge { + margin-bottom: 11px; + margin-top: 10px; + margin-left: 5px; + margin-right: 5px; } .layer-card-header { background: lighten($primary, 60%); - border-radius:5px; - padding:0px; + border-radius: 5px; + padding: 10px; h5 { @@ -70,121 +74,121 @@ border-radius: 5px; } - .margin{ - margin-bottom:15px; + .margin { + margin-bottom: 15px; } - .divReportButton{ - display:inline; - width:90% !important; - text-align:center; + .divReportButton { + display: inline; + width: 90% !important; + text-align: center; } - .reportButton{ + .reportButton { - font-size:19px; + font-size: 19px; } - .inline{ - display:inline; + .inline { + display: inline; } - .myIcon{ - position:absolute; - display:inline; - margin-top:-200px; + .myIcon { + position: absolute; + display: inline; + margin-top: -200px; } :host ::ng-deep .p-tabview-panels { - padding:5px; - margin:0px; + padding: 5px; + margin: 0px; } :host ::ng-deep .p-paginator { //display:grid !important; justify-content: center; flex-wrap: wrap; - font-size:8px; + font-size: 8px; } - :host ::ng-deep p-paginator .p-dropdown{ - height:2rem; + :host ::ng-deep p-paginator .p-dropdown { + height: 2rem; } - :host ::ng-deep .p-paginator .p-dropdown .p-dropdown-label{ - font-size:14px; - margin:0; - padding:7px; + :host ::ng-deep .p-paginator .p-dropdown .p-dropdown-label { + font-size: 14px; + margin: 0; + padding: 7px; } :host ::ng-deep .p-paginator .p-paginator-last { - font-size:12px !important; + font-size: 12px !important; } :host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page { - font-size:15px !important; + font-size: 15px !important; height: 2rem; - margin:1px !important; - min-width:4px !important; + margin: 1px !important; + min-width: 4px !important; } - :host ::ng-deep .p-paginator .p-paginator-next{ - min-width:4px !important; + :host ::ng-deep .p-paginator .p-paginator-next { + min-width: 4px !important; } - :host ::ng-deep .p-paginator .p-paginator-prev{ - min-width:4px !important; + :host ::ng-deep .p-paginator .p-paginator-prev { + min-width: 4px !important; } - :host ::ng-deep .p-paginator .p-paginator-first{ - min-width:4px !important; + :host ::ng-deep .p-paginator .p-paginator-first { + min-width: 4px !important; } - :host ::ng-deep .p-paginator .p-paginator-last{ - min-width:4px !important; + :host ::ng-deep .p-paginator .p-paginator-last { + min-width: 4px !important; } :host ::ng-deep .p-paginator-left-content { - display:none; + display: none; } - :host ::ng-deep .p-paginator-right-content{ - display:none; + :host ::ng-deep .p-paginator-right-content { + display: none; } - :host ::ng-deep .p-datatable .p-datatable-tbody > td{ + :host ::ng-deep .p-datatable .p-datatable-tbody > td { - font-size:11px; + font-size: 11px; } - :host ::ng-deep .p-datatable .p-datatable-tbody > tr{ + :host ::ng-deep .p-datatable .p-datatable-tbody > tr { - font-size:11px; + font-size: 11px; } - :host ::ng-deep .p-paginator .p-paginator-current{ + :host ::ng-deep .p-paginator .p-paginator-current { height: 1.5rem; - font-size:13px; - width:100%; + font-size: 13px; + width: 100%; margin: unset; padding: unset; } - :host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page.p-highlight { - background: unset; - color: $primary; - } + :host ::ng-deep .p-paginator .p-paginator-pages .p-paginator-page.p-highlight { + background: unset; + color: $primary; + } - :host ::ng-deep .p-datatable .p-datatable-thead > tr > th{ - font-size:11px; + :host ::ng-deep .p-datatable .p-datatable-thead > tr > th { + font-size: 11px; } - :host ::ng-deep .p-sidebar-right{ - width:321px; + :host ::ng-deep .p-sidebar-right { + width: 321px; border: none; } .group-card { @@ -272,6 +276,7 @@ transition: .6s ease all; //border: 1px solid $primary; transform: scale(1.0); + .details { max-height: none; overflow: visible; @@ -280,49 +285,51 @@ } } - .details-inner{ + .details-inner { padding: 8px; } .layer-card { - box-shadow: 0 .25rem .25rem rgba(0,0,0,0.2), 0 0 1rem rgba(0,0,0,0.2); + box-shadow: 0 .25rem .25rem rgba(0, 0, 0, 0.2), 0 0 1rem rgba(0, 0, 0, 0.2); border-radius: 5px; + & * { font-size: 0.9rem; } } - :host ::ng-deep .p-sidebar-header{ - // background-color: $primary; + :host ::ng-deep .p-sidebar-header { + // background-color: $primary; } - :host ::ng-deep .p-sidebar-content{ - // background-color: $primary; + :host ::ng-deep .p-sidebar-content { + // background-color: $primary; } - :host ::ng-deep .p-sidebar-close-icon{ - // color:white; + :host ::ng-deep .p-sidebar-close-icon { + // color:white; } //alterando posição botão close rightsidebar :host ::ng-deep .p-sidebar-close { position: absolute; - top:0px; right:0; -} + top: 0px; + right: 0; + } //tamanho do scroll horizontal da tabela :host ::ng-deep ::-webkit-scrollbar { - height:8px !important; + height: 8px !important; } .chart-region { width: 100%; text-align: center; font-size: 16px; - padding:10px; + padding: 10px; color: #070606; } .title-region { - padding:10px; + padding: 10px; width: 100%; font-size: 36pt; @@ -337,70 +344,71 @@ color: #f7f3f3; } - .title-section{ - font-size:30px; - font-family:Arial, Helvetica, sans-serif; - width:100%; - } - .legend{ - position: fixed; - top: 45%; - right: -31px; - border: 0; - padding: 5px 12px; - font-size: 15px; - color: white; - background: $primary; - border-radius: 15px 15px 0 0; - z-index: 9; - transform: rotate(-90deg); - transition: all .5s ease; - cursor: pointer; - &:hover{ - color: $primary; - background: white ; - } + .title-section { + font-size: 30px; + font-family: Arial, Helvetica, sans-serif; + width: 100%; + } + .legend { + position: fixed; + top: 45%; + right: -31px; + border: 0; + padding: 5px 12px; + font-size: 15px; + color: white; + background: $primary; + border-radius: 15px 15px 0 0; + z-index: 9; + transform: rotate(-90deg); + transition: all .5s ease; + cursor: pointer; + &:hover { + color: $primary; + background: white; } - //Legendas - .yellow { - background-color:yellow; - } - .green { - background-color: rgb(68, 238, 68); - } - .orange { - background-color: orange; - } - //Fim legendas + } - //Switchs Buttons - .inlineSwitchButton{ - display: inline; - } - //End Switchs buttons + //Legendas + .yellow { + background-color: yellow; + } + .green { + background-color: rgb(68, 238, 68); + } + .orange { + background-color: orange; + } + //Fim legendas + //Switchs Buttons + .inlineSwitchButton { + display: inline; + } + //End Switchs buttons - :host ::ng-deep .tabview-custom { - i, span { - vertical-align: middle; - } - span { - margin: 0 .5rem; - } + :host ::ng-deep .tabview-custom { + i, span { + vertical-align: middle; } + span { + margin: 0 .5rem; + } + } + - :host ::ng-deep .p-tabview-nav-link { - -moz-box-shadow: none !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; + :host ::ng-deep .p-tabview-nav-link { + -moz-box-shadow: none !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; - /* background: lighten($primary, 10%) !important; - color:white !important; - outline-color:white !important;*/ + /* background: lighten($primary, 10%) !important; + color:white !important; + outline-color:white !important;*/ /*outline-color: transparent; outline-style: none; @@ -409,26 +417,29 @@ box-shadow: 0 0 0 0 !important; border:none !important; border-right: none !important; */ - } - + } - .toggle{ - padding: 10px; - } + .toggle { + padding: 10px; + } -/* :host ::ng-deep .p-tabview-nav { - background: lighten($primary, 10%) !important; -} + /* :host ::ng-deep .p-tabview-nav { + background: lighten($primary, 10%) !important; + } -:host ::ng-deep .p-tabview-panels { - background: lighten($primary, 10%) !important; -} -*/ - .resumo-container-mobile{ - .resumo-card{ + :host ::ng-deep .p-tabview-panels { + background: lighten($primary, 10%) !important; + } + */ + .resumo-container { + margin: unset; + } + .resumo-container-mobile { + .resumo-card { margin: 14px; } } } + diff --git a/src/client/src/app/components/right-side-bar/right-side-bar.component.html b/src/client/src/app/components/right-side-bar/right-side-bar.component.html index ef0491a..3ca3989 100644 --- a/src/client/src/app/components/right-side-bar/right-side-bar.component.html +++ b/src/client/src/app/components/right-side-bar/right-side-bar.component.html @@ -31,11 +31,11 @@
{{selectRegion.text}}
{{'right_sidebar.resumo_card.area_pastagem' | translate}}
-
{{infoResumo.pasture.area | number:'1.2-3' }} ha - ({{infoResumo.pasture.percentOfRegionArea}} +
{{infoResumo.restoration.area | number:'1.2-3' }} ha + ({{infoResumo.restoration.percentOfRegionArea}} {{'right_sidebar.resumo_card.complement_text' | translate}} {{selectRegion.text}})
-
+
Obs.
diff --git a/src/client/src/app/components/right-side-bar/right-side-bar.component.ts b/src/client/src/app/components/right-side-bar/right-side-bar.component.ts index 5218bca..9cc893b 100644 --- a/src/client/src/app/components/right-side-bar/right-side-bar.component.ts +++ b/src/client/src/app/components/right-side-bar/right-side-bar.component.ts @@ -38,6 +38,7 @@ export class RightSideBarComponent implements OnInit { + @Input() set displayOptions(value: boolean) { this.onSideBarToggle.emit(value); this._displayOptions = value; @@ -62,6 +63,7 @@ export class RightSideBarComponent implements OnInit { public infoResumo: any; //Charts Variables + public defaultRegion: any; public selectRegion: any; public objectFullScreenChart: any = {}; @@ -112,13 +114,15 @@ export class RightSideBarComponent implements OnInit { this.displayDashboard = false; this.chartObject = {}; - - this.selectRegion = { - type: 'country', - text: 'BRASIL', - value: 'Brasil' + this.defaultRegion = { + type: 'biome', + text: 'Cerrado', + value: 'CERRADO' }; + + this.selectRegion = this.defaultRegion; + this.filterSelectedOnLayersForStatistics = "year=2020" @@ -134,7 +138,7 @@ export class RightSideBarComponent implements OnInit { this.cardsToDisplay = { resumo: true, - area1: true, + area1: false, area2: true, area3: false, rankingTable: true @@ -257,17 +261,25 @@ export class RightSideBarComponent implements OnInit { if (region) { this.selectRegion = region; } else { - this.selectRegion = { - type: 'country', - text: 'BRASIL', - value: 'Brasil' - }; + this.selectRegion = this.defaultRegion; + } + + + if (this.cardsToDisplay.resumo) { + this.updateResumo(); + } + if (this.cardsToDisplay.area1) { + this.updateArea1Charts() + } + if (this.cardsToDisplay.area2) { + this.updateArea2Charts() + } + if (this.cardsToDisplay.area3) { + this.updateArea3Charts(); + } + if (this.cardsToDisplay.rankingTable) { + this.updateAreaTable(); } - this.updateResumo(); - this.updateArea1Charts(); - this.updateArea2Charts(); - // this.updateArea3Charts(); - this.updateAreaTable(); } diff --git a/src/client/src/app/components/services/area.service.ts b/src/client/src/app/components/services/area.service.ts index 8008f42..638caf2 100644 --- a/src/client/src/app/components/services/area.service.ts +++ b/src/client/src/app/components/services/area.service.ts @@ -33,6 +33,13 @@ export class AreaService { .pipe(catchError(this.errorHandler)); } + analysisAraticumProjects(params): Observable { + + return this.httpClient.get(this.apiURL + '/analysisaraticum?' + params, this.httpOptions) + .pipe(map(response => response)) + .pipe(catchError(this.errorHandler)); + } + getSavedAnalysis(params): Observable { return this.httpClient.get(this.apiURL + '/getanalysis?' + params, this.httpOptions) diff --git a/src/client/src/app/components/services/map.service.ts b/src/client/src/app/components/services/map.service.ts index b4d4221..9864c26 100644 --- a/src/client/src/app/components/services/map.service.ts +++ b/src/client/src/app/components/services/map.service.ts @@ -107,6 +107,14 @@ export class MapService { .pipe(catchError(this.errorHandler)); } + getMask(): Observable { + const url: string = `/service/map/extent?format=json&key=CERRADO&type=biome` + return this.httpClient.get(url) + .pipe(map(response => response)) + .pipe(catchError(this.errorHandler), + ); + } + errorHandler(error) { let errorMessage = ''; if (error.error instanceof ErrorEvent) { diff --git a/src/client/src/assets/locales/en.json b/src/client/src/assets/locales/en.json index 2728ed3..14e0c21 100644 --- a/src/client/src/assets/locales/en.json +++ b/src/client/src/assets/locales/en.json @@ -99,6 +99,10 @@ "logo": "data:image/png;base64,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", "title": "Identification of the geometry Submitted", "description": "Access token of the geometry submitted on the platform." + }, + "araticum": { + "projects": "Restoration iniciatives that intersect with the submitted area", + "initiatives": "Restoration initiatives that intersect with the submitted area" } }, "legend": { @@ -214,28 +218,34 @@ }, "descriptor_labels": { "groups": { - "agropecuaria": { - "labelGroup": "Agriculture and Livestock", + "reflorestamento": { + "labelGroup": "Reforestation", "layers": { - "agricultura": { - "labelLayer": "Agriculture" - }, - "pecuaria_censitaria": { - "labelLayer": "Census Livestock - IBGE" - }, "floresta_plantada": { "labelLayer": "Planted Forest - Mapbiomas" - }, - "lavoura_mapbiomas": { - "labelLayer": "Crops - Mapbiomas" } } }, - "reflorestamento": { - "labelGroup": "Reforestation", + "climate_adaptation": { + "labelGroup": "Climate adaptation" + }, + "regeneration_potential": { + "labelGroup": "Regeneration potential", + "layers": { + "regeneration_potential": { + "labelLayer": "Regeneration potential of native vegetation in cultivated pastures of the Cerrado" + } + } + + }, + "restauracao": { + "labelGroup": "Restoration", "layers": { - "reflorestamento_araticum": { + "restauracao_araticum": { "labelLayer": "Araticum" + }, + "projetos_araticum": { + "labelLayer": "Araticum Iniciatives" } } }, @@ -355,7 +365,7 @@ "area1Title": "Timeseries", "area2Title": "Proportional Analysis", "area3Title": "Bar Charts", - "areaTableTitle": "Pasture Area Rankings" + "areaTableTitle": "Restoration Area Rankings" }, "region_types": { "city": "City", @@ -366,13 +376,13 @@ }, "resumo_card": { "area_region": "Region Area", - "area_pastagem": "Pasture Area (ha)", + "area_pastagem": "Restoration Area (ha)", "classe_pasture_quality": "Class", "area_classe_pasture_quality": "Area of this Degradation Class", "complement_text": "of", "pasture_quality_title": "Pasture Quality", "complement_text_pasture_quality": "in Pasture Area of", - "obs_text": "*The difference between the pasture area presented here and the mapped area is explained by the area adjustment from the accuracy analysis, detailed in Parente et al. 2019 ( https://doi.org/10.1016/j.rse.2019.111301)", + "obs_text": "ARATICUM - Organization for environmental preservation - Collaborative and Multisectoral Network for the large-scale restoration of the Cerrado biome. (Click here!)", "pasture_quality": { "Severa": "Severe", "Intermediário": "Intermediary", @@ -381,16 +391,16 @@ }, "area1_card": { "pastureAndLotacaoBovina": { - "title": "Pasture", - "text": "According to LAPIG, the Pasture area (in hectares) and the Bovine Stocking (in UA) in the #typeRegionTranslate# #textRegionTranslate# was:", + "title": "Title Area 1", + "text": "Any text with Regex #typeRegionTranslate# #textRegionTranslate# was:", "labelOfQuery": { "pasture": "Pasture", "lotacao_bovina_regions": "Bovine Stocking" } }, "pastureQuality": { - "title": "Pasture Quality", - "text": "According to LAPIG, over the years, the #typeRegionTranslate# #textRegionTranslate# divided its pasture area among the following pasture degradation classes", + "title": "2nd timeseries", + "text": "Qualquer texto podendo ter um regex com: #typeRegionTranslate# #textRegionTranslate# foi de:", "labelOfQuery": { "pasture_quality": { "Severa": "Severe", @@ -401,46 +411,15 @@ } }, "area2_card": { - "uso_solo_terraclass": { - "text": "According to the Terraclass Cerrado project, the #textRegionTranslate# #typeRegionTranslate# has a total area of #areaMun# ha, distribuited between the followind land uses:", - "Mosaíco de Ocupações": "Occupations Mosaic", - "Agricultura Perene": "Perennial Agriculture", - "Natural Não Vegetado": "Non-Vegetated Natural", - "Água": "Water", - "Silvicultura": "Silviculture", - "Solo Exposto": "Exposed Soil", - "Não Observado": "Not Observed", - "Pastagem": "Pasture", - "Agricultura Anual": "Annual Agriculture", - "Outros": "Others", - "Urbano": "Urban", - "Mineração": "Mining", - "Natural": "Natural" - }, - "uso_solo_probio": { - "text": "According to the PROBIO Cerrado project, the #textRegionTranslate# #typeRegionTranslate# has a total area of #areaMun# ha, distribuited between the followind land uses:", - "Reflorestamento": "Reforestation", - "Savana": "Savanna", - "Água": "Water", - "Savana Estépica": "Steppe Savanna", - "Floresta Estacional Semi-decidual": "Seasonal Semideciduous Forest", - "Floresta Ombrófila Densa": "Dense Ombrophilous Forest", - "Floresta Estacional Decidual": "Deciduous Seasonal Forest", - "Floresta Ombrófila Aberta": "Open Ombrophilous Forest", - "Influência Urbana": "Urban Influence", - "Pecuária": "Livestock", - "Vegetação Secundária": "Secondary Vegetation", - "Formações Pioneiras": "Pioneer Formations", - "Agricultura": "Agriculture" - }, - "pastureQualityPerYear": { - "title": "Pasture Quality", - "text": "According to LAPIG, in the year of #yearTranslate#, the #typeRegionTranslate# #textRegionTranslate# possess a total of #areaPasture# ha of Pasture Area, distribuited among the following Pasture Degradation Classes:", + "araticumRestoration": { + "title": "Restoration Area per Applied Method", + "text": "Projects and/or Iniciatives linked to the Araticum Network declare a Restoration area equivalent to the #areaRestoration# ha distributed among these restoration methods:", "labelOfQuery": { - "pasture_quality": { - "Severa": "Severe", - "Intermediário": "Intermediary", - "Ausente": "Absent" + "areaRestorationPerProject": { + "CEDAC": "Fortalecer Cadeias Sociobioprodutivas em Rede Baseadas no uso Sustentavel do Cerrado", + "CCA": "Reward Program for Conscious Producers - Restoring Ecosystem Services in the Cerrado", + "Cooperagrofamiliar": "Food Products from the Forests in the Cerrado, Brazil", + "Aerolevantamento por veículo não tripilado DRONE": "Agroflorestas Prestadoras de Serviços Ecossistêmicos" } } } @@ -455,29 +434,13 @@ } }, "area_table_card": { - "pastureRankingsCities": { - "title": "Municipalities", - "text": "Municipalities Ranking according to their Pasture Area (in ha)", + "araticumRestorationRankingsProjects": { + "title": "Iniciatives", + "text": "Project Rankings according to the Restoration area (in ha)", "labelOfQuery": { - "municipios": "Municipalities" + "projetos": "Iniciatives" }, - "columnsTitle": "#?Municipality?UF?Area (ha)" - }, - "pastureRankingsStates": { - "title": "States", - "text": "States Ranking according to their Pasture Area (in ha)", - "labelOfQuery": { - "estados": "States" - }, - "columnsTitle": "#?UF?Area (ha)" - }, - "pastureRankingsBiomes": { - "title": "Biomes", - "text": "Biomes Ranking according to their Pasture Area (em ha)", - "labelOfQuery": { - "biomas": "Biomes" - }, - "columnsTitle": "#?Biome?Area (ha)" + "columnsTitle": "#?Iniciative?Source?Area (ha)" } }, "area_table_card_auxiliar": { @@ -721,8 +684,29 @@ "videos_drone": "Drone Videos" }, "wellcome": { - "title": "Welcome Notification", - "p1": "Welcome to the Data Integration Module for Ecological Restoration and Reforestation in the Cerrado Biome. Our objective is to present the status of restoration actions in the Cerrado, providing consultation, visualization and analysis at the municipal, state and hydrographic basin levels, in the form of maps and graphics, as well as the export of information in the form of vector files and tables.", - "p2": "This module, integrated into the Cerrado Knowledge Platform, was financed by the WWF Brasil and had partnerships with the LAPIG/UFG and Araticum Network." + "title": "Welcome", + "p1": "Welcome to the Restoration Data Integration Module of the Cerrado biome. Our objective is to present the status of restoration actions in the Cerrado, providing consultation, visualization and analysis at the municipal, state and watershed levels, in the form of maps and graphs, as well as the export of information in the form of tables.", + "p2": "This module, integrated with the Cerrado Knowledge Platform, was funded by WWF Brasil and had the partnerships of LAPIG/UFG and Rede Araticum .", + "p3": "For further information about the data and contribution to the inclusion of new areas regarding the Platform, please contact us by email: rede.araticum@gmail.com", + "p4": "Please read our Terms of Use to continue browsing. By sending a message to rede.araticum@gmail.com or using the public or private data provided by the Cerrado Restoration Monitoring Platform, the user declares to be aware of and to agree with this Policy.", + "p5": "I accept the Terms of Use of the platform." + }, + "terms": { + "title": "Terms of Use", + "error_title": "Error", + "error_msg": "You need to accept the terms of use of the platform", + "view": "View Terms of Use", + "p1": "Araticum - Articulation for the Restoration of the Cerrado - is a multi-sector collaborative network represented by government agents, the academia, private sector, third sector, producers, and restoration practitioners who seek to combine efforts to promote greater ecological efficiency and scaling improvements in restoration. We believe in inclusive restoration, always respecting the diversity (social and environmental) of the Cerrado and its regional arrangements. Araticum contributes to the establishment of connections that strengthen and accelerate projects and the sharing of the knowledge produced.", + "p2": "Considering that the Cerrado Restoration Monitoring Platform gathers spatial information from initiatives and areas in the process of restoration, this spatial and public tool aims to contribute to the transparency of restoration actions for civil society, subsidize large-scale strategies for new projects, and the engagement of actors to expand and strengthen the restoration agenda, as well as Araticum’s.", + "p3": "These Terms aim to guide users and establish minimum rules for the use of the data obtained in the Cerrado Restoration Monitoring Platform.", + "p4": "By using this website, the user agrees that Araticum and its partners assume no legal responsibility for the accuracy, reliability, quality, content, nature or completeness of any information disclosed hereby.", + "p5": "By using the information on this website, the user assumes complete responsibility and risk for any decisions made as a result of the information provided by the platform.", + "p6": "The Platform has public and private data. The public data is made available by official sources and can be obtained through the internet. The private data sent by Araticum is restricted and can only be used for non-profit activities.", + "p7": "Users assume any and all responsibility, of civil and/or criminal nature, for the misuse of any information, texts, graphs, trademarks, images, and finally, any and all intellectual or industrial property rights of Araticum.", + "p8": "Araticum and partners are not responsible for the improper use of the data and for cartographic errors generated by third parties.", + "p9": "When using the Platform, the user undertakes to report problems identified in the Platform to the email: rede.araticum@gmail.com", + "p10": "The information contained on the website has been provided by several members and partners of the network, may not be current, and may be superseded by more recent information when available. The veracity of the information is responsibility of the holders of the right of use, and must be validated by users, with their own data, whenever possible.", + "p11": "The maintainers of the Cerrado Restoration Monitoring Platform are not responsible for outdated data used by users. Updates will be made periodically by specialists, and users may contribute by sending new published records to: rede.araticum@gmail.com", + "p12": "Please read our Terms of Use to continue browsing. By sending a message to rede.araticum@gmail.com or using the public or private data provided by the Cerrado Restoration Monitoring Platform, the user declares to be aware of and to agree with this Policy." } } diff --git a/src/client/src/assets/locales/pt.json b/src/client/src/assets/locales/pt.json index 7641d27..cd99eb4 100644 --- a/src/client/src/assets/locales/pt.json +++ b/src/client/src/assets/locales/pt.json @@ -100,6 +100,10 @@ "logo": "data:image/png;base64,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", "title": "Identificação da Geometria Submetida", "description": "Token de acesso da geometria submetida na plataforma." + }, + "araticum": { + "projects": "Projetos de restauração que intersectam com a área submetida", + "initiatives": "Iniciativas de restauração que intersectam com a área submetida" } }, "legend": { @@ -215,28 +219,33 @@ }, "descriptor_labels": { "groups": { - "agropecuaria": { - "labelGroup": "Agropecuária", + "reflorestamento": { + "labelGroup": "Reflorestamento", "layers": { - "agricultura": { - "labelLayer": "Agricultura" - }, - "pecuaria_censitaria": { - "labelLayer": "Pecuária Censitária - IBGE" - }, "floresta_plantada": { "labelLayer": "Floresta Plantada - Mapbiomas" - }, - "lavoura_mapbiomas": { - "labelLayer": "Lavouras" } } }, - "reflorestamento": { - "labelGroup": "Reflorestamento", + "climate_adaptation": { + "labelGroup": "Adaptação climática" + }, + "regeneration_potential": { + "labelGroup": "Potencial de regeneração", + "layers": { + "regeneration_potential": { + "labelLayer": "Capacidade de regeneração natural do Cerrado em áreas de pastagens" + } + } + }, + "restauracao": { + "labelGroup": "Restauração", "layers": { - "reflorestamento_araticum": { - "labelLayer": "Araticum" + "restauracao_araticum": { + "labelLayer": "Áreas Restauradas - Araticum" + }, + "projetos_araticum": { + "labelLayer": "Iniciativas Araticum" } } }, @@ -356,7 +365,7 @@ "area1Title": "Séries Temporais", "area2Title": "Análise de Proporção", "area3Title": "Gráfico Barra", - "areaTableTitle": "Rankings de Área de Pastagem" + "areaTableTitle": "Rankings de Áreas Restauradas" }, "region_types": { "city": "Município", @@ -367,13 +376,13 @@ }, "resumo_card": { "area_region": "Área da Região", - "area_pastagem": "Área de Pastagem (ha)", + "area_pastagem": "Área de Restauração (ARATICUM) (ha)", "classe_pasture_quality": "Classe", "area_classe_pasture_quality": "Área desta Classe de Degradação", "complement_text": "do(a)", "pasture_quality_title": "Qualidade de Pastagem", "complement_text_pasture_quality": "da área de Pastagem do(a)", - "obs_text": "*A diferença entre a área de pastagem aqui apresentada e a área mapeada, é explicada pelo ajuste de área a partir da análise de acurácia, detalhada em Parente et al. 2019 ( https://doi.org/10.1016/j.rse.2019.111301)", + "obs_text": "ARATICUM - Organização para preservação ambiental - Rede Colaborativa e Multisetorial em prol da restauração em larga escala do bioma Cerrado. (Clique aqui!)", "pasture_quality": { "Severa": "Severa", "Intermediário": "Intermediário", @@ -382,16 +391,16 @@ }, "area1_card": { "pastureAndLotacaoBovina": { - "title": "Pastagem", - "text": "De acordo com o LAPIG, a área de Pastagem (em hectares) e o Rebanho Bovino (em UA) no #typeRegionTranslate# #textRegionTranslate# foi de:", + "title": "Título Area 1", + "text": "Qualquer texto podendo ter um regex com: #typeRegionTranslate# #textRegionTranslate# foi de:", "labelOfQuery": { "pasture": "Pastagem", "lotacao_bovina_regions": "Rebanho Bovino" } }, "pastureQuality": { - "title": "Qualidade de Pastagem", - "text": "De acordo com o LAPIG, ao longo dos anos, o #typeRegionTranslate# #textRegionTranslate# possui sua área de Pastagem (ha) distribuída entre as seguintes classes de degradação de Pastagem", + "title": "2nd timeseries", + "text": "Qualquer texto podendo ter um regex com: #typeRegionTranslate# #textRegionTranslate# foi de:", "labelOfQuery": { "pasture_quality": { "Severa": "Severa", @@ -402,46 +411,15 @@ } }, "area2_card": { - "uso_solo_terraclass": { - "text": "De acordo com o projeto Terraclass Cerrado, o #typeRegionTranslate# #textRegionTranslate# possui uma área total de #areaMun# ha, distribuída entre os seguintes usos do solo:", - "Mosaíco de Ocupações": "Mosaico de Ocupações", - "Agricultura Perene": "Agricultura Perene", - "Natural Não Vegetado": "Natural Não-Vegetado", - "Água": "Água", - "Silvicultura": "Silvicultura", - "Solo Exposto": "Solo Exposto", - "Não Observado": "Não Observado", - "Pastagem": "Pastagem", - "Agricultura Anual": "Agricultura Anual", - "Outros": "Outros", - "Urbano": "Urbano", - "Mineração": "Mineração", - "Natural": "Natural" - }, - "uso_solo_probio": { - "text": "De acordo com o projeto PROBIO Cerrado, o #typeRegionTranslate# #textRegionTranslate# possui uma área total de #areaMun# ha, distribuída entre os seguintes usos do solo:", - "Reflorestamento": "Reflorestamento", - "Savana": "Savana", - "Água": "Água", - "Savana Estépica": "Savana Estépica", - "Floresta Estacional Semi-decidual": "Floresta Estacional Semi-decidual", - "Floresta Ombrófila Densa": "Floresta Ombrófila Densa", - "Floresta Estacional Decidual": "Floresta Estacional Decidual", - "Floresta Ombrófila Aberta": "Floresta Ombrófila Aberta", - "Influência Urbana": "Influência Urbana", - "Pecuária": "Pecuária", - "Vegetação Secundária": "Vegetação Secundária", - "Formações Pioneiras": "Formações Pioneiras", - "Agricultura": "Agricultura" - }, - "pastureQualityPerYear": { - "title": "Qualidade de Pastagem", - "text": "De acordo com o LAPIG, no ano de #yearTranslate#, o #typeRegionTranslate# #textRegionTranslate# possui uma área total de Pastagem mapeada em #areaPasture# ha, distribuída entre as seguintes classes de degradação de Pastagem:", + "araticumRestoration": { + "title": "Área de Restauração por Método", + "text": "Os Projetos ligados a Rede Araticum declaram uma área de Restauração equivalente à #areaRestoration# ha distribuídos entre estes métodos:", "labelOfQuery": { - "pasture_quality": { - "Severa": "Severa", - "Intermediário": "Intermediário", - "Ausente": "Ausente" + "areaRestorationPerProject": { + "CEDAC": "Fortalecer Cadeias Sociobioprodutivas em Rede Baseadas no uso Sustentavel do Cerrado", + "CCA": "Reward Program for Conscious Producers - Restoring Ecosystem Services in the Cerrado", + "Cooperagrofamiliar": "Food Products from the Forests in the Cerrado, Brazil", + "Aerolevantamento por veículo não tripilado DRONE": "Agroflorestas Prestadoras de Serviços Ecossistêmicos" } } } @@ -456,29 +434,13 @@ } }, "area_table_card": { - "pastureRankingsCities": { - "title": "Municípios", - "text": "Rankings dos Municípios de acordo com a área de Pastagem (em ha)", + "araticumRestorationRankingsProjects": { + "title": "Iniciativas", + "text": "Rankings das Iniciativas de acordo com a área de Restauração (em ha)", "labelOfQuery": { - "municipios": "Municípios" + "projetos": "Iniciativas" }, - "columnsTitle": "#?Município?UF?Área (ha)" - }, - "pastureRankingsStates": { - "title": "Estados", - "text": "Rankings dos Estados de acordo com a área de Pastagem (em ha)", - "labelOfQuery": { - "estados": "Estados" - }, - "columnsTitle": "#?UF?Área (ha)" - }, - "pastureRankingsBiomes": { - "title": "Biomas", - "text": "Ranking de Biomas de acordo com a área de Pastagem (em ha)", - "labelOfQuery": { - "biomas": "Biomas" - }, - "columnsTitle": "#?Bioma?Área (ha)" + "columnsTitle": "#?Iniciativa?Fonte?Área (ha)" } }, "area_table_card_auxiliar": { @@ -722,8 +684,29 @@ "videos_drone": "Vídeos de Drone" }, "wellcome": { - "title": "Notificação de boas-vindas", - "p1": "Bem-vindo ao Módulo de Integração de Dados de Restauração Ecológica e Reflorestamento no bioma Cerrado. Nosso objetivo é apresentar o status das ações de restauração no Cerrado, propiciando a consulta, visualização e análises em nível municipal, estadual e de bacias hidrográficas, na forma de mapas e gráficos, bem como a exportação das informações na forma de arquivos vetoriais e tabelas.", - "p2": "Este módulo, integrado à Plataforma de Conhecimento do Cerrado, foi financiado pelo WWF Brasil e contou com as parcerias do LAPIG/UFG e Rede Araticum." + "title": "Boas-vindas", + "p1": "Bem-vindo ao Módulo de Integração de Dados de Restauração no bioma Cerrado. Nosso objetivo é apresentar o status das ações de restauração no Cerrado, propiciando a consulta, visualização e análises em nível municipal, estadual e de bacias hidrográficas, na forma de mapas e gráficos, bem como a exportação das informações na forma de tabelas.", + "p2": "Este módulo, integrado à Plataforma de Conhecimento do Cerrado, foi financiado pelo WWF Brasil e contou com as parcerias do LAPIG/UFG e Rede Araticum .", + "p3": "Mais informações sobre os dados e contribuição para inclusão de novas áreas para a Plataforma, entre em contato pelo correio eletrônico: rede.araticum@gmail.com", + "p4": "Leia o texto do Termo de Uso para continuar navegando. Ao enviar uma mensagem para rede.araticum@gmail.com ou utilizar os dados públicos ou privados disponibilizados pela Plataforma de Monitoramento da Restauração do Cerrado, o usuário declara ciência e concordância com essa Política. Please read our Terms of Use to continue browsing. By sending a message to rede.araticum@gmail.com.", + "p5": "Aceito o Termos de Uso da plataforma" + }, + "terms": { + "title": "Termos de Uso", + "error_title": "Erro", + "error_msg": "Você precisa aceitar os Termos de Uso da Plataforma", + "view": "Visualizar Termo de Uso", + "p1": "A Araticum - Articulação pela Restauração do Cerrado é uma rede colaborativa multisetorial representada por agentes governamentais, academia, iniciativa privada, terceiro setor, produtores, praticantes da restauração que buscam somar esforços para promover maior eficiência ecológica e ganho de escala na restauração. Acreditamos na restauração inclusiva, sempre respeitando a diversidade (social e ambiental) do Cerrado e seus arranjos regionais. A Araticum contribui para o estabelecimento de conexões que fortalecem e aceleram projetos e o compartilhamento do conhecimento produzido.", + "p2": "Considerando que a Plataforma de Monitoramento da Restauração do Cerrado reúne informações espaciais das iniciativas e das áreas em processo de restauração, esta ferramenta espacial e pública tem o objetivo de contribuir para transparência das ações de restauração para a sociedade civil, subsidiar estratégias de larga escala para novos projetos e engajamento de atores para expansão e fortalecimento da agenda da restauração e da Araticum.", + "p3": "Este Termo visa orientar os usuários e estabelecer regras mínimas para o uso dos dados provenientes da Plataforma de Monitoramento da Restauração do Cerrado.", + "p4": "Ao usar esse site, o usuário concorda que a Araticum e seus parceiros não assumem nenhuma responsabilidade legal sobre a acurácia, confiabilidade, qualidade, conteúdo, natureza ou completude de qualquer informação divulgada neste ambiente on-line.", + "p5": "Ao utilizar a informação deste site, o usuário assume toda responsabilidade e risco por qualquer decisão tomada como resultado da informação disponibilizada pela plataforma.", + "p6": "A Plataforma dispõe de dados públicos e privados. Os dados públicos são disponibilizados por fontes oficiais, e podem ser obtidos pela internet, enquanto os dados privados, enviados pela Araticum, poderão ser utilizados pelo usuário com o uso restrito para atividades sem fins lucrativos.", + "p7": "Os usuários assumem toda e qualquer responsabilidade, de caráter civil e/ou criminal, pela utilização indevida de informações, textos, gráficos, marcas, imagens, enfim, de todo e qualquer direito de propriedade intelectual ou industrial da Araticum.", + "p8": "A Araticum e parceiros não se responsabilizam pelo uso indevido dos dados e por erros cartográficos gerados por terceiros.", + "p9": "Ao utilizar a Plataforma, o usuário se compromete em reportar problemas identificados na Plataforma para o e-mail: rede.araticum@gmail.com", + "p10": "As informações contidas no site foram fornecidas por diversos membros e parceiros da rede, podendo não ser atuais, e podem ser suplantadas por informações mais recentes quando disponíveis. A veracidade das informações é de responsabilidade dos detentores do direito de uso e deve ser validada pelos usuários, com dados próprios, sempre que possível.", + "p11": "Os mantenedores da Plataforma do Monitoramento da Restauração do Cerrado não se responsabilizam por dados desatualizados utilizados pelos usuários. A atualização será feita periodicamente por especialistas e os usuários poderão contribuir enviando novos registros publicados para: rede.araticum@gmail.com ", + "p12": "Leia o texto completo do Termo de Uso para continuar navegando. Ao enviar uma mensagem para rede.araticum@gmail.com ou utilizar os dados públicos ou privados disponibilizados pela Plataforma de Restauração do Cerrado, o usuário declara ciência e concordância com essa Política." } } diff --git a/src/client/src/environments/environment.prod.ts b/src/client/src/environments/environment.prod.ts index 7619583..1e5a87f 100644 --- a/src/client/src/environments/environment.prod.ts +++ b/src/client/src/environments/environment.prod.ts @@ -1,12 +1,13 @@ export const environment = { + APP: "ARATICUM", APP_NAME: 'Araticum - Articulação pela Restauração do Cerrado', production: true, - GTAG: '', + GTAG: 'G-E4J440XHY3', OWS_API: 'https://ows.lapig.iesa.ufg.br/api', OWS: 'https://ows.lapig.iesa.ufg.br', OWS_O1: "https://o1.lapig.iesa.ufg.br/ows", OWS_O2: "https://o2.lapig.iesa.ufg.br/ows", OWS_O3: "https://o3.lapig.iesa.ufg.br/ows", OWS_O4: "https://o4.lapig.iesa.ufg.br/ows", - APP_URL: 'https://atlas-homolog.lapig.iesa.ufg.br' + APP_URL: 'https://araticum.lapig.iesa.ufg.br' }; diff --git a/src/client/src/environments/environment.ts b/src/client/src/environments/environment.ts index 41fd9d6..eaa2cae 100644 --- a/src/client/src/environments/environment.ts +++ b/src/client/src/environments/environment.ts @@ -3,6 +3,7 @@ // The list of file replacements can be found in `angular.json`. export const environment = { + APP: "ARATICUM", APP_NAME: 'Araticum - Articulação pela Restauração do Cerrado', production: false, GTAG: '', diff --git a/src/server/config.js b/src/server/config.js index 96051de..989aa56 100755 --- a/src/server/config.js +++ b/src/server/config.js @@ -39,8 +39,7 @@ module.exports = function (app) { "connectionTimeoutMillis": 0, }, "port": env.PORT, - "ows_host": env.OWS_HOST, - "lapig-maps": env.LAPIG_MAPS + "ows_host": env.OWS, }; if (env.NODE_ENV === 'prod') { diff --git a/src/server/controllers/charts.js b/src/server/controllers/charts.js index a56659a..40afc70 100644 --- a/src/server/controllers/charts.js +++ b/src/server/controllers/charts.js @@ -7,7 +7,7 @@ module.exports = function (app) { Internal.numberFormat = function (numero) { - numero = numero.toFixed(2).split('.'); + numero = numero.toFixed(5).split('.'); numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.'); return numero.join(','); } @@ -32,7 +32,31 @@ module.exports = function (app) { let queryInd = allQueriesResult[query.idOfQuery] arrayLabels.push(...queryInd.map(a => String(a.label))) - let colors = [...new Set(queryInd.map(a => a.color))] + let colors = [ + { + color: "blueviolet", + code: "#8A2BE2" + }, + { + color: "orangered 1 (orangered)", + code: "#FF4500" + }, + { + color: "springgreen", + code: "#00FF7F" + }, + { + color: "darkgoldenrod", + code: "#B8860B" + } + // { + // color: "coral 2", + // code: { + // hex: "#EE6A50" + // }, + // id: 383 + // }, + ] if (chartDescription.type == 'line') { @@ -62,16 +86,16 @@ module.exports = function (app) { arrayData.push({ label: query.labelOfQuery, data: [...queryInd.map(a => parseFloat(a.value))], - backgroundColor: [...new Set(queryInd.map(element => element.color))], - hoverBackgroundColor: [...new Set(queryInd.map(element => element.color))], + backgroundColor: [...new Set(colors.map(element => element.code))], + hoverBackgroundColor: [...new Set(colors.map(element => element.code))], }) } else { arrayData.push({ label: query.idOfQuery, data: [...queryInd.map(a => parseFloat(a.value))], - backgroundColor: [...new Set(queryInd.map(element => element.color))], - hoverBackgroundColor: [...new Set(queryInd.map(element => element.color))], + backgroundColor: [...new Set(colors.map(element => element.code))], + hoverBackgroundColor: [...new Set(colors.map(element => element.code))], }) } @@ -140,7 +164,7 @@ module.exports = function (app) { }; Controller.handleResumo = function (request, response) { - const { lang, typeRegion, valueRegion, textRegion, year } = request.query; + const { lang, typeRegion, textRegion, year } = request.query; const language = lang; Internal.languageOb = UtilsLang().getLang(language).right_sidebar; @@ -155,16 +179,10 @@ module.exports = function (app) { region: { area: request.queryResult['region'][0].area_region, }, - pasture: { - area: request.queryResult['pasture'][0].value, - percentOfRegionArea: Internal.numberFormat((request.queryResult['pasture'][0].value / request.queryResult['region'][0].area_region) * 100) + "%" - }, - pasture_quality: request.queryResult['pasture_quality'].map(ob => { - ob.percentAreaPasture = Internal.numberFormat((ob.value / request.queryResult['pasture'][0].value) * 100) + "%" - ob.percentOfRegionArea = Internal.numberFormat((ob.value / request.queryResult['region'][0].area_region) * 100) + "%" - ob.classe = Internal.languageOb.resumo_card.pasture_quality[ob.classe] - return ob; - }) + restoration: { + area: request.queryResult['restoration'][0].value, + percentOfRegionArea: Internal.numberFormat((request.queryResult['restoration'][0].value / request.queryResult['region'][0].area_region) * 100) + "%" + } } response.send(result) @@ -254,14 +272,9 @@ module.exports = function (app) { }; Controller.handleArea2Data = function (request, response) { - const { lang, typeRegion, valueRegion, textRegion, year } = request.query; + const { lang, typeRegion, valueRegion, textRegion } = request.query; const language = lang; - let varYear = year - if (!varYear) { - varYear = 2020 - } - Internal.languageOb = UtilsLang().getLang(language).right_sidebar; let replacements = { @@ -271,20 +284,19 @@ module.exports = function (app) { const chartResult = [ { - "id": "pastureQualityPerYear", + "id": "araticumRestoration", "idsOfQueriesExecuted": [ - { idOfQuery: 'pasture_quality', labelOfQuery: Internal.languageOb["area2_card"]["pastureQualityPerYear"].labelOfQuery['pasture_quality'] }, + { idOfQuery: 'areaRestorationPerProject', labelOfQuery: Internal.languageOb["area2_card"]["araticumRestoration"].labelOfQuery['pasture_quality'] }, ], - "title": Internal.languageOb["area2_card"]["pastureQualityPerYear"].title, + "title": Internal.languageOb["area2_card"]["araticumRestoration"].title, "getText": function (queriesResult, query) { // replacements['areaMun'] = Number(chart['indicators'][0]["area_mun"]) // replacements['anthropicArea'] = chart['indicators'].reduce((a, { value }) => a + value, 0); // replacements['percentArea'] = (replacements['anthropicArea'] / replacements['areaMun']) * 100.0; - replacements['areaPasture'] = Internal.numberFormat(Number(queriesResult[query[0].idOfQuery].reduce((n, { value }) => n + parseFloat(value), 0))) - replacements['yearTranslate'] = parseInt(varYear) + replacements['areaRestoration'] = Internal.numberFormat(Number(queriesResult[query[0].idOfQuery].reduce((n, { value }) => n + parseFloat(value), 0))) - const text = Internal.replacementStrings(Internal.languageOb["area2_card"]["pastureQualityPerYear"].text, replacements) + const text = Internal.replacementStrings(Internal.languageOb["area2_card"]["araticumRestoration"].text, replacements) return text }, "type": 'pie', @@ -444,55 +456,21 @@ module.exports = function (app) { const tablesDescriptor = [ { - "id": "pastureRankingsCities", - "idsOfQueriesExecuted": [ - { idOfQuery: 'municipios', labelOfQuery: Internal.languageOb["area_table_card"]["pastureRankingsCities"].labelOfQuery['municipios'] }, - ], - "title": Internal.languageOb["area_table_card"]["pastureRankingsCities"].title, - "columnsTitle": Internal.languageOb["area_table_card"]["pastureRankingsCities"].columnsTitle, - "getText": function (chart) { - // replacements['areaMun'] = Number(chart['indicators'][0]["area_mun"]) - // replacements['anthropicArea'] = chart['indicators'].reduce((a, { value }) => a + value, 0); - // replacements['percentArea'] = (replacements['anthropicArea'] / replacements['areaMun']) * 100.0; - - const text = Internal.replacementStrings(Internal.languageOb["area_table_card"]["pastureRankingsCities"].text, replacements) - return text - }, - "rows_labels": "index?city?uf?value", - }, - { - "id": "pastureRankingsStates", - "idsOfQueriesExecuted": [ - { idOfQuery: 'estados', labelOfQuery: Internal.languageOb["area_table_card"]["pastureRankingsStates"].labelOfQuery['estados'] }, - ], - "title": Internal.languageOb["area_table_card"]["pastureRankingsStates"].title, - "columnsTitle": Internal.languageOb["area_table_card"]["pastureRankingsStates"].columnsTitle, - "getText": function (chart) { - // replacements['areaMun'] = Number(chart['indicators'][0]["area_mun"]) - // replacements['anthropicArea'] = chart['indicators'].reduce((a, { value }) => a + value, 0); - // replacements['percentArea'] = (replacements['anthropicArea'] / replacements['areaMun']) * 100.0; - - const text = Internal.replacementStrings(Internal.languageOb["area_table_card"]["pastureRankingsStates"].text, replacements) - return text - }, - "rows_labels": "index?uf?value", - }, - { - "id": "pastureRankingsBiomes", + "id": "araticumRestorationRankingsProjects", "idsOfQueriesExecuted": [ - { idOfQuery: 'biomas', labelOfQuery: Internal.languageOb["area_table_card"]["pastureRankingsBiomes"].labelOfQuery['biomas'] }, + { idOfQuery: 'projetos', labelOfQuery: Internal.languageOb["area_table_card"]["araticumRestorationRankingsProjects"].labelOfQuery['projetos'] }, ], - "title": Internal.languageOb["area_table_card"]["pastureRankingsBiomes"].title, - "columnsTitle": Internal.languageOb["area_table_card"]["pastureRankingsBiomes"].columnsTitle, + "title": Internal.languageOb["area_table_card"]["araticumRestorationRankingsProjects"].title, + "columnsTitle": Internal.languageOb["area_table_card"]["araticumRestorationRankingsProjects"].columnsTitle, "getText": function (chart) { // replacements['areaMun'] = Number(chart['indicators'][0]["area_mun"]) // replacements['anthropicArea'] = chart['indicators'].reduce((a, { value }) => a + value, 0); // replacements['percentArea'] = (replacements['anthropicArea'] / replacements['areaMun']) * 100.0; - const text = Internal.replacementStrings(Internal.languageOb["area_table_card"]["pastureRankingsBiomes"].text, replacements) + const text = Internal.replacementStrings(Internal.languageOb["area_table_card"]["araticumRestorationRankingsProjects"].text, replacements) return text }, - "rows_labels": "index?biome?value", + "rows_labels": "index?projeto?fonte?value", } ] diff --git a/src/server/controllers/map.js b/src/server/controllers/map.js index 51c8910..3ed10ff 100644 --- a/src/server/controllers/map.js +++ b/src/server/controllers/map.js @@ -29,7 +29,7 @@ module.exports = function (app) { let limitsTypes = await Controller.callServiceToObtainLayerTypes(lang, 'limits') const result = { - // regionFilterDefault: "bioma='CERRADO'", // Non-obrigatory property to define a filter to Region applied to EVERY layer. + regionFilterDefault: "bioma='CERRADO'", // Non-obrigatory property to define a filter to Region applied to EVERY layer. groups: DescriptorBuilder().getGroupLayers(lang, layertypes), basemaps: DescriptorBuilder().getBasemapsOrLimitsLayers(lang, 'basemaps', basemapsTypes), limits: DescriptorBuilder().getBasemapsOrLimitsLayers(lang, 'limits', limitsTypes), @@ -56,25 +56,20 @@ module.exports = function (app) { Controller.search = function (request, response) { var regiao; - var result = []; - var queryResult = request.queryResult - queryResult.forEach(function (row) { + const queryResult = request.queryResult['search'] + + let iniResults = [] - if (row.uf === null) { - regiao = row.text - } else { - regiao = row.text + " (" + row.uf + ")" - } - result.push({ - text: regiao, - value: row.value, - type: row.type - }) + queryResult.forEach(function (row) { + delete row.priority + iniResults.push(row) }) - response.send(result) + let result = [...new Map(iniResults.map(item => [item['value'], item])).values()] + + response.send({ search: result }) response.end() } diff --git a/src/server/controllers/upload.js b/src/server/controllers/upload.js index c5bed53..a4a5737 100755 --- a/src/server/controllers/upload.js +++ b/src/server/controllers/upload.js @@ -373,10 +373,8 @@ module.exports = function (app) { // console.log(`${key}: ${regionGroupedByType[key]} : ${getUniqueListBy(regionGroupedByType[key], 'name')}`); }); - var objUniqueRegionsGrouped = Object.assign({}, ...uniqueRegionsGrouped); - let res = { regions_intersected: objUniqueRegionsGrouped, shape_upload: info_area @@ -392,335 +390,71 @@ module.exports = function (app) { }; - Uploader.findGeoJsonByToken = function (request, response) { - try { - var queryResult = request.queryResult['geojson_upload'] - let geojson = queryResult[0]['geojson'] - - var queryResult2 = request.queryResult['area_upload'] - let token = queryResult2[0]['token'] - - response.status(200).send({ - token: token, - geojson: geojson - }); - response.end() - - } catch (err) { - response.status(400).send(languageJson['upload_messages']['spatial_relation_error'][Internal.language]); - response.end() - } - } - - Uploader.queimadas = function (request, response) { + Uploader.analysisaraticum = function (request, response) { try { - var queryResult = request.queryResult['queimadas'] - - var queimadasByYear = [] - queryResult.forEach(function (row) { - - var year = Number(row['year']) - var area = Number(row['area_queimada']) - - queimadasByYear.push({ - 'area_queimada': area, - 'year': year - }) - }); - // var queryResult = request.queryResult['pastagem'] + let qResultProjects = request.queryResult['projects_pershape'] - // var pastagemByYear = [] - // queryResult.forEach(function (row) { + let arrayProjects = qResultProjects.reduce((arr, item) => { + const existing = arr.find(innerItem => innerItem.projeto === item.projeto) + + if (existing) { + existing.metodo_padrao = Array.isArray(existing.metodo_padrao) + ? existing.metodo_padrao + : [existing.metodo_padrao] + + existing.metodo_padrao.push(item.metodo_padrao) - // var year = Number(row['year']) - // var area = Number(row['area_pastagem']) - - // queimadasByYear.push({ - // 'area_pastagem': area, - // 'year': year - // }) - // }); - - - const groupByKey = (list, key, { omitKey = false }) => list.reduce((hash, { - [key]: value, - ...rest - }) => ({ - ...hash, - [value]: (hash[value] || []).concat(omitKey ? { ...rest } : { - [key]: value, - ...rest - }) - }), {}) - - // Group by color as key to the person array - const areasGroupedByYear = groupByKey(queimadasByYear, 'year', { omitKey: true }); - // const areasGroupedByYear = groupBy(queimadasByYear, 'year'); - let arrayAreasGrouped = [] - for (let key of Object.keys(areasGroupedByYear)) { - arrayAreasGrouped.push({ - year: key, - // area_pastagem: areasGroupedByYear[key][0].hasOwnProperty('area_pastagem') ? areasGroupedByYear[key][0]['area_pastagem'] : areasGroupedByYear[key][1]['area_pastagem'], - area_queimada: areasGroupedByYear[key][0].hasOwnProperty('area_queimada') ? areasGroupedByYear[key][0]['area_queimada'] : null - }) - } - - let graphQueimadasPastagem = { - "title": "Dados", - "type": "line", - "pointStyle": 'rect', - "options": { - title: { - display: false, - }, - legend: { - labels: { - usePointStyle: true, - fontColor: "#85560c" - }, - position: "bottom" - }, - tooltips: {} - }, - "data": { - labels: arrayAreasGrouped.map(e => e.year), - datasets: [ - // { - // data: arrayAreasGrouped.map(e => e.area_pastagem), - // borderColor: 'rgb(231, 187, 2)', - // fill: false, - // label: "Area de Pastagem" - // }, - { - data: arrayAreasGrouped.map(e => e.area_queimada), - borderColor: 'rgb(110, 101, 101)', - fill: false, - label: "Area Queimada" - } - ] + existing.area_restaurada += item.area_restaurada + } else { + item.metodo_padrao = [item.metodo_padrao] + arr.push(item) } - } - - let res = { - chart_pastagem_queimadas_peryear: graphQueimadasPastagem, - table_pastagem_queimadas_peryear: arrayAreasGrouped, - } - - response.status(200).send(res); - response.end() - - } catch (err) { - response.status(400).send(languageJson['upload_messages']['spatial_relation_error'][Internal.language]); - response.end() - } + + return arr + }, []) - - }; - - Uploader.terraclass = function (request, response) { - - try { - - queryResult = request.queryResult['terraclass'] - var terraclass = [] - - queryResult.forEach(function (row) { - - var color = (row['color']) - var lulc = (row['lulc']) - var area = Number(row['area_lulc']) - - terraclass.push({ - 'color': color, - 'lulc': lulc, - 'area_lulc': area - }) - }); - - let graphTerraclass = { - "title": "Terraclass", - "type": "pie", - "pointStyle": 'rect', - "options": { - title: { - display: false, - }, - legend: { - labels: { - usePointStyle: true, - fontColor: "#85560c" - }, - position: "bottom" - }, - tooltips: {} - }, - "data": { - labels: terraclass.map(e => e.lulc), - datasets: [{ - data: terraclass.map(e => e.area_lulc), - backgroundColor: terraclass.map(element => element.color), - hoverBackgroundColor: terraclass.map(element => element.color) - }] - } - } + let qResultInitiatives = request.queryResult['initiaves_pershape'] let res = { - terraclass: graphTerraclass, + projects: arrayProjects.sort((a, b) => { + return b.area_restaurada - a.area_restaurada; + }), + initiatives: qResultInitiatives.map(r => r.organizacao) } response.status(200).send(res); response.end() } catch (err) { + console.error(err) response.status(400).send(languageJson['upload_messages']['spatial_relation_error'][Internal.language]); response.end() } - }; - - Uploader.mapbiomas = function (request, response) { - - try { - - queryResult = request.queryResult['mapbiomas'] - var mapbiomas = [] - - queryResult.forEach(function (row) { - - var color = (row['color']) - var lulc = (row['lulc']) - var area = Number(row['area_lulc']) - - mapbiomas.push({ - 'color': color, - 'lulc': lulc, - 'area_lulc': area - }) - }); - - let graphMapbiomas = { - "title": "Mapbiomas", - "type": "pie", - "pointStyle": 'rect', - "options": { - title: { - display: false, - }, - legend: { - labels: { - usePointStyle: true, - fontColor: "#85560c" - }, - position: "bottom" - }, - tooltips: {} - }, - "data": { - labels: mapbiomas.map(e => e.lulc), - datasets: [{ - data: mapbiomas.map(e => e.area_lulc), - backgroundColor: mapbiomas.map(element => element.color), - hoverBackgroundColor: mapbiomas.map(element => element.color) - }] - } - } - let res = { - mapbiomas: graphMapbiomas, - } - - response.status(200).send(res); - response.end() - - } catch (err) { - response.status(400).send(languageJson['upload_messages']['spatial_relation_error'][Internal.language]); - response.end() - } }; - Uploader.pastagem = function (request, response) { - + Uploader.findGeoJsonByToken = function (request, response) { try { + var queryResult = request.queryResult['geojson_upload'] + let geojson = queryResult[0]['geojson'] - var queryResult = request.queryResult['pastagem'] - - var pastagemByYear = [] - queryResult.forEach(function (row) { - - var year = Number(row['year']) - var area = Number(row['area_pastagem']) + var queryResult2 = request.queryResult['area_upload'] + let token = queryResult2[0]['token'] - pastagemByYear.push({ - 'area_pastagem': area, - 'year': year - }) + response.status(200).send({ + token: token, + geojson: geojson }); - - - const groupByKey = (list, key, { omitKey = false }) => list.reduce((hash, { - [key]: value, - ...rest - }) => ({ - ...hash, - [value]: (hash[value] || []).concat(omitKey ? { ...rest } : { - [key]: value, - ...rest - }) - }), {}) - - // Group by color as key to the person array - const areasGroupedByYear = groupByKey(pastagemByYear, 'year', { omitKey: true }); - let arrayAreasGrouped = [] - - for (let key of Object.keys(areasGroupedByYear)) { - arrayAreasGrouped.push({ - year: key, - area_pastagem: areasGroupedByYear[key][0].hasOwnProperty('area_pastagem') ? areasGroupedByYear[key][0]['area_pastagem'] : areasGroupedByYear[key][1]['area_pastagem'], - }) - } - - let graphQueimadasPastagem = { - "title": "Dados", - "type": "line", - "pointStyle": 'rect', - "options": { - title: { - display: false, - }, - legend: { - labels: { - usePointStyle: true, - fontColor: "#85560c" - }, - position: "bottom" - }, - tooltips: {} - }, - "data": { - labels: arrayAreasGrouped.map(e => e.year), - datasets: [{ - data: arrayAreasGrouped.map(e => e.area_pastagem), - borderColor: 'rgb(231, 187, 2)', - fill: false, - label: "Area de Pastagem" - },] - } - } - - let res = { - chart_pastagem_peryear: graphQueimadasPastagem, - table_pastagem_peryear: arrayAreasGrouped, - } - - response.status(200).send(res); response.end() } catch (err) { response.status(400).send(languageJson['upload_messages']['spatial_relation_error'][Internal.language]); response.end() } - }; + } + Uploader.analysisarea = function (request, response) { @@ -739,20 +473,6 @@ module.exports = function (app) { }) }); - // var queryResult = request.queryResult['pastagem'] - - // var pastagemByYear = [] - // queryResult.forEach(function (row) { - - // var year = Number(row['year']) - // var area = Number(row['area_pastagem']) - - // queimadasByYear.push({ - // 'area_pastagem': area, - // 'year': year - // }) - // }); - // Accepts the array and key const groupBy = (array, key) => { // Return the end result @@ -899,46 +619,6 @@ module.exports = function (app) { } }; - Uploader.prodes = function (request, response) { - - try { - var queryResult = request.queryResult['prodes'] - - var resultByYear = [] - queryResult.forEach(function (row) { - - var year = Number(row['year']) - var area = Number(row['area_desmat']) - - resultByYear.push({ - 'area_desmat': area, - 'year': year - }) - }); - - // Accepts the array and key - const groupBy = (array, key) => { - // Return the end result - return array.reduce((result, currentValue) => { - // If an array already present for key, push it to the array. Else create an array and push the object - (result[currentValue[key]] = result[currentValue[key]] || []).push( - currentValue - ); - // Return the current iteration `result` value, this will be taken as next iteration `result` value and accumulate - return result; - }, {}); // empty object is the initial value for result object - }; - - response.status(200).send(resultByYear); - response.end() - - } catch (err) { - response.status(400).send(languageJson['upload_messages']['spatial_relation_error'][Internal.language]); - response.end() - } - - }; - Uploader.getAnalysis = function (request, response) { try { @@ -969,4 +649,4 @@ module.exports = function (app) { return Uploader; -}; \ No newline at end of file +}; diff --git a/src/server/database/client.js b/src/server/database/client.js index 852a4e2..90dca4f 100644 --- a/src/server/database/client.js +++ b/src/server/database/client.js @@ -6,8 +6,8 @@ module.exports = function(app) { var Client = {} const config = app.config; + Internal['pool-lapig'] = new Pool(config['pg_lapig']) - Internal['pool-general'] = new Pool(config['pg_general']) Internal.prepareQuery = function(sqlQuery, params) { diff --git a/src/server/database/queries/charts.js b/src/server/database/queries/charts.js index 2a4b92a..4bdf03a 100644 --- a/src/server/database/queries/charts.js +++ b/src/server/database/queries/charts.js @@ -45,7 +45,6 @@ module.exports = function (app) { Query.resumo = function (params) { var regionFilter = Internal.getRegionFilter(params['typeRegion'], params['valueRegion']); - var yearFilter = params['year'] ? Internal.getYearFilter(params['year']) : Internal.getYearFilter(2020); return [ { source: 'lapig', @@ -54,179 +53,65 @@ module.exports = function (app) { }, { source: 'lapig', - id: 'pasture', - sql: " SELECT CAST(sum(a.st_area_ha) as double precision) as value " - + " FROM pasture_col6 a " + id: 'restoration', + sql: " SELECT CAST(sum(a.area_ha) as double precision) as value " + + " FROM araticum_restauracao a " + " WHERE " + regionFilter - + " AND " + yearFilter, - mantain: true - }, - { - source: 'lapig', - id: 'pasture_quality', - sql: " SELECT b.name as classe, b.color, CAST(sum(a.area_ha) as double precision) as value " - + " FROM pasture_quality_col6 a " + "INNER JOIN graphic_colors as b on cast(a.classe as varchar) = b.class_number AND b.table_rel = 'pasture_quality'" - + " WHERE " + regionFilter - + " AND " + yearFilter - + " GROUP BY 1,2;", - mantain: true - }, + } ] } Query.area1 = function (params) { - var regionFilter = Internal.getRegionFilter(params['typeRegion'], params['valueRegion']); - // var yearFilter = Internal.getYearFilter(params['year']); + // var regionFilter = Internal.getRegionFilter(params['typeRegion'], params['valueRegion']); return [ - // { - // source: 'lapig', - // id: 'prodes', - // // sql: " SELECT a.year as label, b.color, CAST(SUM(pol_ha) / 1000 as double precision) as value, (SELECT CAST(SUM(pol_ha) / 1000 as double precision) FROM regions " + regionFilter + ") as area_mun " + - // // " FROM desmatamento_prodes a " + - // // "INNER JOIN graphic_colors as B on 'prodes_cerrado' = b.name AND b.table_rel = 'desmatamento_prodes' " + regionFilter + - // // // " AND " + yearFilter + - // // " GROUP BY 1,2;", - // sql: " SELECT year as label, 'prodes_cerrado' source, CAST(SUM(pol_ha) / 1000 as double precision) as value, (SELECT CAST(SUM(pol_ha) / 1000 as double precision) FROM regions " + regionFilter + ") as area_mun " + - // " FROM desmatamento_prodes " + - // regionFilter + - // // " AND " + yearFilter + - // " GROUP BY 1;", - // mantain: true - // }, - { - source: 'lapig', - id: 'pasture', - sql: " SELECT a.year as label, b.color, b.name as classe, sum(a.st_area_ha) as value, " - + "(SELECT CAST(SUM(pol_ha) as double precision) FROM new_regions WHERE " + regionFilter + ") as area_mun " - + " FROM pasture_col6 a " + "INNER JOIN graphic_colors b on b.table_rel = 'pasture' " - + " WHERE " + regionFilter - // " AND " + yearFilter + - + " GROUP BY 1,2,3 ORDER BY 1 ASC;", - mantain: true - }, - { - source: 'lapig', - id: 'lotacao_bovina_regions', - sql: " SELECT a.year as label, b.color, b.name as classe, sum(a.ua) as value, (SELECT CAST(SUM(pol_ha) as double precision) FROM regions WHERE " + regionFilter + ") as area_mun " + - " FROM lotacao_bovina_regions a " + "INNER JOIN graphic_colors as b on b.table_rel = 'rebanho_bovino' " + - "WHERE " + regionFilter + - // " AND " + yearFilter + - " GROUP BY 1,2,3 ORDER BY 1 ASC;", - mantain: true - }, { source: 'lapig', - id: 'pasture_quality', - sql: " SELECT a.year as label,b.color, b.name as classe, sum(a.area_ha) as value, (SELECT CAST(SUM(pol_ha) / 1000 as double precision) FROM regions WHERE " + regionFilter + ") as area_mun " + - " FROM pasture_quality_col6 a " + "INNER JOIN graphic_colors as b on cast(a.classe as varchar) = b.class_number AND b.table_rel = 'pasture_quality'" + - "WHERE " + regionFilter + - // " AND " + yearFilter + - " GROUP BY 1,2,3 ORDER BY 1 ASC;", + id: 'time_series_data1', + sql: "SELECT 'PUT HERE YOUR QUERY'", mantain: true - }, + } ] } Query.area2 = function (params) { - var regionFilter = Internal.getRegionFilter(params['typeRegion'], params['valueRegion']); - var yearFilter = params['year'] ? Internal.getYearFilter(params['year']) : Internal.getYearFilter(2020); + // var regionFilter = Internal.getRegionFilter(params['typeRegion'], params['valueRegion']); return [ - // { - // source: 'lapig', - // id: 'uso_solo_terraclass', - // sql: "SELECT a.classe as label, b.color, sum(a.area_ha) as value, (SELECT CAST(SUM(pol_ha) as double precision) FROM regions " + regionFilter + ") as area_mun FROM uso_solo_terraclass as A INNER JOIN graphic_colors as B on a.classe = b.name AND b.table_rel = 'uso_solo_terraclass' " + regionFilter + " GROUP BY 1,2 ORDER BY 3 DESC", - // mantain: true - // }, - // { - // source: 'lapig', - // id: 'uso_solo_probio', - // sql: "SELECT a.classe as label, b.color, sum(a.area_ha) as value, (SELECT CAST(SUM(pol_ha) as double precision) FROM regions " + regionFilter + ") as area_mun FROM uso_solo_probio as A INNER JOIN graphic_colors as B on a.classe = b.name AND b.table_rel = 'uso_solo_probio' " + regionFilter + " GROUP BY 1,2 ORDER BY 3 DESC", - // mantain: true - // }, - // { - // id: 'uso_solo_mapbiomas', - // sql: "SELECT b.name as label, b.color, sum(a.area_ha) as value, (SELECT SUM(pol_ha) FROM regions " + tableRegionsFilter + ") as area_mun, year FROM uso_solo_mapbiomas as A INNER JOIN graphic_colors as B on a.classe = b.class_number AND b.table_rel = 'uso_solo_mapbiomas' " + regionsFilter + " " + year + " GROUP BY 1,2,5 ORDER BY 3 DESC", - // mantain: true - // } { source: 'lapig', - id: 'pasture_quality', - sql: "SELECT b.name as label, b.color, sum(a.area_ha) as value, " - + "(SELECT CAST(SUM(pol_ha) as double precision) FROM regions WHERE " + regionFilter + ") as area_mun " - + "FROM pasture_quality_col6 as A " - + "INNER JOIN graphic_colors as B on cast(a.classe as varchar) = b.class_number AND b.table_rel = 'pasture_quality' " - + "WHERE " + regionFilter - + " AND " + yearFilter - + " GROUP BY 1,2 ORDER BY 3 DESC", + id: 'areaRestorationPerProject', + sql: "SELECT metodo_padrao as label, SUM(area_ha) as value from araticum_restauracao GROUP BY 1 ORDER BY 2 DESC ", mantain: true - }, - // { - // source: 'lapig', - // id: 'biomassa', - // sql: "SELECT a.classe as label, b.color, sum(a.area_ha) as value, (SELECT CAST(SUM(pol_ha) as double precision) FROM regions " + regionFilter + ") as area_mun FROM uso_solo_terraclass as A INNER JOIN graphic_colors as B on a.classe = b.name AND b.table_rel = 'uso_solo_terraclass' " + regionFilter + " GROUP BY 1,2 ORDER BY 3 DESC", - // mantain: true - // }, - + } ]; } Query.area3 = function (params) { - var regionFilter = Internal.getRegionFilter(params['typeRegion'], params['valueRegion']); - var yearFilter = params['year'] ? Internal.getYearFilter(params['year']) : Internal.getYearFilter(2020); + // var regionFilter = Internal.getRegionFilter(params['typeRegion'], params['valueRegion']); // var amount = params['amount'] ? params['amount'] : 10 return [ { source: 'lapig', - id: 'estados', - sql: " SELECT UPPER(uf) AS label, '#d4a31c' as color, SUM(area_ha) as value FROM pasture_col6 " - + "WHERE " + regionFilter - + " AND " + yearFilter - + " GROUP BY 1, 2 ORDER BY 3 DESC;", - // + " LIMIT " + Number(amount) + ";", + id: 'time_series_data3', + sql: "SELECT 'PUT HERE YOUR QUERY'", mantain: true } ] } Query.areatable = function (params) { - var regionFilter = Internal.getRegionFilter(params['typeRegion'], params['valueRegion']); - var yearFilter = params['year'] ? Internal.getYearFilter(params['year']) : Internal.getYearFilter(2020); + // var regionFilter = Internal.getRegionFilter(params['typeRegion'], params['valueRegion']); return [ { source: 'lapig', - id: 'municipios', - sql: "SELECT p.municipio as city, p.cd_geocmu as cityCode, UPPER(p.uf) as uf, SUM(p.st_area_ha) as value FROM pasture_col6 p " - + " WHERE " + regionFilter - + " AND " + yearFilter - + " GROUP BY 1, 2, 3 ORDER BY 3 DESC;", - // + " LIMIT " + Number(amount) + ";", - mantain: true - }, - { - source: 'lapig', - id: 'estados', - sql: " SELECT UPPER(p.uf) AS uf, SUM(p.st_area_ha) as value FROM pasture_col6 p " - + "WHERE " + regionFilter - + " AND " + yearFilter - + " GROUP BY 1 ORDER BY 2 DESC;", - // + " LIMIT " + Number(amount) + ";", - mantain: true - }, - { - source: 'lapig', - id: 'biomas', - sql: " SELECT p.bioma AS biome, SUM(p.st_area_ha) as value FROM pasture_col6 p " - + "WHERE " + regionFilter - + " AND " + yearFilter - + " GROUP BY 1 ORDER BY 2 DESC;", - // + " LIMIT " + Number(amount) + ";", + id: 'projetos', + sql: "SELECT projeto, fonte, SUM(area_ha) as value from araticum_restauracao GROUP BY 1, 2 ORDER BY 3 DESC ", mantain: true } ] diff --git a/src/server/database/queries/map.js b/src/server/database/queries/map.js index 46c3dd1..ca98216 100644 --- a/src/server/database/queries/map.js +++ b/src/server/database/queries/map.js @@ -4,8 +4,12 @@ module.exports = function (app) { var Query = {}; Query.defaultParams = { - 'type': 'bioma', - 'region': 'Cerrado' + type: 'bioma', + value: 'CERRADO' + } + + Internal.textDefaultParams = function () { + return Query.defaultParams.type + " ILIKE '" + Query.defaultParams.value + "'" } Query.extent = function (params) { @@ -22,11 +26,11 @@ module.exports = function (app) { source: 'general', id: 'search', sql: "With priority_search AS (" - + " SELECT distinct concat_ws(' - ', text , uf) as text, value, type, 1 AS priority FROM regions_geom " - + "WHERE unaccent(text) ILIKE unaccent(${key}) AND type NOT in ('country') " + + " SELECT distinct concat_ws(' - ', text , uf) as text, value, type, 1 AS priority FROM v_regions_geom_cerrado_cities_states " + + "WHERE unaccent(text) ILIKE unaccent(${key}) AND type NOT in ('country', 'biome') " + "UNION ALL " - + "SELECT distinct concat_ws(' - ', text , uf) as text, value, type, 2 AS priority FROM regions_geom " - + "WHERE unaccent(text) ILIKE unaccent(${key}%) AND type NOT in ('country') )" + + "SELECT distinct concat_ws(' - ', text , uf) as text, value, type, 2 AS priority FROM v_regions_geom_cerrado_cities_states " + + "WHERE unaccent(text) ILIKE unaccent(${key}%) AND type NOT in ('country', 'biome') )" + "select * from priority_search order by priority asc limit 10", mantain: true }] @@ -51,21 +55,31 @@ module.exports = function (app) { }] } - Query.cars = function () { - return [{ - source: 'general', - id: 'search', - sql: "SELECT car_code as text, area_ha, ST_AsGeoJSON(geom) geojson FROM car_brasil WHERE unaccent(car_code) ILIKE unaccent(${key}%) order by area_ha DESC LIMIT 10", - mantain: true - }] + Query.cars = function (params) { + var key = params['key'] + console.log("SELECT cod_car as text, area_ha, ST_AsGeoJSON(geom) as geojson FROM geo_car_imovel WHERE " + Internal.textDefaultParams() + " AND unaccent(cod_car) ILIKE unaccent('" + key + "%') order by area_ha DESC LIMIT 10") + return [ + // { + // source: 'general', + // id: 'search', + // sql: "SELECT cod_car as text, area_ha, ST_AsGeoJSON(geom) geojson FROM car_brasil WHERE " + Internal.textDefaultParams() + " AND unaccent(car_code) ILIKE unaccent('" + key + "%') order by area_ha DESC LIMIT 10", + // mantain: true + // }, + { + source: 'lapig', + id: 'search', + sql: "SELECT cod_car as text, area_ha, ST_AsGeoJSON(geom) as geojson FROM geo_car_imovel WHERE " + Internal.textDefaultParams() + " AND unaccent(cod_car) ILIKE unaccent(${key}%) order by area_ha DESC LIMIT 10", + mantain: true + }] } Query.ucs = function (params) { var key = params['key'] + // console.log("SELECT nome || ' - ' || uf as text, uf, cd_geocmu, ST_AsGeoJSON(geom) geojson FROM ucs WHERE " + Internal.textDefaultParams() + " AND unaccent(nome) ILIKE unaccent('%" + key + "%') order by nome ASC LIMIT 10") return [{ source: 'general', id: 'search', - sql: "SELECT nome || ' - ' || uf as text, uf, cd_geocmu, ST_AsGeoJSON(geom) geojson FROM ucs WHERE unaccent(nome) ILIKE unaccent('%" + key + "%') order by nome ASC LIMIT 10", + sql: "SELECT nome || ' - ' || uf as text, uf, cd_geocmu, ST_AsGeoJSON(geom) geojson FROM ucs WHERE " + Internal.textDefaultParams() + " AND unaccent(nome) ILIKE unaccent('%" + key + "%') order by nome ASC LIMIT 10", mantain: true }] } diff --git a/src/server/database/queries/upload.js b/src/server/database/queries/upload.js index e910c05..7e40db2 100644 --- a/src/server/database/queries/upload.js +++ b/src/server/database/queries/upload.js @@ -24,9 +24,31 @@ module.exports = function (app) { sql: "select ST_ASGEOJSON(ST_Transform(ST_Multi(ST_Union(geom)), 4674)) as geojson from upload_shapes where token= ${token} ", mantain: true } + ] } + Query.analysisaraticum = function (params) { + + const token = params['token'] + const sql_initiaves_pershape = "select distinct organizacao from or_cerrado_iniciativas_2022_araticum a INNER JOIN fdw_general.upload_shapes up on ST_INTERSECTS(a.geom, up.geom) where up.token= ${token} "; + const sql_projects_pershape = "select a.projeto, a.metodo_padrao, SUM(area_ha) area_restaurada from araticum_restauracao a INNER JOIN fdw_general.upload_shapes up on ST_INTERSECTS(a.geom, up.geom) where up.token= ${token} group by 1,2 "; + + return [ + { + source: 'lapig', + id: 'initiaves_pershape', + sql: sql_initiaves_pershape, + mantain: true + }, + { + source: 'lapig', + id: 'projects_pershape', + sql: sql_projects_pershape, + mantain: true + } + ] + } Query.findgeojsonbytoken = function (params) { return [{ @@ -41,18 +63,17 @@ module.exports = function (app) { sql: "select ST_ASGEOJSON(ST_Transform(ST_Multi(ST_Union(geom)), 4674)) as geojson from upload_shapes where token= ${token}", mantain: true } - ] } Query.getanalysis = function (params) { - - return [{ - source: 'general', - id: 'return_analysis', - sql: "SELECT gid, token, analysis, TO_CHAR(date,'DD/MM/YYYY HH:mm:ss') as data FROM area_analysis WHERE token = ${token};", - mantain: true - } + return [ + { + source: 'general', + id: 'return_analysis', + sql: "SELECT gid, token, analysis, TO_CHAR(date,'DD/MM/YYYY HH:mm:ss') as data FROM area_analysis WHERE token = ${token} and unaccent(origin) ilike unaccent(${origin}) order by date desc limit 1;", + mantain: true + } ] } @@ -62,85 +83,12 @@ module.exports = function (app) { return [{ source: 'general', id: 'store', - sql: "INSERT INTO area_analysis(token, analysis, date) VALUES ('" + params['token'] + "', '" + params['analysis'] + "', NOW()) RETURNING token;", + sql: "INSERT INTO area_analysis(token, analysis, date, origin) VALUES ('" + params['token'] + "', '" + params['analysis'] + "', NOW(), '" + params['origin'] + "') RETURNING token;", mantain: true } ] }; - /**Other methods to copy later */ - - - Query.queimadas = function (params) { - - var token = params['token'] - return [{ - source: 'lapig', - id: 'queimadas', - sql: "SELECT p.year, SUM((ST_AREA(ST_Intersection(ST_MAKEVALID(p.geom),up.geom)::GEOGRAPHY) / 1000000.0)*100.0) as area_queimada FROM bi_ce_queimadas_250_lapig p " + - " INNER JOIN upload_shapes up on ST_INTERSECTS(p.geom, up.geom) where p.year IS NOT NULL and up.token= ${token} GROUP BY 1 order by 1 desc", - mantain: true - } - ] - } - - Query.pastagem = function (params) { - - var token = params['token'] - return [{ - source: 'lapig', - id: 'pastagem', - sql: "SELECT p.year, SUM((ST_AREA(ST_Intersection(st_multi(st_collectionextract(ST_MAKEVALID(p.wkb_geometry),3)),up.geom)::GEOGRAPHY) / 1000000.0)*100.0) as area_pastagem " + - "FROM pasture p INNER JOIN upload_shapes up on ST_INTERSECTS(p.wkb_geometry, up.geom) where p.year IS NOT NULL " + - "and up.token= ${token} GROUP BY 1 order by 1 desc", - mantain: true - } - ] - } - - Query.prodes = function (params) { - var token = params['token'] - return [{ - source: 'lapig', - id: 'prodes', - sql: "SELECT p.year, SUM((ST_AREA(ST_Intersection(p.geom,up.geom)::GEOGRAPHY) / 1000000.0)*100.0) as area_desmat FROM desmatamento_prodes p INNER JOIN upload_shapes up on ST_INTERSECTS(p.geom, up.geom) where p.year IS NOT NULL and up.token= ${token} GROUP BY 1 order by 1 desc", - mantain: true, - } - - ] - } - - Query.terraclass = function (params) { - - var token = params['token'] - return [{ - source: 'lapig', - id: 'terraclass', - sql: "SELECT b.name as lulc, b.color as color, SUM((ST_AREA(safe_intersection(ST_MAKEVALID(p.geom),up.geom)::GEOGRAPHY) / 1000000.0)*100.0) as area_lulc FROM uso_solo_terraclass p INNER JOIN graphic_colors b on unaccent(b.name) ilike unaccent(p.classe) AND b.table_rel = 'uso_solo_terraclass' " + - " INNER JOIN upload_shapes up on ST_INTERSECTS(p.geom, up.geom) " + - " where up.token= ${token}" + - " GROUP BY 1,2 ORDER BY 3 DESC", - mantain: true - } - ] - } - - Query.mapbiomas = function (params) { - - var token = params['token'] - return [{ - source: 'lapig', - id: 'mapbiomas', - sql: "SELECT b.name as lulc, b.color as color, SUM((ST_AREA(safe_intersection(st_multi(st_collectionextract(ST_MAKEVALID(ST_TRANSFORM(p.wkb_geometry,4674)),3)),up.geom)::GEOGRAPHY) / 1000000.0)*100.0) as area_lulc FROM uso_solo_mapbiomas p INNER JOIN graphic_colors b on unaccent(b.name) ilike unaccent(p.classe) AND b.table_rel = 'uso_solo_mapbiomas' " + - " INNER JOIN upload_shapes up on ST_INTERSECTS(ST_TRANSFORM(p.wkb_geometry,4674), up.geom) " + - " where p.year = 2018 and up.token= ${token} " + - " GROUP BY 1,2 ORDER BY 3 DESC", - mantain: true - } - ] - } - - return Query; }; \ No newline at end of file diff --git a/src/server/descriptor/groups/climate_adaptation.json b/src/server/descriptor/groups/climate_adaptation.json new file mode 100644 index 0000000..2ee21af --- /dev/null +++ b/src/server/descriptor/groups/climate_adaptation.json @@ -0,0 +1,99 @@ +[ + { + "idGroup": "climate_adaptation", + "labelGroup": "translate", + "groupExpanded": false, + "layers": [ + { + "idLayer": "anacardium_humile", + "labelLayer": "Cajuzinho-do-cerrado (Anacardium humile)", + "visible": false, + "selectedType": "anacardium_humile", + "types": [ + "anacardium_humile" + ] + }, + { + "idLayer": "annona_crassiflora", + "labelLayer": "Araticum (Annona crassiflora)", + "visible": false, + "selectedType": "annona_crassiflora", + "types": [ + "annona_crassiflora" + ] + }, + { + "idLayer": "attalea_speciosa", + "labelLayer": "Babaçu (Attalea speciosa)", + "visible": false, + "selectedType": "attalea_speciosa", + "types": [ + "attalea_speciosa" + ] + }, + { + "idLayer": "byrsonima_crassifolia", + "labelLayer": "Murici (Byrsonima crassifolia)", + "visible": false, + "selectedType": "byrsonima_crassifolia", + "types": [ + "byrsonima_crassifolia" + ] + }, + { + "idLayer": "caryocar_brasiliense", + "labelLayer": "Pequi (Caryocar brasiliense)", + "visible": false, + "selectedType": "caryocar_brasiliense", + "types": [ + "caryocar_brasiliense" + ] + }, + { + "idLayer": "dipteryx_alata", + "labelLayer": "Baru (Dipteryx alata)", + "visible": false, + "selectedType": "dipteryx_alata", + "types": [ + "dipteryx_alata" + ] + }, + { + "idLayer": "eugenia_dysenterica", + "labelLayer": "Cagaita (Eugenia dysenterica)", + "visible": false, + "selectedType": "eugenia_dysenterica", + "types": [ + "eugenia_dysenterica" + ] + }, + { + "idLayer": "hancornia_speciosa", + "labelLayer": "Mangaba (Hancornia speciosa)", + "visible": false, + "selectedType": "hancornia_speciosa", + "types": [ + "hancornia_speciosa" + ] + }, + { + "idLayer": "syagrus_oleracea", + "labelLayer": "Guariroba (Syagrus oleracea)", + "visible": false, + "selectedType": "syagrus_oleracea", + "types": [ + "syagrus_oleracea" + ] + }, + { + "idLayer": "syngonanthus_nitens", + "labelLayer": "Capim-dourado (Syngonanthus nitens)", + "visible": false, + "selectedType": "syngonanthus_nitens", + "types": [ + "syngonanthus_nitens" + ] + } + ] + } +] \ No newline at end of file diff --git a/src/server/descriptor/groups/reflorestamento.json b/src/server/descriptor/groups/reflorestamento.json index 581c635..0750100 100644 --- a/src/server/descriptor/groups/reflorestamento.json +++ b/src/server/descriptor/groups/reflorestamento.json @@ -2,17 +2,17 @@ { "idGroup": "reflorestamento", "labelGroup": "translate", - "groupExpanded": true, + "groupExpanded": false, "layers": [ { - "idLayer": "reflorestamento_araticum", + "idLayer": "floresta_plantada", "labelLayer": "translate", - "visible": true, - "selectedType": "areas_reflorestamento_araticum", + "visible": false, + "selectedType": "floresta_plantada_mapbiomas", "types": [ - "areas_reflorestamento_araticum" + "floresta_plantada_mapbiomas" ] } ] } -] \ No newline at end of file +] diff --git a/src/server/descriptor/groups/regeneration_potential.json b/src/server/descriptor/groups/regeneration_potential.json new file mode 100644 index 0000000..e742d31 --- /dev/null +++ b/src/server/descriptor/groups/regeneration_potential.json @@ -0,0 +1,18 @@ +[ + { + "idGroup": "regeneration_potential", + "labelGroup": "translate", + "groupExpanded": false, + "layers": [ + { + "idLayer": "regeneration_potential", + "labelLayer": "translate", + "visible": false, + "selectedType": "regeneration_potential", + "types": [ + "regeneration_potential" + ] + } + ] + } +] \ No newline at end of file diff --git a/src/server/descriptor/groups/restauracao.json b/src/server/descriptor/groups/restauracao.json new file mode 100644 index 0000000..ab1ca0b --- /dev/null +++ b/src/server/descriptor/groups/restauracao.json @@ -0,0 +1,27 @@ +[ + { + "idGroup": "restauracao", + "labelGroup": "translate", + "groupExpanded": true, + "layers": [ + { + "idLayer": "restauracao_araticum", + "labelLayer": "translate", + "visible": true, + "selectedType": "areas_restauracao_araticum", + "types": [ + "areas_restauracao_araticum" + ] + }, + { + "idLayer": "projetos_araticum", + "labelLayer": "translate", + "visible": false, + "selectedType": "or_cerrado_iniciativas_2022_araticum", + "types": [ + "or_cerrado_iniciativas_2022_araticum" + ] + } + ] + } +] \ No newline at end of file diff --git a/src/server/package.json b/src/server/package.json index b04dd8b..fb202fa 100755 --- a/src/server/package.json +++ b/src/server/package.json @@ -47,7 +47,7 @@ "multer": "^1.4.3", "node-mime": "^1.0.0", "node-schedule": "~2.0.0", - "ogr2ogr": "^3.1.0", + "ogr2ogr": "^2.1.1", "on": "^1.3.0", "pg": "^8.7.1", "pg-connection-string": "^2.5.0", diff --git a/src/server/routes/map.js b/src/server/routes/map.js index ea2654b..900341c 100644 --- a/src/server/routes/map.js +++ b/src/server/routes/map.js @@ -5,7 +5,7 @@ module.exports = function (app) { app.get('/service/map/descriptor', map.descriptor); app.get('/service/map/extent', dataInjector, map.extent); - app.get('/service/map/search', dataInjector); + app.get('/service/map/search', dataInjector, map.search); app.get('/service/map/searchregion', dataInjector); app.get('/service/map/getowsdomain', map.host); app.get('/service/map/cdgeocmu', dataInjector); diff --git a/src/server/routes/upload.js b/src/server/routes/upload.js index 0806f94..4207c34 100755 --- a/src/server/routes/upload.js +++ b/src/server/routes/upload.js @@ -6,13 +6,9 @@ module.exports = function (app) { app.post('/service/upload/spatial-file', filesAccepted, uploader.getGeoJson); app.get('/service/upload/areainfo', dataInjector, uploader.areainfo); + app.get('/service/upload/analysisaraticum', dataInjector, uploader.analysisaraticum); app.get('/service/upload/analysisarea', dataInjector, uploader.analysisarea); app.get('/service/upload/findgeojsonbytoken', dataInjector, uploader.findGeoJsonByToken); - app.get('/service/upload/queimadas', dataInjector, uploader.queimadas); - app.get('/service/upload/pastagem', dataInjector, uploader.pastagem); - app.get('/service/upload/terraclass', dataInjector, uploader.terraclass); - app.get('/service/upload/mapbiomas', dataInjector, uploader.mapbiomas); - app.get('/service/upload/prodes', dataInjector, uploader.prodes); app.post('/service/upload/savegeom', uploader.saveDrawedGeom); app.get('/service/upload/getanalysis', dataInjector, uploader.getAnalysis); app.post('/service/upload/saveanalysis', dataInjector, uploader.saveAnalysis); diff --git a/src/server/utils/descriptorBuilder.js b/src/server/utils/descriptorBuilder.js index d2cf766..859ce54 100644 --- a/src/server/utils/descriptorBuilder.js +++ b/src/server/utils/descriptorBuilder.js @@ -84,10 +84,12 @@ module.exports = function (app) { Internal.getGroupsOrder = function () { return [ + 'restauracao', + 'climate_adaptation', + 'regeneration_potential', 'reflorestamento', 'areas_especiais', 'areas_declaradas', - 'agropecuaria', 'infraestrutura', 'imagens' ]
@@ -217,16 +444,14 @@

{{chart.text}}

- {{rowData[col.field]}} + {{rowData[col.dataKey]}}