Fórum Mapa clicavel de loteamento de imóveis #410839

21/12/2011

0

Olá a todos.
Uso Delphi 7 + Firebird 1.5 + DbExpress
Tenho um sistema de gerenciamento de loteamentos de imóveis.
Agora preciso fazer uma implementação interessante.

Imagine uma imagem (foto .BMP) de um loteamento um loteamento grande com 400 lotes, e os terrenos não são regulares (retangulares), tenho que ciar um recurso permita que eu mapeie lote por lote.

Mapear entenda identificar cada lote como um objeto independente que quando o lote for vendido o sistema possa colorir em vermelho e os demais lotes ficar em verde e alguns que estão reservados deixa-los em azul.

Cada lote será um registro na tabela onde teremos dimensão, preço, forma de pagamento, vendedor (corretor), etc....

Alguém tem uma dica para eu implementar este desafio.

Abraços a todos e

Feliz Natal

Neto
Antônio Neto

Antônio Neto

Responder

Posts

21/12/2011

Vagner Almeida

Não é complicado, mas muito trabalhoso:

1. Tenha o mapa do loteamento já fragmetado, e cada fragmento com cores que vc queira para identificá-lo conforme a situação.
Por exemplo: Branco - a venda
Azul - em negociação
Verde - não disponível
Vermelho - vendido

O mesmo lote (fragmento) com cores diferentes.

Uma das opções é utilizar o imagelist, mas não é viável para imagens que poderão ser alterados e não fica bom no caso de umas 400 imagens.

Então o jeito é criar uma tabela de imagens com um campo para cada cor da mesma imagem.
Essa tabela teria os seguintes campos, por exemplo:
codigo - codigo corrente da tabela (PK)
lote - codigo do lote (FK)
img1 - imagem Branco
img2 - imagem Azul
img3 - imagem Verde
img4 - imagem Vermelho
status - B (branco), A (azul), V (verde), M (vermelho)

então vc carregaria a imagens conforme o campo status, se o status for B, vc carregará a imagem que esta no campo img1, se for A, vc carregará a imagem que esta no campo img2, e assim por diante.



Responder

Gostei + 0

21/12/2011

Vagner Almeida

Obs: Vc pode criar no cadastro do lote as opções para gravar as imagens.
Procure converter as imagens em JPG, pesará menos no BD e não perde qualidade.

Espero ter ajudado...
Responder

Gostei + 0

22/12/2011

Antônio Neto

Olá Vagner bom dia e muito obrigado pela dica.

É uma maneira bacana de se fazer, e bastante trabalhosa para o cliente
que a cada novo loteamento terá um grande trabalho para mapear todos os lotes mas
a idéia é essa mesma cada lote torna-se um objeto independente para ser tratado.

Agora vc tem um modelo de como fazer uma programa para fragmentar o loteamento??
Como mapear/recortar o lote e grava-lo na tabela??

Mais uma vez obrigado e conto com vossa valorosa colaboração.

Abraços

Neto
Responder

Gostei + 0

22/12/2011

Joel Rodrigues

Bom dia, Anônio.
Com relação ao mapeamento da imagem, eu pensei em fazer o seguinte: o usuário carregaria a imagem e, com o mouse, demarcaria a área correspondente a cada lote (riscando sobre a imagem).
Conforme o usuário fosse movimentando o mouse sobre a imagem (com o botão do mouse pressionado), você armazenaria cada ponto por onde o mouse passou em um vetor. Com este vetor preenchido, armazenaria os pontos no banco de dados e para mostrar o lote no mapa (já falando da funcionalidade principal do programa), você desenharia um polígono sobre a imagem de acordo com os pontos armazenados com preenchimento correspondente à situação.
Bom, já faz um tempo que não trabalho com esse tipo de rotina no Delphi, mas fiz uns testes aqui em C# e creio que minha ideia é factível.
Não sei se fui claro o bastante, deu pra entender?

Abraço e boas festas.
Responder

Gostei + 0

22/12/2011

Antônio Neto

Olá Joel Rodrigues, bom dia.
Sim sua idéia é mesmo factivel, estou tentando fazer isso mas ainda com dificuldades,
mas o princípio é exatamente este percorrer a imagem armazenar num vetor e descarrega-lo na tabela.
Vou prosseguir com meus estudos e caso tenha mais alguma sugestão de como resolver isso
será muito bem vinda.
Feliz Natal e muito obrigado

Neto


Responder

Gostei + 0

22/12/2011

Joel Rodrigues

