<div dir="ltr"><div><div><div><div><div><div><div><div><div>Blabos,<br><br></div>Preparei o código abaixo para exemplificar, ele faz o seguinte, dado uma lista de lojas, e uma lista de usuarios magic com CEP, a app abaixo vai:<br>
</div>1. calcular as coordenadas para o CEP e associar ao usuario<br></div>2. Calcular a distancia de cada loja para esse usuario<br></div>3. Vai executar um sort e associar a distancia de lojas para cada usuario<br></div>
4. Vai imprimir um markup (HTML) para vc colar no teu browser com o exemplo de plotagem dos dados que estao contidos na app.<br><br>é só copiar e colar o código abaixo e rodar com: <br>$ perl <a href="http://programinha.pl">programinha.pl</a> > lojas.htm<br>
</div>$ firefox lojas.htm<br><br></div>e veja vc mesmo =)<br></div><div>espero que eu não tenha feito o trablho por vc, caso isso aconteca não esquece das minhas congratulacoes rsrs<br></div><div><br></div>abs,<br><br>Hernan<br>
<br></div>Segue a app:<br><br><br><br>package Ajudando::O::Blabos::Em::Magic::Addicts::Encontre::A::Loja::Mais::Proxima;<br><br>=head2 SYNOPSIS<br><br>execute este o código a seguir e salve a saída num arquivo HTML e abra no firefox.<br>
<br>ex: $ perl <a href="http://este_programa.pl">este_programa.pl</a> > lojas_mais_proximas.htm<br>    $ lojas_mais_proximas.htm<br><br>=cut<br><br>=head2 DESCRIPTION<br><br>Objetivo: Ajudar o Blabos<br><br>Como: Com um programa que seja útil para pessoas que jogam Magic, encontrando a loja mais próxima com um baralho fechado de mááágic<br>
<br>Premissas:<br><br>- Tenho uma lista com as lojas.<br><br>- Tenho uma lista de pessoas que jogam magic e seus CEPs respectivos.<br><br>=cut<br><br>=head2 AUTOR<br><br>Hernan Lopes<br><br>=cut<br><br>use strict;<br>use warnings;<br>
use Geo::Coder::Google;<br>use Data::Printer;<br>use GIS::Distance;<br><br>my $lojas = {<br>    loja1 => {<br>        lat => -23.6196,<br>        lon => -46.6627<br>    },<br>    loja2 => {<br>        lat => -23.668,<br>
        lon => -46.783<br>    },<br>    loja3 => {<br>        lat => -23.616,<br>        lon => -46.477<br>    },<br>    loja4 => {<br>        lat => -23.519,<br>        lon => -46.704<br>    }<br>};<br>
<br><br>my $magic_addicts = {<br>    joe => {<br>        cep => "04363-000"<br>    },<br>    mary => {<br>        cep => "04362-000"<br>    },<br>    gus   => {<br>        cep => "05443-060"<br>
    },<br>    gus   => {<br>        cep => "04106-011"<br>    },<br>    pri   => {<br>        cep => "05423-030"<br>    },<br>    tabata => {<br>        cep => "09710-000"<br>
    }<br>};<br><br>my $geocoder = Geo::Coder::Google->new(apiver => 3);<br>my $gis      = GIS::Distance->new();<br>   $gis->formula( 'Haversine' );<br><br>foreach my $user ( keys $magic_addicts ) {<br>
    $magic_addicts->{ $user }->{ location } = $geocoder->geocode( location => "Brasil, cep ". $magic_addicts->{ $user }->{ cep } )->{geometry}->{ location };<br>    $magic_addicts->{ $user }->{ lojas_mais_proximas } = [];<br>
    foreach my $loja ( keys $lojas ) {<br>        my @origem    = ( $magic_addicts->{ $user }->{ location }->{ lat } , <br>                          $magic_addicts->{ $user }->{ location }->{ lng } );<br>
<br>        my @destino   = ( $lojas->{ $loja }->{ lat },  <br>                          $lojas->{ $loja }->{ lon } );<br>        my $distancia = $gis->distance( @origem => @destino );<br>        push( @{   $magic_addicts->{ $user }->{ lojas_mais_proximas }   }, <br>
          { <br>              loja      => $loja,<br>              distancia => $distancia->{ values }->{ kilometre }<br>          }<br>        );<br>    }<br>    my @sorted = <br>                      sort{ $a->{distancia} <=> $b->{distancia} } <br>
                      @{ $magic_addicts->{ $user }->{ lojas_mais_proximas } };<br>    $magic_addicts->{ $user }->{ lojas_mais_proximas } = \@sorted;<br>    <br>}<br><br><br><br>print <<HTML;<br><br><!DOCTYPE html><br>
<html><br>  <head><br>    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"><br>    <meta charset="utf-8"><br>    <title>Simple markers</title><br>
    <link href="/maps/documentation/javascript/examples/default.css" rel="stylesheet"><br>    <script src="<a href="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false">https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false</a>"></script><br>
    <script><br>function initialize() {<br>  var myLatlng = new google.maps.LatLng( $lojas->{ loja1 }->{ lat }, $lojas->{ loja1 }->{ lon } );<br>  var mapOptions = {<br>    zoom: 11,<br>    center: myLatlng,<br>
    mapTypeId: google.maps.MapTypeId.ROADMAP<br>  }<br>  var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);<br>HTML<br><br>foreach my $loja ( keys $lojas ) {<br>print <<HTML;<br>
  new google.maps.Marker({<br>      position: new google.maps.LatLng( $lojas->{ $loja }->{ lat }, $lojas->{ $loja }->{ lon } ),<br>      map: map,<br>      title: '$loja',<br>      icon: '<a href="http://maps.google.com/mapfiles/ms/icons/blue-dot.png">http://maps.google.com/mapfiles/ms/icons/blue-dot.png</a>'<br>
  });<br>HTML<br>}<br><br>foreach my $user ( keys $magic_addicts ) {<br>print <<HTML;<br>  new google.maps.Marker({<br>      position: new google.maps.LatLng( $magic_addicts->{ $user }->{ location }->{ lat }, $magic_addicts->{ $user }->{ location }->{ lng } ),<br>
      map: map,<br>      title: '$user',<br>      icon: '<a href="http://maps.google.com/mapfiles/ms/icons/red-dot.png">http://maps.google.com/mapfiles/ms/icons/red-dot.png</a>'<br>  });<br>HTML<br>}<br><br>
print <<HTML;<br><br>}<br><br>google.maps.event.addDomListener(window, 'load', initialize);<br><br>    </script><br>  </head><br>  <body><br>    <div id="map-canvas" style="width: 400px; height: 400px;"></div><br>
<br>    <pre><br>Dentro do objeto \$magic_addicts estão as distancias calculadas e ordenadas<br>HTML<br><br>print p $magic_addicts;<br><br>print <<HTML;<br>    </pre><br><br>  </body><br></html><br>
<br><br>HTML<br><br><div><div><div><div><div><div><div><div><div><div><br><br></div></div></div></div></div></div></div></div></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/8/31 Hernan Lopes <span dir="ltr"><<a href="mailto:hernanlopes@gmail.com" target="_blank">hernanlopes@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Quanto ao CEP, é simples tambem, vc precisa fazer o seguinte para descobrir as coordenadas relacionadas a um cep... o myagawa implementou um módulo que facilita esse tipo de busca:<br>
<br></div><div>abs,<br>
<br></div><div>Hernan<br></div><div><br># Imprime coordenadas relacionadas a um CEP<br>use Geo::Coder::Google;<br>use Data::Printer;<br>my $cep      = "04363-040" ,<br>   $geocoder = Geo::Coder::Google->new(apiver => 3),<br>

   $location = $geocoder->geocode( location => "Brasil, cep $cep" );<br>print "A latutide e longitude para o $cep é: \n";<br>print "Latitude: ", $location->{ geometry }->{ location }->{ lat }, "\n";<br>

print "Longitude: ", $location->{ geometry }->{ location }->{ lng }, "\n";<br><br><br></div><br><div><br><br></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">
2013/8/31 Hernan Lopes <span dir="ltr"><<a href="mailto:hernanlopes@gmail.com" target="_blank">hernanlopes@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div>Ahh, e vc pode implementar em qq linguagem, é bem simples, segue implementacao em JS pra vc colar no seu firebug:<br>

<br></div>abs,<br><br></div>Hernan<br><div><div><br><pre>var to_radian = function( val ) {<br>
    return val * Math.PI / 180;<br>}<br><br>var cidade = {<br>    new_york : {<br>        lat : 40.697169,<br>        lon : -74.052658<br>    },<br>    sao_paulo : {<br>        lat : -23.548943,<br>        lon : -46.638818<br>


    }<br>};<br><br>var partida = cidade[ "new_york" ];<br>var destino = cidade[ "sao_paulo" ];<br><br>var raio_da_terra = 6371; // <a href="http://pt.wikipedia.org/wiki/Raio_da_Terra" target="_blank">http://pt.wikipedia.org/wiki/Raio_da_Terra</a><br>


var dLat = to_radian(destino["lat"]-partida["lat"]);<br>var dLon = to_radian(destino["lon"]-partida["lon"]);<br>var lat1 = to_radian(partida["lat"]);<br>var lat2 = to_radian(destino["lat"]);<br>


var a = Math.sin(dLat/2) * Math.sin(dLat/2) +<br>        Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); <br>var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); <br>var d = raio_da_terra * c;<br>

