Criando um banco de dados espacial com PostgreSQL + PostGIS
O Postgis é um excelente módulo espacial para o PostgreSQL. Serve tanto a aplicativos para publicação web, como o Mapserver, quanto para uso em intranets, com Grass, QGis etc.
Parte 2: Por que um banco de dados espacial?
Raster x Vector
Uma primeira distinção a ser feita, quando trabalhamos com mapas digitais, é a existência de dados vetoriais e dados raster.
Raster
O dado Raster é uma image, um mapa de pixels - um bitmap - com informações de cor em todos os pontos.
Uma imagem de 4x4 pixels, por exemplo:
| x || x || x || x | | x || x || x || x | | x || x || x || x | | x || x || x || x |Imagens de satélite e fotos aéreas são exemplos de dados Raster.
Vector / Vetor
Para informações mais "simples", utilizam-se vetores, que são arquivos infinitamente mais leves e fáceis de trabalhar, para determinados tipos de mapeamentos.
São possíveis formas de armazenamento de dados. Por exemplo, uma farmácia poderia ser definida com um ponto. Mas uma reserva florestal precisaria ser definida como um polígono... e uma estrada, como uma linha.
Shape x Banco de dados Espacial
Dentre os diversos formatos para armazenar mapas, o Shape, da ESRI, é o mais popular, servindo como um intercâmbio entre os vários programas. No entanto, é um formato proprietário. O mapa "Brasil", por exemplo, teria três arquivos:
- brasil.shp (contém a informação vetorial)
- brasil.shx (contém os índices)
- brasil.dbx (banco de dados associado ao vetor)
Num banco de dados espacial, isso fica muito mais simples, pois a informação do vetor é apenas mais uma coluna, do tipo "geometry". Seria algo como:
BRASIL
| cod_estado | nome_estado | uf | pop_1991 | geometry |
| 01 | Amazonas | AM | 4099021 | polygon (010600000001000000010300000001000000E200000093E00...) |
Nesse número gigantesco estão as coordenadas (latitude e longitude) do polígono do estado, no caso, Amazonas - em um hexadecimal legível para o Postgis.
Padrões
Segundo o Open Geospacial Consortium - OGC, são definidos 7 tipos para armazenamento, em WKT (well-known text):
- Ponto - POINT(0 0)
- Linha - LINESTRING(0 0,1 1,1 2)
- Polígono - POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))
- Multiponto - MULTIPOINT(0 0,1 2)
- Multilinha MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))
- Multipolígono - MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))
- Coleção de geometrias - GEOMETRYCOLLECTION(POINT(2 3),LINESTRING((2 3,3 4)))
Gostei do seu artigo. Tenho trabalhado ultimamente com Mapserver, Postgis e PHP e embora isso não seja novidade pra mim agora tenho certeza que irá beneficiar muita gente. Quem dera que eu tivesse lido isso há alguns meses atrás.
Parabéns.