Opa, estou tetando fazer algo aqui. Estou vendo como salvar os pontos no bd.
Mando notícias.
Responder

Gostei + 0

22/12/2011

Antônio Neto

Que bom, prossigo meus testes e aguardando notícias.
Obrigado
Neto
Responder

Gostei + 0

22/12/2011

Joel Rodrigues

Antônio, tenho boas notícias.
Consegui fazer o que estava pensando. Marquei um lote no mapa, gravei no banco e depois carreguei (pintei no mapa com a cor de acordo com a situação).
O problema agora (que não vejo solução AINDA) é como selecionar o lote clicando sobre ele (selecionando em um grid, por exemplo, é tranquilo).
Vou dar mais uma lapidada no básico e te mando os fontes.
Responder

Gostei + 0

22/12/2011

Antônio Neto

Beleza Joel, obrigado.

Caso não consiga interagir com a imagem do lote, penso que podemos fazer via edit, colocar o nro do lote, situação
e processar, lógico que se existir a interação com o objeto (lote) ao clicar será perfeito.

Estou curioso para ver como gravou no banco e como carregou e pintou no formulário.

Obrigado companheiro.

Abraços

Neto
Responder

Gostei + 0

22/12/2011

Joel Rodrigues

Te eviei um email com os fontes.
Qualquer dúvida é só falar.

Abraço.
Responder

Gostei + 0

22/12/2011

Antônio Neto

Estou recebendo.
Antecipadamente já te agradeço muito, vc está fazendo pra mim papel de PAPAI NOEL.

Muito Obrigado
Neto
Responder

Gostei + 0

22/12/2011

Antônio Neto

Já recebi e vou alterar para Firebird para testar poruqe não tenho SQLServer
Te retorno

Abraços
Neto
Responder

Gostei + 0

22/12/2011

Joel Rodrigues

Alguns pontos importantes:
1) Não funcionou com .JPG, logo, creio que a imagem deva necessariamente ser .BMP;

2) Capturando os pontos que o usuário demarcou (no evento onMouseMove da imagem):
procedure TForm4.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift  then //SE o botão esquerdo estiver pressionado
  begin
    SetLength(pontos, Length(pontos)+1); //Aumenta em 1 a capacidade do vetor pontos(variável gobal)
    pontos[Length(pontos)-1] := Point(x, y); //Adiciona o novo ponto ao vetor
  end;
end;


3) Salvando as coordenadas do lote no bd:
procedure TForm4.Button1Click(Sender: TObject);
var
  i:integer;
  p:string; //conjunto de todos os pontos no formato (X1, Y1)|(X2, Y2)|...|(Xn, Yn)
begin
  p := ;

  for i := 0 to Length(pontos) - 1 do
     p := p + (+IntToStr(pontos[i].X)+,+IntToStr(pontos[i].Y)+)|; //monta a string no formato definido

  Image1.Picture.Bitmap.Canvas.Brush.Color :=  clYellow;
  Image1.Picture.Bitmap.Canvas.Polygon(pontos); //Marca na imagem o lote que acabou de ser criado
  SetLength(pontos, 0); //Limpa o vetor (para poder ser usado novamente)

  //Nesse ponto, você grava os dados no banco conforme a estrutura da sua tabela e engine de conexão utilizada
  //O ponto fundamental aqui é ter uma coluna para gravar as coordenadas no formato string (tamanho indefinido e grande)  
end;

Responder

Gostei + 0

27/12/2011

Paulo Andrade

Senhores, estou desenvolvendo um projeto para Imobiliária em SQL Server 2005.

Se possível enviar os fontes seria interessante.

Estou pretendendo montar também o mapa e até uma galeria de fotos.

Feliz ano novo a todos... Obg
Responder

Gostei + 0

01/01/2012

Zilon Maciel

Antonio, na minha opinião você deve fazer o seguinte:
Por Exemplo:

O Mapa do Brasil:

1 - Você pega a imagem geral (simples);
2 - Com uma ferramenta de trabalho com imagens, você quebra o mapa
geral em regiões, salvando cada região como uma imagem individual (.bmp)
(facil);
3 - Ao final você monta no formulário, usando um TImage para cada região (facil);
4 - A montagem fica igual a um quebra-cabeças (facil);
5 - Ai é só você usar o evento on click de cada TImagem;

Eu usei esta idéia do Livro do Fernando Anselmo O Melhor de Dois Mundos,
onde o autor fazia o processo acima com so signos, funciona muito bem.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar