Google Maps (GMaps) + PHP + JQuery – Adicionando Marcadores Customizados

Renderizando um Mapa (Google)  com marcadores customizados, adicionando os locais por CEP, Endereço, Latitude + Longitude …

Eu sempre quis usar esses mapinhas mesmo não tendo onde coloca-los, digo, sempre achei legal e nunca tive a oportunidade de utiliza-los.
Hoje em um projeto para Imobiliárias me deparei com a necessidade de incluir mapas de locais, tanto dos imóveis quanto do comércio e também, famárcias, hospitais, e a coisa toda!

O problema que eu sempre encontrava quando tentava arrumar um tempo para brincar com isso era:
– Para incluir um marcador no mapa é preciso informar latitude e longitude

Caras, que coisa chata isso, no geral basta abrir o mapa no google que ele retorna essas informações. Isso para um único mapa ou marcador é moleza, mas agora imagine incluir 200 marcadores em um mapa tendo que pegar lat + lng no google, chatãoooo demais!

Ninguém quer saber disso né?  eu me esqueço e acabo desabafando aqui!
Tá bom vamos para ao que interessa!

A idéia que tive (como se ninguém já tivesse feito isso anos luz atras, ao menos, se fizeram não compartilharam como eu, eu sou legal) foi a seguinte:

– Através do CEP recuperar o endereço e utilizar a API do Google para conseguir latitude e longitude

A API do google possibilita recuperar essas informações desde que você informe o endereço completo no seguinte formato:
– Av. Paulista, 1000, Sao Paulo, SP

De preferência sem acentos, ao menos obtive melhor resultado procurando sem acentos!
obs: Não vou entrar em detalhes sobre API do Google, a documentação é muito rica e é bem melhor ler as docs.

Bom, criei uma classe PHP para fazer o seguinte:
– informo um cep -> recebo um endereço -> repasso à  API -> recebo latitude e longitude -> repasso ao Gmaps API -> ganho um mapinha lindo

As vezes acabo me empolgando e indo além do proposto, isso tem que ser divertido, certo?
Assim eu pude criar a classe com os seguintes métodos:

– Adicionar  Marcador por CEP
– Adicionar  Marcador por Endereço
– Adicionar  Marcador por LAT + LNG
– Adicionar  Marcador por XML
– Escolher o Ícone do Marcador
– Inserir Conteúdo HTML ao clicar no Marcador

No print acima, você pode ver 4 marcadores, todos inseridos através do CEP + Número

Vamos ver um exemplo básico dos métodos, neste exemplo vamos apenas adicionar os marcadores (sem HTML ou Icon/Pin personalizado)

<?php
require_once 'gmaps.class.php';
$gmaps = new gMaps;
// Adiciona um marcador p/ endereco informado
$gmaps->addMarkerAddress( "Av Paulista, 10, Sao Paulo, SP");
// Adiciona um marcador p/ CEP + Num informado
$gmaps->addMarkerCep( "08615060","500");
// Adiciona um marcador p/ LAT + LNG informados
$gmaps->addMarker("-23.5462057","-46.3022458");
// Retorna em JSon todos os marcadores
$gmaps->getMarkers();

?>

Vamos colocar mais detalhes no próximo exemplo

<?php
require_once 'gmaps.class.php';
$gmaps = new gMaps;
// Adiciona um marcador p/ CEP + Num + HTML
$gmaps->addMarkerCep( "08615060","500","Conteudo HTML");
// Retorna em JSon todos os marcadores
$gmaps->getMarkers();
?>

Exemplo com Marcador Customizado

<?php
require_once 'gmaps.class.php';
$gmaps = new gMaps;
//cria novo icon/pin supondo que o arquivo esteja no diretorio icons
$gmaps->addIcon( "kart", "icons/kart.png", "45", "45" );
// Adiciona um marcador p/ CEP + Num + HTML + Icon
$gmaps->addMarkerCep( "08615060","500","Conteudo HTML","kart");
// Retorna em JSon todos os marcadores
$gmaps->getMarkers();
?>

