Cálculo da Cobertura de Bombeiros

From OpenStreetMap Wiki
Jump to: navigation, search

Cálculo da Cobertura de Bombeiros e Risco de Incêndio em Portugal Continental

Objectivo

O objectivo desta página apresenta-se em duas partes:

- Em primeiro lugar: Pretende-se calcular de forma sistemática quantas corporações estão já identificadas no OSM e quantas faltam mapear.

- Em segundo lugar: Pretende-se calcular uma média de risco de incêndio por município em Portugal Continental.

Introdução

Para a realização da primeira e da segunda partes, foram realizadas várias querys, a tabelas armazenadas na base de dados opensource PostgreSQL.

Foi, também, utilizado o sistema de informação geográfica opensource QuantumGis.

Preparação dos dados

Obter os dados sobre as corporações existentes

O mapa com todas as corporações disponíveis encontra-se em: http://scrif.igeo.pt/ASP/cbmapa.asp

Clicando numa determinada corporação, visualizam-se os detalhes da mesma. Esses detalhes são obtidos através de uma URL da forma:

curl http://scrif.igeo.pt/ASP/cb_dados.asp?cod=31500 -o bombeiros_31500.html

Com os passos seguintes, sistematiza-se o processo de obter os detalhes de todas as corporações. Pra tal, precisamos de saber os códigos de cada corporação e, com esses códigos, geramos uma script que vai buscar os detalhes.

Obter os códigos dos corporações:

curl http://scrif.igeo.pt/ASP/cbmapa.asp -o mapa.html
mkdir corporacoes
grep -o "cb_dados.asp?cod=[0-9]\+" mapa.html | grep -o "[0-9]\+" | sed 's/\([0-9]\+\)/curl http:\/\/scrif.igeo.pt\/ASP\/cb_dados.asp?cod=\1 -o corporacoes\/bombeiros_\1.html/g' > sacabombeiros.sh
chmod +x sacabombeiros.sh
./sacabombeiros.sh

Com esta operação, obtêm-se os detalhes em HTML (HTML miserável, cheio de erros) de x corporações.

Para filtrar a informação contida nesta espécie de HTML, é necessário passar um filtro para limpar uma parte do HTML que não interessa e depois transformar o HTML restante para uma lista de campos separados por |.

O filtro limpa.py é um pequeno programa Python que pega num HTML e gera apenas uma parte do HTML, entre o início das tabelas e o fim das mesmas. Só aproveitamos o HTML das tabelas.

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import sys
import re
ok = False;
tabela = 0;
anterior = ''
print '''
<?xml version="1.0" encoding="ISO-8859-1"?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
</head>
<body>
'''
for line in sys.stdin.readlines():
	# if re.search('</TABLE><TABLE', line):
	if re.search('<TABLE style="width: 100%;" CELLSPACING=0 BORDER=1 CELLPADDING=3>', line):
		line = re.sub('<TABLE>','', line)
		ok = True
	if ok:
		if re.search('<TR>', anterior):
			if not re.search('</TD>', line):
				print re.sub('&','e', line),
		else:
			# print re.sub('&','e', line),
			print line),
		if re.search('</TABLE>', line):
			tabela = tabela + 1
			if tabela >= 2:
				ok = False
	anterior = line
print '''
</body>
</html>
'''

Depois de passar pelo filtro anterior, extraímos apenas a informação sem nenhumas tags. Toda a informação fica resumida a uma linha. Ou seja, cada documento HTML fica transformado numa única linha.

Para aproveitar apenas a informação sem as tags, usou-se um pequeno documento XSLT esmiuça.xslt e o comando xmlstarlet.

<?xml version="1.0" encoding="ISO-8859-15"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes">
	<xsl:output version="1.0" encoding="ISO-8859-15" method="text" indent="no" omit-xml-declaration="yes"/>
	<xsl:strip-space elements="*"/>
	<xsl:template match="text()|@*">
		<xsl:value-of select="."/>
		<xsl:text>|</xsl:text>
	</xsl:template>
</xsl:stylesheet>

Juntando todas as linhas num único ficheiro, ficamos com um CSV, em que os campos estão separados por |.

Resumir os detalhes de todas as corporações a um único ficheiro:

for f in corporacoes/bombeiros_*.html; do cat $f | ./limpa.py | sed 's/^M//g' | xmlstarlet tr --html esmiuça.xslt | iconv --from-code=ISO-8859-1 --to-code=UTF-8 | tr "\n" " " | sed 's/$/\n/' >> aux.csv; done

Uma pequena limpeza:

cat aux.csv | sed 's/\t//g' | sed 's/\r//g' | sed 's/ \+|/|/g' |  sed 's/| \+/|/g' > aux2.csv

Teste (se os comandos não retornarem nada, é bom sinal):

cat aux2.csv | awk -F"|" '{print $12}' | grep -v Fax
cat aux2.csv | awk -F"|" '{print $14}' | grep -v E-mail

A partir da coluna 14, começam a haver diferenças entre as linhas, pois umas não têm email, outras não têm página internet...

cat aux2.csv | sed 's/|Morada|Código|/|Morada||Código|/g' | sed 's/|Telefone|Fax|/|Telefone||Fax|/g' | sed 's/|Fax|E-mail|/|Fax||E-mail|/g' | sed 's/|E-mail|Internet|/|E-mail||Internet|/g' | sed 's/|Internet|Localização|/|Internet||Localização|/g' | sed 's/|Região Operacional|Sector Operacional|/|Região Operacional||Sector Operacional|/g' | sed 's/|Sector Operacional|CDOS|/|Sector Operacional||CDOS|/g' | sed 's/|Zona Operacional|Nº de Bombeiros|/|Zona Operacional||Nº de Bombeiros|/g' | sed 's/|Nº de Bombeiros|Área Servida (ha)|/|Nº de Bombeiros||Área Servida (ha)|/g' | sed 's/|Área Servida (ha)|População Servida|/|Área Servida (ha)||População Servida|/g' > aux3.csv

echo "a|b|nome|c|morada|d|codigo|e|codine|f|telefone|g|fax|i|email|j|site|k|l|lon|m|lat|n|localidade|o|freguesia|p|concelho|r|distrito|s|regiao|t|sector|u|cdos|v|zo|x|bombeiros|y|area|w|populacao" | cat - aux3.csv > aux4.csv

Importar para shapefile ou base de dados as corporações existentes

Dos passos anteriores, resulta um documento CSV com os dados de todas as corporações. Existe uma cópia do mesmo disponível a partir de http://dl.dropbox.com/u/5489125/aux4.csv.

sed 's/|/\t/g' aux4.csv > bombeiros.csv

Criar um ficheiro VRT bombeiros.vrt para ser utilizado pelo GDAL:

<OGRVRTDataSource>
    <OGRVRTLayer name="bombeiros">
        <SrcDataSource>bombeiros.csv</SrcDataSource>
        <GeometryType>wkbPoint</GeometryType>
        <LayerSRS>WGS84</LayerSRS>
        <GeometryField encoding="PointFromColumns" x="lon" y="lat"/>
    </OGRVRTLayer>
</OGRVRTDataSource>

Verificar que o GDAL consegue ler interpretar o ficheiro:

ogrinfo -ro -al bombeiros.vrt

Para criar uma shapefile, no sistema de coordenadas 3763:

ogr2ogr -f "ESRI Shapefile" -s_srs EPSG:20790 -t_srs EPSG:3763 bombeiros.shp bombeiros.vrt

Para criar uma tabela no Postgresql:

ogr2ogr -s_srs EPSG:20790 -t_srs EPSG:3763 -f "PostgreSQL" PG:"host=localhost user=geobox dbname=geotuga password=geobox" bombeiros.vrt

Importar CRIF para o PostGIS

A shapefile com a cartografia de risco de incêndio para 2011 encontra-se em SCRIF-IGEO. No terminal:

 shp2pgsql-gui

Após, preenche-se a janela obtida tal como na figura que se segue, o campo SRID deve ser preenchido com "3763", o código das coordenadas de Portugal.

Crif2011.png



Também se pode realizar a importação de dados da shapefile através do Quantum GIS.

Primeiro, deve-se ligar à base de dados onde se pretende importar a tabela correspondente à shapefile. Para tal, no menu Camada , escolher Adicionar camada PostGIS.

QG imp1.jpg


Criar a ligação à base de dados, com os campos preenchidos de acordo com a ligação.

QG imp2.jpg


Antes de continuar deve-se testar a ligação e deverá aparecer uma mensagem de conexão estabelecida.

QG imp3.jpg


Seguidamente fecha-se a janela da nova camada PostGIS, pois o nosso objectivo não é criar uma shapefile a partir de uma tabela.

QG imp4.jpg


No menu Extensões escolher o PostGIS Manager.

QG imp5.jpg


Na nova janela, clicar no menu Data e Load data from shapefile.

QG imp6.jpg


Na janela do Load data to PostGIS selecionar a shapefile de input, o schema e preencher os campos, como apresentado na figura que se segue:

QH imp7.jpg


Por fim clicar Load. A espera é um pouco demorada, já que a shapefile tem cerca de 3,5 milhões de registos de áreas.

Obter os municípios de Portugal Continental

A shapefile com as freguesias de Portugal Continental encontra-se disponível em IGEO-Shapefile.

Após adicionada a tabela correspondente à base de dados, executar a seguinte query SQL para obter os municípios:

CREATE TABLE municipios AS
SELECT municipio,
	 ST_Multi(ST_Union(the_geom)) AS singlegeom
	 FROM cont_aad_caop2010
GROUP BY municipio
ORDER BY municipio

Análise da Cobertura de Bombeiros no OSM e comparação com as corporações existentes na realidade

No OSM, as corporações de bombeiros (fire_station) podem ser marcadas como pontos ou como polígonos. Assim, para analisar a quantidade de corporações registadas no OSM é necessário verificar quantas estão marcadas como pontos ou polígonos. Existe, ainda, a necessidade de verificar se existem corporações marcadas das suas formas, pelo facto de serem dados duplicados.


Corporações de bombeiros definidas como pontos no OSM

Para verificar quantas corporações de bombeiros estão marcadas como pontos no OSM, a query SQL realizada é a seguinte:

select count(*) from planet_osm_point where amenity = 'fire_station'

O resultado da mesma foi:

119

Corporações de bombeiros definidas como polígonos no OSM

Para verificar quantas corporações de bombeiros estão marcadas como polígonos no OSM, a query SQL realizada é a seguinte:

select count(*) from planet_osm_polygon where amenity = 'fire_station'

O resultado da mesma foi:

27

Corporações de bombeiros definidas como pontos e polígonos no OSM

Para verificar quantas corporações de bombeiros estão marcadas como pontos e como polígonos no OSM, ou seja, para verificar os dados duplicados, a query SQL realizada é a seguinte:

SELECT count(*)
FROM planet_osm_point AS p, planet_osm_polygon AS po
WHERE p.amenity='fire_station' AND po.amenity='fire_station' AND p.name=po.name

O resultado da mesma foi:

4

Para obter o nome das corporação definidas como pontos e como polignos no OSM, executa-se a query:

select a.name, b.name 
from planet_osm_point as a, planet_osm_polygon as b 
where a.amenity='fire_station' and a.name=b.name

Número total de corporações de bombeiros definidas no OSM

Assim, o número total de corporações definidas no OSM seria:

119+27=146

No entanto, pelo facto de existirem dados redundantes, estes não são os valores reais existente no OSM. Assim, e para verificar a existência de redundâncias, em que a distância entre corporações é zero. Porém, como o SRID da tabela municipios é 3763 e as tabelas osm é 900913, tendo sido necessário criar uma tabela denominada mun_900913 da forma indicada, contendo os municípios e a coluna geometria com SRID 900913:

create table mun_900913 as
select municipio, st_transform(the_geom,900913)
from municipios


Assim a query para verificar as distâncias entre as corporações, pertencentes à área da CAOP de Portugal Continental, ordenadas por ordem crescente de distância:

select a.osm_id,a.name,b.osm_id, b.name,
	st_distance(a.way,b.way) as dist, c.municipio
from planet_osm_point as a, planet_osm_polygon as b,mun_900913 as c, mun_900913 as d
where a.amenity='fire_station' and b.amenity='fire_station'
and (st_contains(c.the_geom,a.way) and st_contains(d.the_geom,b.way))
order by dist 

Nos resultados verifica-se 9 linhas com valor de distância a zero. Porém, como apenas queremos verificar a redundância e não todos os valores de distância entre as corporações registadas como pontos e polígonos, podemos executar a seguinte query, que é mais eficiente por apenas comparar corporações do mesmo município:

select a.osm_id,a.name,b.osm_id, b.name,
	st_distance(a.way,b.way) as dist, c.municipio
from planet_osm_point as a, planet_osm_polygon as b,mun_900913 as c
where a.amenity='fire_station' and b.amenity='fire_station'
and (st_contains(c.the_geom,a.way) and st_contains(c.the_geom,b.way))
order by dist 

Obtendo-se como resultado 27 linhas das quais 9 são as que têm distância nula.

Tendo em conta que o OSM leva em consideração o arquipélago da Madeira, para se obter a distância entre corporações excluindo aquelas que pertencem ao arquipélago da Madeira, executa-se a seguinte query:

select a.osm_id,a.name,b.osm_id, b.name,
	st_distance(a.way,b.way) as dist, c.municipio, d.municipio
from planet_osm_point as a, planet_osm_polygon as b,mun_900913 as c, mun_900913 as d
where a.amenity='fire_station' and b.amenity='fire_station'
and st_contains(c.the_geom,a.way) and st_contains(d.the_geom,b.way)
order by dist 

O resultado são 9 corporações com distância de zero. Os resultados da query anterior, não contabilizam as corporações do arquipélago da Madeira. Para incluir os dados das corporações da Madeira, realiza-se a seguinte query:

select a.osm_id,a.name,b.osm_id, b.name,
	st_distance(a.way,b.way) as dist, c.municipio, d.municipio
from planet_osm_point as a, planet_osm_polygon as b
where a.amenity='fire_station' and b.amenity='fire_station'
order by dist 

Pelos resultados, verifica-se que no arquipélago da Madeira não existem dados de corporações que apresentem este tipo de redundância.

Corporações de bombeiros existentes na relidade

Para verificar quantas corporações de bombeiros existem na realidade, é executada a seguinte query SQL sobre a tabela bombeiros, referente às corporações de bombeiros retiradas do mapa disponível em http://scrif.igeo.pt/ASP/cbmapa.asp e tratado conforme descrito em cima:

select count(*) from bombeiros

O resultado da mesma foi:

533

Com o intuito de facilitar a análise dos dados presentes no OSM, foram criadas duas tabelas, uma apenas com as corporações definidas como pontos no OSM e outra apenas com as corporações definidas como polígonos no OSM, através das querys seguintes, respectivamente:

create table bombeiros_pontos as
select *
from planet_osm_point
where amenity = 'fire_station'
create table bombeiros_polignos as
select *
from planet_osm_polygon
where amenity = 'fire_station'

Sendo elaborada, ainda, uma terceira tabela onde se incluíram todas as corporações de bombeiros existentes no OSM (como pontos e como polígonos), através das querys:

CREATE TABLE bombeirosOSM AS 
SELECT osm_id,name,way 
FROM planet_osm_polygon 
WHERE amenity='fire_station'
INSERT INTO bombeirosOSM 
SELECT osm_id,name,way 
FROM planet_osm_point 
WHERE amenity='fire_station';

Realizou-se, em seguida, uma query para seleccionar as corporações de bombeiros em que os nomes são iguais nas tabelas bombeiros_pontos e bombeiros_polignos, mostrando osm_id e way:

select p.osm_id, s.osm_id, p.name, p.way, s.way
from bombeiros_pontos as p, bombeiros_polignos as s
where p.name = s.name

O resultado desta query foi:

1243616053;108363206;"Bombeiros Voluntários de Matosinhos";"010100002031BF0D00C37214DED97A2DC1881E043D9E395341";"010300002031BF0D000100000024000000A4703D0A317B2DC148E17A84AC395341666666662F7B2DC148E17AE4AC395341B81E85EB1B7B2DC1EC51B8FEAA395341F6285C0F0E7B2DC1713D0A97A9395341E17A142EE37A2DC133333323A9395341333333B3CF7A2DC1D7A3704DA93953415C8FC2F5A97A2DC15C8FC295AA39534148E17A948E7A2DC1A4703DCAAB39534152B81E05787A2DC114AE4701AE3953415C8FC2F5767A2DC18FC2F5D8AC39534148E17A945C7A2DC1B81E85CBA5395341C3F528DC627A2DC1CDCCCC6CA5395341AE47E1FA557A2DC1713D0AD7A139534152B81E85627A2DC13D0AD703A1395341666666666F7A2DC13D0AD703A1395341295C8F427C7A2DC19A9999D9A439534152B81E05727A2DC1E17A144EA5395341666666E67C7A2DC1AE47E15AA8395341295C8F42DB7A2DC133333333A3395341F6285C8FA07A2DC1EC51B8CE94395341295C8F429B7A2DC1D7A3705D93395341F6285C8F9D7A2DC1CDCCCC8C9139534100000080A47A2DC1A4703D7A90395341A4703D0AB07A2DC152B81E45903953419A999999BB7A2DC100000030903953418FC2F528C67A2DC1EC51B8EE90395341B81E856BCC7A2DC1EC51B87E923953417B14AE47D97A2DC1C3F528AC91395341F6285C0FCF7A2DC1AE47E14A8E3953419A999999DA7A2DC11F85EB818D395341F6285C8FDE7A2DC1CDCCCC3C8F395341333333B3F07A2DC152B81E4594395341AE47E1FAD57A2DC11F85EB81953953411F85EBD1077B2DC1E17A14FEA2395341F6285C0F0F7B2DC1F6285C9FA2395341A4703D0A317B2DC148E17A84AC395341"
1241007934;107827919;"Bombeiros Voluntários de Cinfães";"010100002031BF0D00253E30DC047B2BC1BB62C49252295341";"010300002031BF0D000100000008000000E17A142E277B2BC1295C8F624F295341713D0AD7017B2BC11F85EB9158295341A4703D8AEA7A2BC1000000C05629534148E17A94E97A2BC1E17A146E56295341A4703D0AE77A2BC15C8FC29555295341A4703D0AE77A2BC1E17A147E54295341295C8FC2047B2BC1333333334D295341E17A142E277B2BC1295C8F624F295341"

Executou-se uma query para seleccionar as corporações de bombeiros em que o way é igual nas tabelas bombeiros_pontos e bombeiros_polignos:

 
select (s.osm_id, s.amenity, p.osm_id, s.amenity), p.name, s.name
from bombeiros_polignos as p, bombeiros_pontos as s
where st_contains (p.way, s.way)

O resultado desta query foi:

"(673306314,fire_station,108167762,fire_station)";"Bombeiros Voluntário de Esposende";""
"(1243616053,fire_station,108363206,fire_station)";"Bombeiros Voluntários de Matosinhos";"Bombeiros Voluntários de Matosinhos"

Corporações de bombeiros com o nome nulo

Para saber quais as corporações de bombeiros cujo nome é nulo no OSM, executaram-se as seguintes querys, para as tabelas bombeiros_pontos e bombeiros_polignos, respectivamente:

Select osm_id, name
From bombeiros_pontos
where name is null
Select osm_id, name
From bombeiros_polignos
where name is null


Corporações de bombeiros em Lisboa com nome diferente de nulo

Através da tabela municipios e da tabela bombeirososm, podem seleccionar-se as corporações de um determinado município, neste caso Lisboa, cujo nome no OSM seja diferente de nulo, a partir da query:

SELECT NAME
FROM bombeirososm, municipios
WHERE st_contains (st_transform(singlegeom, 900913), way)
AND municipio = 'LISBOA' AND NAME IS NOT NULL

O resultado foi:

1 - monsanto;
2- Sapadores de Bombeiros

Distância entre corporações

Através da query seguinte, é possível saber as distâncias entre todas as corporações de bombeiros, sendo que esta é importante pelo facto de, quando existem duas corporações cuja distância é zero, estaremos perante uma corporação marcada duas vezes (questão da redundância) e, ainda, para verificar, por exemplo, as corporações que se encontram mais próximas:

select a.osm_id,a.name,b.osm_id, b.name,st_distance(a.way,b.way) as dist
from planet_osm_point as a, planet_osm_polygon as b
where a.amenity='fire_station' and b.amenity='fire_station'
order by dist

Do resultado verificam-se 9 corporações com distância 0, sendo estas:

1242350358;"Bombeiros Voluntários de Moncorvo";108280532;"Bombeiros Voluntários de Moncorvo";0
1033327838;"Bombeiros Voluntários de Cuba";115028098;"Quartel dos Bombeiros Voluntários de Cuba";0
673306314;"";108167762;"Bombeiros Voluntário de Esposende";0
1243616053;"Bombeiros Voluntários de Matosinhos";108363206;"Bombeiros Voluntários de Matosinhos";0
596417563;"Bombeiros Voluntários de Castro Daire";87570402;"Bombeiros Voluntários de Castro Daire";0
1205915678;"Bombeiros Voluntários de Barcelos";104660725;"Bonbeiros Voluntários de Barcelos";0
269789171;"";92542390;"";0
1241007934;"Bombeiros Voluntários de Cinfães";107827919;"Bombeiros Voluntários de Cinfães";0
689425367;"Bombéiros Voluntários da Aguda";108565618;"Bombeiros Voluntários da Aguda";0

Distância entre corporações de bombeiros e hospitais

Realizaram-se as seguintes queries, para saber a distância entre as corporações e hospitais, sendo que isto pode ser útil para o deslocamento de ambulâncias entre as corporações e os hospitais:

select a.osm_id,a.name,b.osm_id, b.name,st_distance(a.way,b.way) as dist
from
(select osm_id, name, way from bombeirososm) as a,
(select osm_id, name, way from planet_osm_point
where  amenity='hospital'
union all
select osm_id, name, way from planet_osm_polygon
where  amenity='hospital') as b
order by dist

ou

select a.osm_id,a.name,b.osm_id, b.name,st_distance(a.way,b.way) as dist
from 
(select osm_id, name, way from planet_osm_point 
where  amenity='fire_station'
union all
select osm_id, name, way from planet_osm_polygon
where  amenity='fire_station') as a,
(select osm_id, name, way from planet_osm_point 
where  amenity='hospital'
union all
select osm_id, name, way from planet_osm_polygon
where  amenity='hospital') as b
order by dist 

Em ambas as queries são devolvidos os seguintes resultados:

115028098;"Quartel dos Bombeiros Voluntários de Cuba";114731396;"Centro de Saúde de Cuba";10.9666827348873
115028098;"Quartel dos Bombeiros Voluntários de Cuba";1033327889;"Centro de Saúde de Cuba";32.6547622678346
1317733560;"Bombeiros Municipais";1318001835;"Centro de Saúde";73.812083521043
1033327838;"Bombeiros Voluntários de Cuba";1033327889;"Centro de Saúde de Cuba";79.9853068325346
1338261779;"Bombeiros Voluntários de Amarante";119037766;"Hospital de São Gonçalo";97.1134580289223
120953337;"Bombeiros Voluntários de Vizela";122048659;"Cuidados Continuados";98.6374417887221
1236045914;"Bombeiros Voluntários";1234658485;"Centro de Saúde Viana do Castelo";131.965733358986

É importante salientar que o "Quartel de Bombeiros Voluntários de Cuba" apresenta três distâncias diferentes. Este facto está relacionado com o facto do OSM permitir inserir corporações definidas por polignos e por pontos.

Users que introduziram dados sem nome

Foi realizada uma query para saber quais os utilizadores OSM (OSM_USER) que introduziram dados sem nome no OSM. Essa query foi:

SELECT municipio, name, way, osm_user
FROM planet_osm_point, municipios
WHERE amenity='fire_station' AND 
st_contains (st_transform(singlegeom, 900913), way) 
AND name IS NULL

Os resultados desta query foram 27, apresentando-se dois, em seguida:

"ALIJÓ";"";"010100002031BF0D0098D676807E6529C127E6F0F69B465341";""
"ALJEZUR";"";"010100002031BF0D00755CFF80D2E32DC1813B52867D1A5141";""

(...)

Índice de Risco de Incêndio

Foi criado um índice respeitante à média de risco de incêndio por município em Portugal Continental.

Para isto, utilizou-se a tabela crif2011, cuja importação é descrita acima. Foi tida em conta a área de cada risco de incêndio para que esta média fosse em função da mesma.

A média poderia ser determinada pela seguinte query:

create table municipio_crif2011 as
select t1.municipio, 
	sum(st_area(st_intersection(t2.the_geom, t1.the_geom))*t2.gridcode/st_area(t1.the_geom)) as multiplica
from municipios as t1
inner join crif2011 as t2 on ST_Intersects(t2.the_geom,t1.the_geom)
group by t1.municipio

Porém, devido à RAM necessária para executar esta query, a média foi determinada através de várias queries, como a apresentada em seguida, para 10 municípios de cada vez. Foi necessário distribuir desta forma este cálculo, pelo facto do processamento da tabela crif2011, com cerca de 3,5 milhões de linhas, ser bastante demorado.

create table calculo_28 as
select t1.municipio, 
	sum(st_area(st_intersection(t2.the_geom, t1.the_geom))*t2.gridcode/st_area(t1.the_geom)) as multiplica
from municipios as t1
inner join crif2011 as t2 on ST_Intersects(t2.the_geom,t1.the_geom)
where (t1.municipio ='VILA REAL'
or t1.municipio='VILA REAL DE SANTO ANTÓNIO'
or t1.municipio='VILA VELHA DE RÓDÃO'
or t1.municipio='VILA VERDE'
or t1.municipio='VILA VIÇOSA'
or t1.municipio='VIMIOSO'
or t1.municipio='VINHAIS'
or t1.municipio='VISEU'
or t1.municipio='VIZELA'
or t1.municipio='VOUZELA')
group by t1.municipio

Após a realização dos cálculos, os resultados foram todos colocados numa tabela denominada municipio_crif2011, através da seguinte query:

create table municipio_crif2011 as
select * from calculo_1
union all
select * from calculo_2
union all
select * from calculo_3
union all
select * from calculo_4
union all
select * from calculo_5
union all
select * from calculo_6
union all
select * from calculo_7
union all
select * from calculo_8
union all
select * from calculo_9
union all
select * from calculo_10
union all
select * from calculo_11
union all
select * from calculo_12
union all
select * from calculo_13
union all
select * from calculo_14
union all
select * from calculo_15
union all
select * from calculo_16
union all
select * from calculo_17
union all
select * from calculo_18
union all
select * from calculo_19
union all
select * from calculo_20
union all
select * from calculo_21
union all
select * from calculo_22
union all
select * from calculo_23
union all
select * from calculo_24
union all
select * from calculo_25
union all
select * from calculo_26
union all
select * from calculo_27
union all
select * from calculo_28

Media:Municipio_crif2011.pdf


Apresentam-se, em seguida, os primeiros dez e os últimos dez resultados ordenados por média de risco de incêndio por munícipio:

"PORTO";5.50079537242051
"LISBOA";5.26124607617093
"AMADORA";5.12569839750162
"ODIVELAS";5.01210002669097
"SEIXAL";4.89629353156976
"SÃO JOÃO DA MADEIRA";4.86175536006539
"PAMPILHOSA DA SERRA";4.85883333925432
"OEIRAS";4.77219163364139
"VILA DE REI";4.73869588341267
"GÓIS";4.73504543871186

(...)

"ELVAS";2.47252900645936
"FRONTEIRA";2.44202066473433
"ALPIARÇA";2.42160561349075
"BEJA";2.41284852944782
"BORBA";2.41053655637168
"SOUSEL";2.39867749954544
"FERREIRA DO ALENTEJO";2.36111605169023
"ALJUSTREL";2.2695535008843
"CASTRO VERDE";2.06595369055528
"GOLEGÃ";2.05062812723066
"CAMPO MAIOR";2.01960871293574

Conclusão

Esta análise permitiu concluir que existe um grande número de corporações de bombeiros por mapear no OSM. Por outro lado, foram encontradas várias corporações mapeadas como ponto e como poligno ao mesmo tempo, corporações sem nome e ainda as mesmas corporações com nomes diferentes sendo estas algumas das limitações do OSM.

Verificou-se que os municípios com maior valor médio são Porto e Lisboa, respectivamente. Estes apresentam estes valores, porque são concelhos muito urbanizados e com rio, sendo que os valores para urbano e hidrografia os mais elevados (6 e 7). Assim, para que os resultados apenas reflectissem resultados de risco de incêndio, teriam de ser excluídas as áreas com estes valores na query realizada.

Na realização desta análise ao número de corporações e ao risco de incêndio foram encontradas dificuldades em dois pontos.

Em primeiro lugar, pelo facto das tabelas terem sido importadas com diferentes sistemas de coordenadas, surgiram alguns erros de início, que foram posteriormente resolvidos.

Em segundo lugar, devido à tabela crif2011 conter 3,5 milhões de linhas (com 2Gb), o processamento da mesma, para o cálculo do risco de incêndio, era muito demorado.