| 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