Você viu acima:
– como adicionar marcadores por CEP, Endereço, Lat + Lng
– como adicionar conteúdo HTML ao marcador
– como inserir um icon/pin personalizado (imagem png)

Falta o método via XML

<?php
require_once 'gmaps.class.php';
$gmaps = new gMaps;
//carrega o XML markers.xml
$gmaps->loadFromXML("markers.xml");
$gmaps->getMarkers();
?>

Abaixo o código XML

<?xml version="1.0" encoding="iso-8859-1"?>
<markers>

<marker latitude="-23.5490776" longitude="-46.6527575">
 <icon name="pizza" url="icons/pizza.png" width="45" height="45" />
 <html>
 <![CDATA[<p>Lanchonete João</p><p><img src="http://tinyurl.com/897xozw" width="60" height="60" /></p><p>R$ 4,50</p>]]>
 </html>
 </marker>

<marker latitude="-23.5559008" longitude="-46.6659718">
 <icon name="kart" url="icons/kart.png" width="45" height="45" />
 <html>
 <![CDATA[<p>Hipermercado Tatendo</p>]]>
 </html>
 </marker>

<marker latitude="-23.5650044" longitude="-46.6519832">
 <icon name="imovel" url="icons/imovel.png" width="45" height="45" />
 <html>
 <![CDATA[<p>Imobiliária 123Mudar</p>]]>
 </html>
 </marker>

</markers>

Assim é bem simples criar N marcadores no Mapa, no entanto vamos destacar alguns pontos

1 – A cada marcador inserido via CEP ou Endereço uma solicitação a mais é realizada para obter Lat + Lng
2 – É mais rápido utilizar o método $gmaps->addMarker(lat,lng), dessa forma o processo é mais rápido
3 – Você pode usar os métodos $gmaps->addMarkerCep e $gmaps->addMarkerAddress para gravar Lat + Lng em um BD, assim poderá utilizar o carregamento via XML
4 – Mesmo com tudo isso que eu disse acima, o processo só ficará lento com addMarkerCep e addMarkerAddress se houver milhares de marcadores, pois serão milhares de consultas de endereço para recuperar Lat+Lng.

O que é inteligente fazer ?
O ideal é (como disse acima) utilizar os métodos e gravar Lat+Lng no banco, todos os métodos retornam Lat+Lng, o método  $gmaps->getMarkers() é quem gera a lista deles e retorna para o API Jquery.

A classe PHP que escrevi serve apenas para recuperar as informações necessárias para renderizar o Mapa e essas informações são passadas à API.
Logo, temos o seguinte código para que a coisa funcione:

<!doctype html>
<html>
 <head>
 <meta charset="iso-8859-1" />
 <title>gMaps</title>
 <link type="text/css" href="style.css" rel="stylesheet" />
 <script type="text/javascript" src="jquery-1.6.1.min.js"></script>
 <script type="text/javascript" src="jquery.gmap.min.js"></script>
 </head>
 <body>
 <div id="wrap">
 <div id="map">
 <p class="loader"><img src="icons/loader.gif"/><br/>carregando locais, aguarde...</p>
 </div>

</div>
 <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
 <script type="text/javascript" src="gmap.load.js"></script>
 </body>
</html>

Nada precisa ser alterado nos arquivos JScript, a única coisa que dever ser feita é: – Escolher um método para adicionar os marcadores, seja por CEP, Endereço ou XML. No exemplo que irei disponibilizar temos o seguinte código no arquivo que adiciona os marcadores:

<?php
addIcon( "pizza", "icons/pizza.png", "45", "45" );
$gmaps->addIcon( "kart", "icons/kart.png", "45", "45" );
$gmaps->addIcon( "green", "icons/green.png", "45", "45" );
$gmaps->addIcon( "imovel", "icons/imovel.png", "45", "45" );

