wiki:server/bdqueimadas

Version 20 (modified by jean.souza, 10 years ago) (diff)

--

TerraMA² - Configuração BDQueimadas

PostgreSQL

1. Crie um banco de dados chamado queimadas.

2. Remova a role public da lista de acesso a este banco.

3. Crie as seguintes contas de usuário, sem privilégios de super-usuário:

  • jean
  • gribeiro
  • appqueimadas

4. Atribua os seguintes privilégios:

GRANT connect ON DATABASE queimadas TO gribeiro, jean, appqueimadas;

GRANT all ON DATABASE queimadas TO jean;

GRANT SELECT ON ALL TABLES IN SCHEMA public TO gribeiro, appqueimadas;

GeoServer?

5. No GeoServer?, crie uma workspace:

Data -> Workspaces -> Add new workspace

    Name: queimadas
    Namespace URI: http://www.inpe.br/queimadas

6. Registre o servidor PostgreSQL como uma fonte de dados do GeoServer?:

Data -> Stores -> Add new Store -> PostGIS

As seguintes opções foram utilizadas:

Workspace: queimadas

Data Source Name: queimadas

Description: Banco de Dados de Queimadas

database: queimadas

user: appqueimadas

max connections: 16

fetch size: 5000

Loose bbox: true

Estimated Extents: true

encode functions: true

Support on the fly geometry simplifictaion: false

7. Criar estilos para as camadas:

Data -> Styles -> Add a new style

Estilo Situação Atual:

Name: Situacao Atual

Workspace: queimadas

Colar o seguinte texto na área de texto:

<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.0.0"
    xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
    xmlns="http://www.opengis.net/sld"
    xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NamedLayer>
    <Name>Situacao Atual</Name>
    <UserStyle>
      <Title>Situacao Atual</Title>
      <FeatureTypeStyle>
        <Rule>
          <ogc:Filter>
            <ogc:PropertyIsEqualTo>
              <ogc:PropertyName>count</ogc:PropertyName>
              <ogc:Literal>0</ogc:Literal>
            </ogc:PropertyIsEqualTo>
          </ogc:Filter>
          <PolygonSymbolizer>
            <Fill>
              <CssParameter name="fill">#FFEBCD</CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name="stroke">#000000</CssParameter>
              <CssParameter name="stroke-width">2</CssParameter>
            </Stroke>
          </PolygonSymbolizer>
        </Rule>
        <Rule>
          <ogc:Filter>
            <ogc:And>
              <ogc:PropertyIsGreaterThan>
                <ogc:PropertyName>count</ogc:PropertyName>
                <ogc:Literal>0</ogc:Literal>
              </ogc:PropertyIsGreaterThan>
              <ogc:PropertyIsLessThan>
                <ogc:PropertyName>count</ogc:PropertyName>
                <ogc:Literal>101</ogc:Literal>
              </ogc:PropertyIsLessThan>
            </ogc:And>
          </ogc:Filter>
          <PolygonSymbolizer>
            <Fill>
              <CssParameter name="fill">#FFC387</CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name="stroke">#000000</CssParameter>
              <CssParameter name="stroke-width">2</CssParameter>
            </Stroke>
          </PolygonSymbolizer>
        </Rule>
        <Rule>
          <ogc:Filter>
            <ogc:And>
              <ogc:PropertyIsGreaterThan>
                <ogc:PropertyName>count</ogc:PropertyName>
                <ogc:Literal>100</ogc:Literal>
              </ogc:PropertyIsGreaterThan>
              <ogc:PropertyIsLessThan>
                <ogc:PropertyName>count</ogc:PropertyName>
                <ogc:Literal>501</ogc:Literal>
              </ogc:PropertyIsLessThan>
            </ogc:And>
          </ogc:Filter>
          <PolygonSymbolizer>
            <Fill>
              <CssParameter name="fill">#FAA046</CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name="stroke">#000000</CssParameter>
              <CssParameter name="stroke-width">2</CssParameter>
            </Stroke>
          </PolygonSymbolizer>
        </Rule>
        <Rule>
          <ogc:Filter>
            <ogc:And>
              <ogc:PropertyIsGreaterThan>
                <ogc:PropertyName>count</ogc:PropertyName>
                <ogc:Literal>500</ogc:Literal>
              </ogc:PropertyIsGreaterThan>
              <ogc:PropertyIsLessThan>
                <ogc:PropertyName>count</ogc:PropertyName>
                <ogc:Literal>1001</ogc:Literal>
              </ogc:PropertyIsLessThan>
            </ogc:And>
          </ogc:Filter>
          <PolygonSymbolizer>
            <Fill>
              <CssParameter name="fill">#FA872D</CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name="stroke">#000000</CssParameter>
              <CssParameter name="stroke-width">2</CssParameter>
            </Stroke>
          </PolygonSymbolizer>
        </Rule>
        <Rule>
          <ogc:Filter>
            <ogc:And>
              <ogc:PropertyIsGreaterThan>
                <ogc:PropertyName>count</ogc:PropertyName>
                <ogc:Literal>1000</ogc:Literal>
              </ogc:PropertyIsGreaterThan>
              <ogc:PropertyIsLessThan>
                <ogc:PropertyName>count</ogc:PropertyName>
                <ogc:Literal>5001</ogc:Literal>
              </ogc:PropertyIsLessThan>
            </ogc:And>
          </ogc:Filter>
          <PolygonSymbolizer>
            <Fill>
              <CssParameter name="fill">#FA5C25</CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name="stroke">#000000</CssParameter>
              <CssParameter name="stroke-width">2</CssParameter>
            </Stroke>
          </PolygonSymbolizer>
        </Rule>
        <Rule>
          <ogc:Filter>
            <ogc:And>
              <ogc:PropertyIsGreaterThan>
                <ogc:PropertyName>count</ogc:PropertyName>
                <ogc:Literal>5000</ogc:Literal>
              </ogc:PropertyIsGreaterThan>
              <ogc:PropertyIsLessThan>
                <ogc:PropertyName>count</ogc:PropertyName>
                <ogc:Literal>25001</ogc:Literal>
              </ogc:PropertyIsLessThan>
            </ogc:And>
          </ogc:Filter>
          <PolygonSymbolizer>
            <Fill>
              <CssParameter name="fill">#C34231</CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name="stroke">#000000</CssParameter>
              <CssParameter name="stroke-width">2</CssParameter>
            </Stroke>
          </PolygonSymbolizer>
        </Rule>
        <Rule>
          <ogc:Filter>
            <ogc:And>
              <ogc:PropertyIsGreaterThan>
                <ogc:PropertyName>count</ogc:PropertyName>
                <ogc:Literal>25000</ogc:Literal>
              </ogc:PropertyIsGreaterThan>
              <ogc:PropertyIsLessThan>
                <ogc:PropertyName>count</ogc:PropertyName>
                <ogc:Literal>50001</ogc:Literal>
              </ogc:PropertyIsLessThan>
            </ogc:And>
          </ogc:Filter>
          <PolygonSymbolizer>
            <Fill>
              <CssParameter name="fill">#A21C0D</CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name="stroke">#000000</CssParameter>
              <CssParameter name="stroke-width">2</CssParameter>
            </Stroke>
          </PolygonSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

Estilo Países:

Name: Paises

Workspace: queimadas

Colar o seguinte texto na área de texto:

<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.0.0"
    xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
    xmlns="http://www.opengis.net/sld"
    xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NamedLayer>
    <Name>Paises</Name>
    <UserStyle>
      <Title>Paises</Title>
      <FeatureTypeStyle>
        <Rule>
          <PolygonSymbolizer>
            <Fill>
              <CssParameter name="fill">#FFEBCD</CssParameter>
              <CssParameter name="fill-opacity">0</CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name="stroke">#FF8C00</CssParameter>
              <CssParameter name="stroke-width">3</CssParameter>
            </Stroke>
          </PolygonSymbolizer>
         </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

Estilo Estados:

Name: Estados

Workspace: queimadas

Colar o seguinte texto na área de texto:

<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.0.0"
    xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
    xmlns="http://www.opengis.net/sld"
    xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NamedLayer>
    <Name>Estados</Name>
    <UserStyle>
      <Title>Estados</Title>
      <FeatureTypeStyle>
        <Rule>
          <PolygonSymbolizer>
            <Fill>
              <CssParameter name="fill">#1E90FF</CssParameter>
              <CssParameter name="fill-opacity">0</CssParameter>
            </Fill>
            <Stroke>
              <CssParameter name="stroke">#FFFF00</CssParameter>
              <CssParameter name="stroke-width">2</CssParameter>
            </Stroke>
          </PolygonSymbolizer>
         </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

Estilo Focos:

Name: Focos

Workspace: queimadas

Colar o seguinte texto na área de texto:

<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.0.0"
    xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd"
    xmlns="http://www.opengis.net/sld"
    xmlns:ogc="http://www.opengis.net/ogc"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <NamedLayer>
    <Name>Focos</Name>
    <UserStyle>
      <Title>Focos</Title>
      <FeatureTypeStyle>
        <Rule>
          <PointSymbolizer>
            <Graphic>
              <Mark>
                <WellKnownName>cross</WellKnownName>
                <Fill>
                  <CssParameter name="fill">#FF0000</CssParameter>
                </Fill>
              </Mark>
              <Size>8</Size>
            </Graphic>
          </PointSymbolizer>
        </Rule>
      </FeatureTypeStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

8. Criar as camadas:

Data -> Layers -> Add a new resource

Add layer from: queimadas:queimadas

Obs.: o texto queimadas:queimadas// é a concatenação de: workspace:store//.

Iremos selecionar a opção Action: publish para as seguintes camadas:

  • estados
  • focos_de_2016_04_01_a_2016_05_05
  • paises

Na aba Data, iremos Computar os bounding box de cada layer:

  • Bounding Boxes / Native Bounding Box
  • Bounding Boxes / Lat/Lon? Bounding Box

Na aba Publishing iremos:

  • Na seção WMS, selecionar os estilos de cada camada

9. Criar dois novos layers a partir de consultas:

Para o primeiro layer:

  • Na opção Layers -> Add new resource -> Add layer from: queimadas:queimadas -> Consigure new SQL view...
  • Nome: situacao_atual_paises
  • SQL:
    select a.wkb_geometry as geom, a.name as country, sum(coalesce(b.count, 0)) as count from (select pais, count(pais) as count from public.focos_de_2016_04_01_a_2016_05_05 where data between %begin% and %end% and satelite like '%%satellite%%' group by pais) b right outer join public.paises_bdq c on (c.pais = b.pais) right outer join public.countries a on (a.ogc_fid = c.ogc_fid) group by a.name, a.wkb_geometry order by a.name
    
  • Selecione: Guess parameters from SQL
  • Para o campo satellite remover a validação de expressão regular.
  • Para os campos begin e end, colocar na coluna "Default value" o valor: 00000000
  • Save
  • Declared SRS: EPSG:4326
  • Compute from data
  • Compute from native bounds
  • Aba Publishing => WMS Settings - Default Style: queimadas:Situacao Atual
  • Save

Para o segundo layer:

  • Na opção Layers -> Add new resource -> Add layer from: queimadas:queimadas -> Consigure new SQL view...
  • Nome: situacao_atual_estados
  • SQL:
    select a.geom as geom, a.name_1 as state, coalesce(b.count, 0) as count from (select uf, count(uf) as count from public.focos_de_2016_04_01_a_2016_05_05 where data between %begin% and %end% and satelite like '%%satellite%%' group by uf) b right outer join public.estados a on (a.nome_bdq = b.uf) where id_0 = %country%
    
  • Selecione: Guess parameters from SQL
  • Para o campo satellite remover a validação de expressão regular.
  • Para os campos begin e end, colocar na coluna "Default value" o valor: 00000000
  • Para o campo country, colocar na coluna "Default value" o valor: 33 (id do Brasil)
  • Save
  • Declared SRS: EPSG:4326
  • Compute from data
  • Compute from native bounds
  • Aba Publishing => WMS Settings - Default Style: queimadas:Situacao Atual
  • Save

Aplicação Node.js

10. Instale o Node.js:

curl -sL https://deb.nodesource.com/setup_4.x

sudo apt-get install -y nodejs

11. Instale o pacote do Ubuntu chamado build-essential:

sudo apt-get install -y build-essential

12. Crie uma pasta para hospedar a aplicação bdqueimadas:

mkdir ~/bdqueimadas

cd ~/bdqueimadas

git clone https://github.com/TerraMA2/bdqueimadas.git .

13. Execute o seguinte comando:

npm install

14. Na pasta configurations, forneça arquivos de configuração compatíveis com sua infreestrutura.

15. Volte para o diretório raiz do bdqueimadas e execute o comando abaixo se você for rodá-la pelo npm:

npm start

Por padrão o sistema vai rodar na porta 38000. Caso deseje alterar, acesse o arquivo bdqueimadas/bin/www:

var portNumber = '38000';

Verifique se você consegue acessar a aplicação pelo navegador: http://localhost:38000

16. Instalar o "Advanced, production process manager for Node.js":

Site: http://pm2.keymetrics.io

npm install pm2 -g 

Para inicializar a aplicação em backgroud:

cd ~/bdqueimadas

pm2 start --name=bdqueimadas bin/www

Verifique se você consegue acessar a aplicação pelo navegador: http://localhost:38000

17. Instalar o nginx:

Site: https://www.nginx.com

sudo apt-get install nginx

Na pasta /etc/nginx/sites-enabled criar o arquivo queimadas com o seguinte conteúdo:

server {
  server_name http://terrama2.dpi.inpe.br;
  listen 6543;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://127.0.0.1:38000;
    proxy_redirect off;
  }
}

Na mesma pasta criar o arquivo geoserver com o seguinte conteúdo:

server {
  server_name http://terrama2.dpi.inpe.br;
  listen 6544;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://127.0.0.1:8080/queimadas-geoserver/;
    proxy_redirect off;
  }
}

17. Reinicialize o nginx:

sudo service nginx restart

Acesse os seguintes endereços no navegador para testar o acesso externo ao BDQueimadas e ao GeoServer?, respectivamente:

http://www.dpi.inpe.br/queimadas

http://www.dpi.inpe.br/queimadas-geoserver

Dicas

A tabela estados possui 3496 linhas, com geometrias do tipo MultiPolygon?. Estas geometrias possuem em média 9935 vértices, sendo o total de 34.732.383 vértices. Considerando que cada vértices é formado por uma componente x e outra y, representadas por números de 8-bytes, temos um espaço de armazenamento em RAM de aproximadamente ~529.98 MiB.

SELECT SUM(ST_NPoints(geom)) AS num_pts,  (SUM(ST_NPoints(geom)) * 2.0 * 8.0) / (1024.0*1024.0) FROM estados;

As geometrias (MultiPolygon?) da tabela paises, 256 linhas com cada geometria tendo em média 123.650, possuem 31.654.555 vértices, que ocupam aproximadamente ~483.01 MiB.

SELECT SUM(ST_NPoints(geom)) AS num_pts,  (SUM(ST_NPoints(geom)) * 2.0 * 8.0) / (1024.0*1024.0) FROM paises;

As geometrias (Point) da tabela focos, 181.859 linhas, possuem 181.859 vértices, que ocupam aproximadamente ~2.77 MiB.

SELECT SUM(ST_NPoints(geom)) AS num_pts,  (SUM(ST_NPoints(geom)) * 2.0 * 8.0) / (1024.0*1024.0) FROM focos_de_2016_04_01_a_2016_05_05;

No psql, podemos ativar a medição de tempo das operações com o seguinte comando:

\timing on

No psql, podemos redirecionar a saída das consultas para um arquivo:

\o /home/terrama2/Downloads/saida.txt

No psql, devemos alterar o alinhamento do texto produzido pela consulta:

\a

Para medir o tempo de recuperar todas as linhas de cada tabela do BDQueimadas:

\o /home/terrama2/Downloads/estados.txt
SELECT * FROM estados;
Time: 3733,414 ms

\o /home/terrama2/Downloads/focos.txt
SELECT * FROM focos_de_2016_04_01_a_2016_05_05;
Time: 703,639 ms

\o /home/terrama2/Downloads/paises.txt
SELECT * FROM paises;
Time: 4006,834 ms