Os SHAPEFILEs devem, preferencialmente:
- Estar no sistema de coordenadas WGS84 (EPSG 4326), que é o sistem de coordenadas usado pelo Sistema de Posicionamento Global (GPS) e pelos Mapas Culturais. É possível converter de praticamente qualquer outro sistema de coordenadas para o WGS84 usando o Quantum GIS;
- Consistir de um SHAPEFILE bidimensional por grupo de dados (bairros, distritos, regiões, municípios...), não múltiplos arquivos. É possível combinar múltiplos SHAPEFILEs em um usando o plugin MMQGIS do Quantum GIS e é possível converter de polyline e outros formatos vetoriais para o padrão de polígonos de duas dimensões usando o Quantum GIS;
- Conter uma legenda por polígono;
Referência: http://suite.opengeo.org/opengeo-docs/dataadmin/pgGettingStarted/shp2pgsql.html
Os shapefiles podem ser usados para duas finalidades:
Cada vez que uma entidade é salva, a aplicação faz uma consulta na base de dados geográfica para saber dentro de quais polígonos aquela entidade está. Ao salvar um espaço, por exemplo, a aplicação pode automaticamente deduzir que ele está na subprefeitura da Sé, no município de São Paulo e no estado de São Paulo, e salvar esses três metadados diretamente na entidade.
Para isso, é preciso:
- carregar os polígonos na tabela geo_division
- editar o arquivo de configuração e adicionar a informação das divisões geográficas que serão usadas.
Ex:
'app.geoDivisionsHierarchy' => [
'zona' => ['name' => \MapasCulturais\i::__('Zona'), 'showLayer' => true],
'Subprefeitura' => ['name' => \MapasCulturais\i::__('Subprefeitura'), 'showLayer' => true],
'distrito' => ['name' => \MapasCulturais\i::__('distrito'), 'showLayer' => true]
],
Onde 'zona', 'subprefeitura' e 'distrito' são os valores da coluna 'type' da tabela geo_division.
Essa configuração criará, automaticamente, os metadados geoZona, geoSubprefeitura e geoDistrito.
A propriedade 'showLayer' recebe um boolean que indica se os polígonos, presentes na tabela geo_division e registrados no arquivo de configuração, serão exibidos como uma camada na visualização do mapa.
Se não quiser que o metadado criado seja exibido na página de perfil da entidade, adicione um "_" na frente do slug.
Ex:
'app.geoDivisionsHierarchy' => [
'distrito' => ['name' => \MapasCulturais\i::__('distrito'), 'showLayer' => true], // irá gerar o metadado geoDistrito e exibí-lo automaticamente no perfil da entidade
'_cidade' => ['name' => \MapasCulturais\i::__('cidade'), 'showLayer' => true] // irá gerar o metadado geo_cidade mas não o exibirá na página de perfi da entidade
'setor_censitario' => ['name' => \MapasCulturais\i::__('setor_censitario'), 'showLayer' => false] // irá gerar o metadado geoSetor_censitario mas não o exibirá como uma camada na visulização dos mapas.
],
0. Tenha os arquivos de formas
Você necessitará, se possível no ambiente em que deseja fazer a importação, os arquivos de formas (shapefiles). Eles devem vir em um diretório com os seguintes arquivos:
NOME-DO-ARQUIVO.shp NOME-DO-ARQUIVO.shx NOME-DO-ARQUIVO.dbf
1. Verifique se PostGis está respondendo requisições.
Execute os seguintes comandos:
# su postgres
$ psql -U postgres -d mapas -c "SELECT postgis_version()"
Você verá uma mensagem como essa:
postgis_version
---------------------------------------
2.1 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)
2 - Converta os arquivos de formato shape (.shp) para formato base de dados (.sql)
Exemplo de conversão:
shp2pgsql -W LATIN1 -I -s 4326 mapasculturais/shapefiles/BAIRRO_POP.shp BAIRRO-TEMPORARIO > bairro-shapefiles.sql
obs: é importante colocar um nome temporário para não sobreescrever alguma tabela da base.
3 - Insira o arquivo .sql
gerado em uma nova tabela.
O arquivo .sql gerado tem comandos para criação de uma nova tabela com nome designado e inserção de registros. Rode esse comando para criar e inserir registros na tabela mapas:
$ psql -U mapas -d mapas -a -f /caminho/para/arquivo/bairro-shapefiles.sql
4 - Popule a tabela geo_division na base do mapas
Na base de dados do mapas, há uma tabela geo_division com os seguintes campos:
id - serial - PK parente_id - integer type - character varying (32) cod - character varying (32) name - character varying (32) geom - geometry
É necessário preencher os campos type
, cod
, name
e geom
com os valores que foram importados na tabela temporária, onde:
type: Nome da hierarquia que está sendo importada, registrada na configuração "app.geoDivisionsHierarchy" cod: Código de identificação, importado na tabela temprária do shapefiles name: Nome de exibição, importado na tabela temprária do shapefiles geom: Polígono do contorno, importado na tabela temprária do shapefiles
Após identificar na tabela temporária quais são os campos correspondentes na tabela geo_division, você pode colocar os dados utilizando INSERT
e SELECT
e apagar a tabela temporária.
O comando deve ser parecido com isso:
psql -d mapas -c "insert into geo_division (type, cod, name, geom) (select 'bairro', id_bairro_, nome_bairr, geom from bairro_temp)"
psql -d mapas -c "drop table if exists bairro_temp"