console.log( "A distância entre Nova York e São Paulo é: " + d + " km ");</pre>
<br></div></div></div><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/8/31 Hernan Lopes <span dir="ltr"><<a href="mailto:hernanlopes@gmail.com" target="_blank">hernanlopes@gmail.com</a>></span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div><div><div><div>Segue um exemplo prático da fórmula de haversine... essa fórmula calcula a distância entre duas coordenadas com latitude e longitude.<br><br></div>O exemplo abaixo demonstra o cálculo da distância entre são paulo e nova york: <br>



</div>Se fizer o mesmo procedimento no google maps, vai ver que o valor é igual.<br><br></div>abs,<br><br></div>Hernan<br><div><div><div><div><br>use strict;<br>use warnings;<br>use GIS::Distance; <br>use Data::Printer;<br>



<br>my $gis             = GIS::Distance->new();<br>   $gis->formula( 'Haversine' );<br><br>my $cidade = { <br>    new_york => { <br>        lat => 40.697169, <br>        lon => -74.052658 <br>    } , <br>



    sao_paulo => { <br>        lat => -23.548943 , <br>        lon => -46.638818 <br>    } <br>} ; <br>my @partida         = ( $cidade->{ new_york }->{ lat }, $cidade->{ new_york }->{ lon } );<br>my @destino         = ( $cidade->{ sao_paulo }->{ lat }, $cidade->{ sao_paulo }->{ lon } );<br>



my $distance        = $gis->distance( @partida => @destino );<br>warn "A distância entre Nova york e São Paulo é: " , $distance->{ values }->{ $distance->{unit} } , " ",  $distance->{unit};<br>



<br><br><br></div></div></div></div></div><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/8/31 Hernan Lopes <span dir="ltr"><<a href="mailto:hernanlopes@gmail.com" target="_blank">hernanlopes@gmail.com</a>></span><br>



<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">De qualquer maneira, dadas duas coordenadas, a fórmula da distância de haversine vai te dar a resposta.<br>



<br>É só vc usar este módulo com a opcão "Haversine" e as coordenadas, conforme: <a href="https://metacpan.org/module/GIS::Distance" target="_blank">https://metacpan.org/module/GIS::Distance</a><br>
<br><br></div><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/8/31 Blabos de Blebe <span dir="ltr"><<a href="mailto:blabos@gmail.com" target="_blank">blabos@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">Obrigado Stan, vou dar uma olhada.<div><br></div><div>Desculpe se a pergunta é idiota, mas tem binding disso em Perl?</div></div><div><div><div class="gmail_extra"><br><br><div class="gmail_quote">
2013/8/31 Stanislaw Pusep <span dir="ltr"><<a href="mailto:creaktive@gmail.com" target="_blank">creaktive@gmail.com</a>></span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Tem API do Google para isso, o Distance Matrix:<div><br><div><div>    var service = new google.maps.DistanceMatrixService();</div>






<div>    service.getDistanceMatrix({</div><div>        origins: players,</div>

<div>        destinations: players,</div><div>        travelMode: google.maps.TravelMode.WALKING,</div><div>    }, function (response, status) {</div><div>        if (status == google.maps.DistanceMatrixStatus.OK) {</div>








<div>            var origins = response.originAddresses;</div><div>            var destinations = response.destinationAddresses;</div><div>            ...</div><div>        }</div><div>    });</div></div><div><br></div></div>








</div><div class="gmail_extra"><br><br><div class="gmail_quote"><div><div>2013/8/31 Blabos de Blebe <span dir="ltr"><<a href="mailto:blabos@gmail.com" target="_blank">blabos@gmail.com</a>></span><br></div>

</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div>

<div dir="ltr">Fala pessoal,<div><br></div><div>Eu estou fazendo mais um trabalho final na faculdade ( é, eu sei, é o segundo, longa história... ) e vou precisar integrar com uma api de mapas.</div><div><br></div>

<div>O trabalho é um site pra ajudar jogadores de magic, e uma das ajudas é encontrar a loja mais próxima.</div><div><br></div><div>Eu nunca mexi com mapas antes então gostaria que vocês me apontassem documentação, módulos, dicas etc.</div>










<div><br></div><div>Basicamente o que eu preciso é plotar lojas no mapa e calcular distâncias entre elas e entre os jogadores, da mesma forma que o locator da wizards faz:</div><div><br></div><div>

<a href="http://locator.wizards.com/#brand=magic&a=search&p=20550-060&c=-23.7246761476923,-46.57210253923074&massmarket=no" target="_blank">http://locator.wizards.com/#brand=magic&a=search&p=20550-060&c=-23.7246761476923,-46.57210253923074&massmarket=no</a><br>










</div><div><br></div><div>Parto do pressuposto que eu sei pelo menos o CEP de todo mundo.</div><div><br></div><div>Qualquer ajuda é bem vinda.</div><div><br></div><div>[]'s</div><div>

<br></div><div><br></div><div><br></div></div>
<br></div></div>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div><br></div>
<br>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div><br></div>
</div></div><br>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br></blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>