<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>