segunda-feira, janeiro 03, 2011
Ícones Customizados para o Google Maps
Descobri a pouco no Google Code, uma biblioteca de ícones que podem ser usados com a API do Maps. fica aqui a sugestão para quem quiser modificar a aparência dos Marcadores.
Link do projeto: http://code.google.com/p/google-maps-icons/
Marcadores:
Google Maps
quarta-feira, dezembro 22, 2010
Análise Espacial com o PostGIS e o GvSIG
Uma das inúmeras vantagens de se trabalhar com o PostGIS é a possibilidade de criar views das análises espaciais, tornando os resultados das análises dinâmicas em função dos dados de entrada utilizados. Desta forma também evita-se a criação de novo layers em função de uma atualização da base.
Para exemplificar, vamos imaginar a seguinte situação: em uma determinada cidade foi definido que a área de influência de uma parada de ônibus é de 40 metros e que a prefeitura deve identificar quais são os lotes dentro de cada área de influência das paradas. Apesar da situação ser muito comum para quem já trabalha com SIG, surge a necessidade de se repetir a análise a cada nova parada inserida ou excluída no sistema, o que pode acabar gerando inconsistências na base em função do mal gerenciamento destes arquivos.
Com o uso do PostGIS e do GvSIG eu vou mostrar como resolver este problema sem a necessidade de ficar criando novas camadas a partir das análises desse problema, no caso, a criação do buffer de 40 metros e a consulta espacial (intersects).
No PgAdmin 3, crie um novo Banco de Dados Espacial com o nome cadastro (Figura 1), em seguida, baixe, descompacte e carregue no banco criado o arquivo SQL do link abaixo (Figura 2):
| Figura 1 - Criação do Banco de Dados Espacial |
| Figura 2 - Carregando o Script SQL da tabela Lote |
Agora vamos criar a tabela ponto_onibus a partir do script abaixo (Figura 3):
CREATE TABLE ponto_onibus( id serial PRIMARY KEY, observacao varchar(50) ); SELECT AddGeometryColumn ( 'public', -- esquema 'ponto_onibus', -- nome da tabela 'the_geom', -- nome da coluna '29185', -- SRID 'POINT', -- tipo de geometria 2 -- plano (2d) );
| Figura 3 - Criação da tabela ponto_onibus no PgAdmin |
Vamos criar duas views, uma para os buffers de 40 metros em torno das paradas de ônibus e a outra dos os lotes que estão dentro desta distância (função intersects).
-- Criando a view buffer_ponto_onibus
CREATE OR REPLACE VIEW buffer_ponto_onibus AS
SELECT id, buffer(the_geom, 40) AS the_geom
FROM ponto_onibus;
-- Registrando a view na tabela de metadados geometry_columns
INSERT INTO geometry_columns(f_table_catalog, f_table_schema, f_table_name, f_geometry_column, coord_dimension, srid, "type")
VALUES ('', 'public', 'buffer_ponto_onibus', 'the_geom', 2, 29185, 'POLYGON');
-- Criando a view lotes_ponto_onibus
CREATE OR REPLACE VIEW lotes_ponto_onibus AS
SELECT l.*
FROM lote l, buffer_ponto_onibus b
WHERE intersects(l.the_geom, b.the_geom);
-- Registrando a view na tabela de metadados geometry_columns
INSERT INTO geometry_columns(f_table_catalog, f_table_schema, f_table_name, f_geometry_column, coord_dimension, srid, "type")
VALUES ('', 'public', 'lotes_ponto_onibus', 'the_geom', 2, 29185, 'POLYGON');
Abra o GvSIG e mude a projeção do bloco para 29185 (Figura 4)
| Figura 4 - Troca do sistema de projeção no GvSIG |
Com o bloco aberto, clique no botão adicionar plano de informação e escolha a segunda aba (GeoDB), em seguida configure a conexão com o banco de dados "cadastro" (Figura 5).
| Figura 5 - Configuração da conexão com o Banco de Dados |
Configurada a conexão, adicione as tabelas "lote" e "parada_onibus" e as views "buffer_ponto_onibus" e "lotes_ponto_onibus" (Figura 6).
| Figura 6 - Adicionando as camadas do BD |
Inicie a edição da camada ponto_onibus clicando com o botão direito em cima desta camada e escolhendo a opção "Iniciar Edição" em seguida, adicione algumas paradas de forma aleatória. Termine a edição Salvando as alterações (Figura 7).
| Figura 7 - Inserindo os pontos de ônibus |
| Figura 8 - Resultado dinâmico das análises a partir dos pontos criados |
A cada novo ponto criado ou excluído, as duas views são atualizadas automaticamente (Figura 9).
| Figura 9 - Resultado das análises após modificar a camada ponto_onibus |
Esperam que tenham gostado dessa dica, até a próxima!
sexta-feira, dezembro 17, 2010
Alternativa Open Source para o ArcCatalog e o ArcToolbox
O wxGIS possui as mesmas características dos módulos ArcCatalog e ArcToolBox do ArcGIS, e o que é melhor, é open source :)
Para instalar o wxGIS no Ubuntu é necessário:
- Adicionar o seu repositório a sources list: deb http://ppa.launchpad.net/bishop-gis/wxgis/ubuntu lucid main
- Atualizar a lista de repositórios
- e por último, instalar o pacote wxgis0
sábado, dezembro 04, 2010
PostrgeSQL - dados para realização dos exercícios
Baixe o arquivo neste link.
CREATE TABLE municipio (
idmun serial PRIMARY KEY,
nomemun varchar(50),
populacao int
);
CREATE TABLE proprietario (
idprop serial PRIMARY KEY,
cpf char(14),
nomeprop varchar(50),
telprop char(11)
);
CREATE TABLE fazenda (
idfaz serial PRIMARY KEY,
nomefaz varchar(50),
areafaz_ha numeric(8,2),
idmun int,
idprop int,
FOREIGN KEY(idmun) REFERENCES municipio (idmun),
FOREIGN KEY(idprop) REFERENCES proprietario (idprop)
);
CREATE TABLE variedade (
idvar serial PRIMARY KEY,
nomevar varchar(60)
);
CREATE TABLE plantacao (
idplan serial PRIMARY KEY,
plantio date,
colheita date,
areaplan_ha numeric(10,0),
idfaz int,
idvar int,
FOREIGN KEY(idfaz) REFERENCES fazenda (idfaz),
FOREIGN KEY(idvar) REFERENCES variedade (idvar)
);
-------------- INSERTS --------------
-------------------------------------
--TABELA municipio:
INSERT INTO municipio (nomemun, populacao) VALUES ('Patos', 100674);
INSERT INTO municipio (nomemun, populacao) VALUES ('Sousa', 65803);
INSERT INTO municipio (nomemun, populacao) VALUES ('Sapé', 50143);
INSERT INTO municipio (nomemun, populacao) VALUES ('Esperança', 31095);
INSERT INTO municipio (nomemun, populacao) VALUES ('Areia', 23829);
INSERT INTO municipio (nomemun, populacao) VALUES ('Bananeiras', 21851);
--TABELA proprietario
INSERT INTO proprietario (cpf, nomeprop,telprop ) VALUES ('027.424.624-91', 'João', '83-87220485');
INSERT INTO proprietario (cpf, nomeprop,telprop ) VALUES ('011.122.234-51', 'Maria', '83-99786654');
INSERT INTO proprietario (cpf, nomeprop,telprop ) VALUES ('123.455.009-98', 'Marcos', '83-91230099');
INSERT INTO proprietario (cpf, nomeprop,telprop ) VALUES ('230.191.102-33', 'Rodrigo', '83-88998832');
INSERT INTO proprietario (cpf, nomeprop,telprop ) VALUES ('927.474.624-25', 'Carlos', '83-88654321');
--TABELA fazenda
INSERT INTO fazenda (nomefaz, areafaz_ha, idmun, idprop ) VALUES ('Riacho Bonito',910, 1, 1);
INSERT INTO fazenda (nomefaz, areafaz_ha, idmun, idprop ) VALUES ('Alegria',234, 2, 2);
INSERT INTO fazenda (nomefaz, areafaz_ha, idmun, idprop ) VALUES ('Vida Bela',455, 3, 2);
INSERT INTO fazenda (nomefaz, areafaz_ha, idmun, idprop ) VALUES ('Cascavel',1021, 6, 4);
INSERT INTO fazenda (nomefaz, areafaz_ha, idmun, idprop ) VALUES ('Boquim',125, 4, 3);
INSERT INTO fazenda (nomefaz, areafaz_ha, idmun, idprop ) VALUES ('Boi Só',782, 5, 5);
INSERT INTO fazenda (nomefaz, areafaz_ha, idmun, idprop ) VALUES ('Giasa',1002, 2, 4);
INSERT INTO fazenda (nomefaz, areafaz_ha, idmun, idprop ) VALUES ('Belo Monte',2304, 1, 2);
INSERT INTO fazenda (nomefaz, areafaz_ha, idmun, idprop ) VALUES ('Azulão', 234, 2, 2);
--TABELA variedade
INSERT INTO variedade (nomevar) VALUES ('Feijão');
INSERT INTO variedade (nomevar) VALUES ('Milho');
INSERT INTO variedade (nomevar) VALUES ('Cana de Açúcar');
INSERT INTO variedade (nomevar) VALUES ('Abacaxi');
INSERT INTO variedade (nomevar) VALUES ('Tomate');
--TABELA plantacao
INSERT INTO plantacao (plantio, colheita, areaplan_ha, idfaz, idvar) VALUES ('2012-08-10', '2013-01-02', 200, 1, 1);
INSERT INTO plantacao (plantio, colheita, areaplan_ha, idfaz, idvar) VALUES ('2012-04-05', '2013-03-01', 520, 1, 2);
INSERT INTO plantacao (plantio, colheita, areaplan_ha, idfaz, idvar) VALUES ('2012-11-30', '2013-02-24', 45, 2, 3);
INSERT INTO plantacao (plantio, colheita, areaplan_ha, idfaz, idvar) VALUES ('2012-07-26', '2013-04-04', 20, 2, 4);
INSERT INTO plantacao (plantio, colheita, areaplan_ha, idfaz, idvar) VALUES ('2012-06-05', '2013-01-02', 20, 3, 5);
INSERT INTO plantacao (plantio, colheita, areaplan_ha, idfaz, idvar) VALUES ('2012-02-01', '2013-04-15', 900, 4, 3);
INSERT INTO plantacao (plantio, colheita, areaplan_ha, idfaz, idvar) VALUES ('2012-04-23', '2012-11-21', 150, 6, 2);
INSERT INTO plantacao (plantio, colheita, areaplan_ha, idfaz, idvar) VALUES ('2012-07-01', '2012-12-12', 120, 6, 3);
INSERT INTO plantacao (plantio, colheita, areaplan_ha, idfaz, idvar) VALUES ('2012-11-20', '2013-02-10', 56, 8, 2);
INSERT INTO plantacao (plantio, colheita, areaplan_ha, idfaz, idvar) VALUES ('2012-04-01', '2013-06-02', 590, 8, 3);
INSERT INTO plantacao (plantio, colheita, areaplan_ha, idfaz, idvar) VALUES ('2012-06-01', '2013-05-12', 345, 8, 4);
Marcadores:
SQL
segunda-feira, outubro 11, 2010
Tutorial CodeIgniter - Parte 5
Vamos finalizar a nossa aplicação desenvolvendo o CRUD para a tabela rio, grande parte do código utilizado nas postagens anteriores será reutilizado.
Vamos começar com o rio_model.php:
<?php
class Rio_model extends CI_Model
{
function __construct()
{
parent::__construct();
}
function get_rio()
{
$this->db->order_by('nome_rio', 'asc');
//junção com a tabela bacia_hidrografica
$this->db->join('bacia_hidrografica', 'bacia_hidrografica.id_bacia = rio.id_bacia');
$query = $this->db->get('rio');
if ($query->num_rows() > 0)
{
return $query->result();
}
else
{
return false;
}
}
function insert()
{
$data = $_POST;
return $this->db->insert('rio', $data);
}
function get_where($id)
{
$this->db->where('id_rio', $id);
$this->db->join('bacia_hidrografica', 'bacia_hidrografica.id_bacia = rio.id_bacia');
$query = $this->db->get('rio');
return $query->row();
}
function update($id)
{
$data = $_POST;
$this->db->where('id_rio', $id);
$this->db->update('rio', $data);
}
function delete($id)
{
$this->db->where('id_rio', $id);
return $this->db->delete('rio');
}
}
O nosso controllador rio.php vai carregar dois model´s, já que teremos nos formulários de inserção e de atualização uma lista das bacias cadastradas:
<?php
class Rio extends CI_Controller
{
function __construct()
{
parent::__construct();
$this->load->model(array('rio_model', 'bacia_model'));
$this->load->library('form_validation');
}
function index()
{
$data['titulo'] = "SIRH";
$data['cabecalho'] = "Rios";
$data['rios'] = $this->rio_model->get_rio();
$this->load->view('rio_view', $data);
}
function criar()
{
$data['titulo'] = "SIRH - Novo Rio";
$data['cabecalho'] = "Criar novo Rio";
$data['bacias'] = $this->bacia_model->get_bacia();
$this->load->view('rio_new', $data);
}
function insere()
{
$data['titulo'] = "SIRH - Novo Rio | Erro na Validação, preencha corretamente!";
$data['cabecalho'] = "Criar novo Rio | Preencha Corretamente!";
$data['bacias'] = $this->bacia_model->get_bacia();
$this->form_validation->set_rules('nome_rio', 'Nome do Rio', 'required|alpha');
$this->form_validation->set_rules('comprimento_km', 'Comprimento', 'required|numeric');
$this->form_validation->set_rules('id_bacia', 'Bacia Hidrográfica', 'required');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('rio_new', $data);
}
else
{
$this->rio_model->insert();
$this->session->set_flashdata('msg', 'Registro Criado com Sucesso!');
redirect('rio');
}
}
function editar($id)
{
$data['titulo'] = "SIRH - Editar Rio";
$data['cabecalho'] = "Editar Rio";
$data['registro'] = $this->rio_model->get_where($id);
$data['bacias'] = $this->bacia_model->get_bacia();
$this->load->view('rio_new', $data);
}
function atualizar()
{
$id = $this->input->post('id_rio');
$data['titulo'] = "SIRH - Editar Rio | Erro na Validação, preencha corretamente!";
$data['cabecalho'] = "Editar Rio | Preencha Corretamente!";
$data['registro'] = $this->rio_model->get_where($id);
$data['bacias'] = $this->bacia_model->get_bacia();
$this->form_validation->set_rules('nome_rio', 'Nome do Rio', 'required|alpha');
$this->form_validation->set_rules('comprimento_km', 'Comprimento', 'required|numeric');
$this->form_validation->set_rules('id_bacia', 'Bacia Hidrográfica', 'required');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('rio_new', $data);
}
else
{
$this->rio_model->update($id);
$this->session->set_flashdata('msg', 'Registro Atualizado com Sucesso!');
redirect('rio');
}
}
function deletar($id)
{
if ($this->rio_model->delete($id))
{
$this->session->set_flashdata('msg', 'Registro Deletado com Sucesso!');
} else
{
$this->session->set_flashdata('msg', 'ERRO - Não foi possível deletar este registro!');
}
redirect('rio');
}
}
A página de exibição dos rios (rio_view.php):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title><?= $titulo ?></title>
</head>
<body>
<h2><?= $cabecalho ?></h2>
<p><?= anchor('bacia', 'Ver Bacias Hidrográficas')?> <?= anchor('rio', 'Ver Rios')?></p>
<p><?= anchor('rio/criar', 'Criar Rio') ?></p>
<p><?= @$this->session->flashdata('msg'); ?></p>
<table border="1">
<thead>
<tr>
<th>
Nome do rio
</th>
<th>
Comprimento (km)
</th>
<th>
Nome da bacia
</th>
<th>
Ações
</th>
</tr>
</thead>
<tbody>
<?php if ($rios != false): ?>
<?php foreach ($rios as $rio): ?>
<tr>
<td>
<?= $rio->nome_rio ?>
</td>
<td>
<?= $rio->comprimento_km ?>
</td>
<td>
<?= $rio->nome_bacia ?>
</td>
<td>
<?= anchor('rio/editar/' . $rio->id_rio, 'Editar') ?> |
<?= anchor('rio/deletar/' . $rio->id_rio, 'Deletar') ?>
</td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<p>Não há registros cadastrados!</p>
<?php endif ?>
</tbody>
</table>
</body>
</html>
Da mesma forma como fizemos nas bacias, teremos um único arquivo responsável pelo cadastramento e atualização dos dados referentes a esta tabela (rio_new.php):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title><?= $titulo ?></title>
</head>
<body>
<h2><?= $cabecalho ?></h2>
<p><?= validation_errors(); ?></p>
<?php
//verifica se o form vai ser usado para insert ou update
if (!isset($registro->id_rio))
{
echo form_open('rio/insere');
}
else
{
echo form_open('rio/atualizar');
echo form_hidden('id_rio', $registro->id_rio);
}
?>
<p>
<label>Nome do rio:</label>
<input name="nome_rio" type="text" id="nome_rio" size="40" value="<?= @$registro->nome_rio ?>" />
</p>
<p>
<label>Comprimento (km): </label>
<input name="comprimento_km" type="text" id="comprimento_km" size="40" value="<?= @$registro->comprimento_km ?>" />
</p>
<p>
<label>Bacia Hidrográfica</label>
<select name="id_bacia">
<option value="<?= @$registro->id_bacia; ?>"> <?= @$registro->nome_bacia; ?> </option>
<?php foreach ($bacias as $bacia): ?>
<option value="<?= $bacia->id_bacia; ?>"> <?= $bacia->nome_bacia; ?> </option>
<?php endforeach; ?>
</select>
</p>
<p>
<input type="submit" id="Enviar" value="Enviar" />
</p>
<?= form_close() ?>
</body>
</html>
Finalizamos o CRUD das duas tabelas, no nosso próximo post, vou mostrar como habilitar o mod_rewrite e retirar da url o index.php, e também fazer algumas pequenas melhorias visuais com CSS. Até lá!
Marcadores:
CodeIgniter,
PHP,
Programação
Assinar:
Postagens (Atom)