// adicionar marcadores</pre>
$gmaps->addMarkerAddress( "Rua Benjamin Constant, 1500, Suzano, SP", "<p>Lanche do Chico <br/><img src=http://tinyurl.com/897xozw /></p>", "pizza" );
$gmaps->addMarkerAddress( "Rua Ipes, 300, Suzano, SP", "<p>Hipermercado NoName</p>", "kart" );
$gmaps->addMarkerAddress( "Rua Felicio de Camargo, 300, Suzano, SP", "<p>Imobiliária RedFox</p>", "imovel" );
$gmaps->addMarkerAddress( "Rua Antonio Augusto,10 Suzano, SP", "<p>Coisa Verde</p>", "green" );
$gmaps->addMarkerAddress( "Rua Jose de Almeida, 300, Suzano, SP");
$gmaps->addMarkerAddress( "Av Brasil, 100, Suzano, SP");
?>

Esse código está contido no arquivo markers.php, além desse código, todos os demais métodos e funcionalidades estão no arquivo com exemplos comentados, sintaxes e tudo que é preciso para entender o funcionamento; Um resumo do que acontece é o seguinte:
– O arquivo index.html chama um método que via Ajax/Post requisita o arquivo markers.php (que tem esse código acima / do exemplo)
– O arquivo markers.php retornar em Json os dados de cada marcador – O arquivo map.load.js apenas repassa os dados para a API GMaps, ou seja, a única coisa que você precisa alterar é o markers.php, adicionando os locais com seu método preferido ou então via XML, lembrando que seria ideal poder utilizar o banco de dados, não vou entrar em detalhes sobre o assunto!

[{latitude:-23.5711520,longitude:-46.6442116,html:'<p>Text</p><p>Av Paulista, 10, Sao Paulo, SP</p>’}]

Esse trecho acima é suficiente para incluir um marcador, é essa string que você deve montar a partir do banco de dados.
Se você tiver, por exemplo, 3 marcadores salvos no banco de dados o retorno deve ser separado por vírgula, como à seguir:

[{latitude:-23.5711520,longitude:-46.6442116,html:'<p>Text 1</p><p>Av Paulista, 10, Sao Paulo, SP</p>’},
{latitude:-23.52342423,longitude:-46.5675616,html:'<p>Text 2</p><p>Rua Augusta, 10, Sao Paulo, SP</p>’},
{latitude:-23.4562340,longitude:-46.87972116,html:'<p>Text 3</p><p>Rua Ipes, 500, Suzano, SP</p>’}]

Nesse exemplo acima está ausente o icon/pin personalizado, para utiliza-lo é preciso informar no Json o atributo icon, como abaixo:

[{latitude:-23.5711520,longitude:-46.6442116,html:'<p>Text</p><p>Av Paulista, 10, Sao Paulo, SP</p>’,icon:{image: ‘icons/imovel.png’,iconsize: [45, 45],iconanchor: [12, 46],infowindowanchor: [12, 0]}}]

Onde o trecho pode ser entendido separadamente, como abaixo

icon:{
image: ‘icons/imovel.png’, # caminho da imagem
iconsize: [45, 45],   # largura e altura da imagem
iconanchor: [12, 46], # isso nao precisa alterar
infowindowanchor: [12, 0] # nao precisa alterar
}

Com o código em mais de uma linha é fácil entender, acontece que essa deve ser uma linha única, ao montar a string você deve retirar todo o espaço e quebras de linhas.

Bom, é isso, da metade para o fim do post  eu apenas comentei sobre como utilizar a partir de um BD e resumidamente o que você precisa saber é:
– Para utilizar com BD você precisa guardar os dados que você pode adquirir com os métodos que vimos já que todos retornam os dados necessários
– Você pode armazenar no banco em campos separados (lat, lng, endereco, icon) ou pode até armazenar a string inteira em um único campo, talvez seja mais fácil

Exemplo de como obter a string a ser guardada no banco :

<?php
require_once 'gmaps.class.php';
$gmaps = new gMaps;
$gmaps->addIcon( "kart", "icons/kart.png", "45", "45" );
$gmaps->addMarkerCep( "08615060","500","Conteudo HTML","kart");
// recuperando a string e removendo os caracters [ e ]
$strJson = preg_replace(array('/[/','/]/'),array('',''),$gmaps->getMarkers());

//conexao com banco
$query = mysql_query("insert into markers (str) values ("$strJson");

//recuperando as strings
$query = mysql_query("select * from markers");
//montando a string completa com todos os marcadores do banco
$markers = "[";
while($row = mysql_fecth_object($query))
{
 //concatenando a string com resultados da consulta
 //supondo que armazenou no campo str, a virgula é necessária após cada marcador
 $markers .= "$row->str,";
}
//fechando json
$markers = "]";
//retornando a string montada a partir do banco
echo $markers;
?>

É mais ou menos isso, basta se atentar no formato da string/json que deve ser retornada, como no exemplo de 3 marcadores que passei mais acima!
Veja o exemplo online, empolgue-se, baixe os fontes, abra o arquivo markers.php que é o cérebro da coisa e entenda como funciona!

No exemplo online dá para você adicionar marcadores para simular a nossa brincadeira (adicione locais próximos)!

Links:

– demo online (a API utilizada nesse script foi descontinuada por favor veja a nova versão em http://clares.com.br/google-maps-com-marcadores-personalizados/)

– Download da Versão Customizada

Referências
GMaps API
O código contido no pacote dos fontes tem todos os métodos e sintaxes comentadas.

Valeu, até a próxima!

Comments

  1. Responder

  2. By Ernesto

    Responder

  3. By Ernesto

    Responder

    • Responder

      • By Tânia

        Responder

  4. Responder

    • Responder

  5. By Sergio

    Responder

  6. Responder

    • Responder

  7. By Cristian Gunsch Moura

    Responder

    • By Cristian Gunsch Moura

      Responder

  8. By cesar

    Responder

    • Responder

      • By cesar

        Responder

  9. By Erick

    Responder

  10. By jose cerejo

    Responder

    • Responder

  11. By jose cerejo

    Responder

  12. By jose cerejo

    Responder

    • Responder

      • By jose

        Responder

        • Responder

  13. Responder

  14. Responder

    • Responder

  15. By Paulo Sergio

    Responder

    • Responder

  16. By Allan Riffert

    Responder

  17. By Renato Nascimento

    Responder

    • Responder

  18. By Ruslan Queiroz

    Responder

  19. By Rudy

    Responder

    • Responder

      • By Rudy

        Responder

  20. By Rodolfo Jesus

    Responder

  21. Responder

    • Responder

  22. Responder

    • Responder

      • Responder

        • Responder

    • Responder

  23. Responder

  24. Responder

    • By Rafael Clares

      Responder

  25. By Matheus

    Responder

  26. Responder

  27. By Rudy

    Responder

    • By Rafael Clares

      Responder

  28. Responder

    • By Rafael Clares

      Responder

  29. By Celso

    Responder

    • By Rafael Clares

      Responder

  30. Responder

    • By Rafael Clares

      Responder

  31. By Rangel Soares

    Responder

    • By Rafael Clares

      Responder

  32. By Rangel Soares

    Responder

  33. By Marcio

    Responder

    • By Rafael Clares

      Responder

  34. By Kleber

    Responder

    • By Rafael Clares

      Responder

      • By Kleber

        Responder

        • By Rafael Clares

          Responder

  35. By Kleber

    Responder

    • By Rafael Clares

      Responder

  36. By Gustavo

    Responder

    • By Rafael Clares

      Responder

  37. Responder

  38. By Andrey Leocadio

    Responder

    • Responder

      • By Andrey Leocadio

        Responder

  39. By Michael Marques

    Responder

    • Responder

  40. By Marcelo

    Responder

  41. By Samuel Quiteque

    Responder

  42. By Marcus Guarani

    Responder

Perguntas duplicadas ou cujo a resposta esteja nos comentários serão ignoradas.
Comentários com códigos serão ignorados(para isso, use o pastebin.com e informe aqui o link).
Faça sua pergunta e "aguarde" ser aprovada para aparecer no blog.
Aguarde sua resposta, ela não é em tempo real, tenha paciência!

Deixe seu comentário

%d blogueiros gostam disto: