Cálculo da Cobertura de Bombeiros
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.
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.
Criar a ligação à base de dados, com os campos preenchidos de acordo com a ligação.
Antes de continuar deve-se testar a ligação e deverá aparecer uma mensagem de conexão estabelecida.
Seguidamente fecha-se a janela da nova camada PostGIS, pois o nosso objectivo não é criar uma shapefile a partir de uma tabela.
No menu Extensões escolher o PostGIS Manager.
Na nova janela, clicar no menu Data e Load data from shapefile.
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:
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
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.