Gustavo Almeida
PHP Geo
$whois
CEP = Brasil / 10
Acertam
cerca de
60% dos IPs
Brasileiros
Geolocation API - HTML5
navigator.geolocation.getCurrentPosition()
Da definição no W3C - https://www.w3.org/TR/geolocation-API/
The Geolocation API defines a high-level interface to location information associated
only with the device hosting the implementation, such as latitude and longitude. The
API itself is agnostic of the underlying location information sources. Include
GPS and location inferred from network signals, IP address, RFID, WiFi, Bluetooth,
MAC addresses. No guarantee is given that the API returns the device's actual
location.
Cada navegador faz do seu jeito
Faz um POST com diversas informações
coletadas, por exemplo: mac-address, redes
wi-fi, força do sinal da rede wi-fi, etc.
“Geografia” é derivada de uma palavra grega
GEO, que significa “terra”
GRAPHEIN, “descrever” ou “descrição”
GEOGRAPHIA é algo como “descrição da terra”
LatLng
geodesico
28°40’39″S 49°22’11″W
UTM decimal
41.403338, -2.174303
Usando a fórmula de Haversine
Selecionar emails de usuários dentro de um raio de 20Km em ordem crescente em
relação ao centro. Considere que o centro desta busca é -30.053831, -51.191810
SELECT email,
(6371 * acos(
cos( radians(-30.053831) )
* cos( radians( lat ) )
* cos( radians( lng ) - radians(-51.191810) )
+ sin( radians(-30.053831) )
* sin( radians( lat ) )
)
) AS distancia
FROM usuarios
HAVING distancia < 20
ORDER BY distancia ASC;
GIS é um sistema de hardware, software, informação espacial e procedimentos
computacionais que permite e facilita a análise, gestão ou representação do espaço
geográfico
Tipos de Dados
select email from usuarios
where st_distance(point(@center_lon, @center_lat), coordinates) <= radius;
+60 funções
nome-projeto
Google Maps
Mapa de Calor
AutoComplete (javascript)
Google Places
Google Places
Posso obter dos 'places'
● Site
● Fone Fixo
● Ranking
● Num. de avaliações
● Fotos do local
● lat lng
● Viewport
● Resenhas
● Proprietários das resenhas
● Score
● Endereço completo com complemento
● Horário de pico
Google Routes
Obter todos os dados do trajeto
● Tipo transporte (carro, moto, a pé, etc)
● Rotas em texto retornadas
● Rotas com geo-informação retornadas
● Tempo e distância
● Rotas alternativas a este trajeto
● Incluir pontos intermediários
● Custos
Estrutura geral de uma consulta
http://maps.googleapis.com/maps/api/directions/json?parameters
Parâmetros Obrigatórios (exemplo directions)
● key
● origin
● destination
Parâmetros Opcionais (exemplo directions)
● mode (o default é carro)
● waypoints (pontos intermediários)
● avoid (evitar pontos intermediários)
● arrival_time (timestamp)
● departure_time (timestamp)
● transit_routing_preference (less_walking ou fewer_transfers)
directions - Google Routes
geocode - Geo IP
place - Google Places
maps - Google Maps
staticmap - Google Static Maps
https://maps.googleapis.com/maps/api/staticmap?center=Brooklyn+Bridge,New+York,NY&zoom=13&size=60
0x300&maptype=roadmap&markers=color:blue%7Clabel:S%7C40.702147,-74.015794&markers=color:green
%7Clabel:G%7C40.711614,-74.012318&markers=color:red%7Clabel:C%7C40.717,-73.984&key=API_KEY
Google Maps Static API
Basicamente devemos construir uma URL e incorporar a tag <img src=https://maps.goog …. >
path é apenas um parâmetro na URL
path=color:0x0000ff|weight:5|40.737102,-73.990318|40.749825,-73.987963|40.752946,-
73.987384|40.755823,-73.986397
path=color:0x00000000|weight:5|fillcolor:0xFFFF0033|8th+Avenue+%26+34th+St,New
+York,NY|8th+Avenue+%26+42nd+St,New+York,NY|Park+Ave+%26+42nd+St,New+Y
ork,NY,NY|Park+Ave+%26+34th+St,New+York,NY,NY
https://maps.googleapis.com/maps/api/staticmap?size=400x400&center=40.653279,-73.959816&zoom=11&path=fillcolor:0xAA0000
33%7Ccolor:0xFFFFFF00%7Cenc:}zswFtikbMjJzZ%7CRdPfZ}DxWvBjWpF~IvJnEvBrMvIvUpGtQpFhOQdKpz@bIx{A%7CPfYlvA
pz@bl@tcAdTpGpVwQtX}i@%7CGen@lCeAda@bjA%60q@v}@rfAbjA%7CEwBpbAd_@he@hDbu@uIzWcWtZoTdImTdIwu@tDa
OXw_@fc@st@~VgQ%7C[uPzNtA%60LlEvHiYyLs^nPhCpG}SzCNwHpz@cEvXg@bWdG%60]lL~MdTmEnCwJ[iJhOae@nCm[%60
Aq]qE_pAaNiyBuDurAuB}}Ay%60@%7CEKv_@?%7C[qGji@lAhYyH%60@Xiw@tBerAs@q]jHohAYkSmW?aNoaAbR}LnPqNtMtIbR
yRuDef@eT_z@mW_Nm%7CB~j@zC~hAyUyJ_U{Z??cPvg@}s@sHsc@_z@cj@kp@YePoNyYyb@_iAyb@gBw^bOokArcA}GwJu
zBre@itf@sZnd@oElb@hStW{]vv@??kz@~vAcj@zKa%60Atf@uQj_Aee@pU_UrcA&key=YOUR_API_KEY
Google Encoded Polyline
Algoritmo próprio que visa encapsular
vários pontos lat/lng para que possam ser
transmitidos via URL
entrada: array de coordenadas
processamento: 11 passos
saida: string
class Polyline{
protected static $precision = 5;
final public static function encode( $points ){
$points = self::flatten($points);
$encodedString = '';
$index = 0;
$previous = [0,0];
foreach ( $points as $number ) {
$number = (float)($number);
$number = (int)round($number * pow(10, static::$precision));
$diff = $number - $previous[$index % 2];
$previous[$index % 2] = $number;
$number = $diff;
$index++;
$number = ($number < 0) ? ~($number << 1) : ($number << 1);
$chunk = '';
while ( $number >= 0x20 ) {
$chunk .= chr((0x20 | ($number & 0x1f)) + 63);
$number >>= 5;
}
$chunk .= chr($number + 63);
$encodedString .= $chunk;
}
return $encodedString;
}
final public static function decode( $string ) {
$points = [ ];
$index = $i = 0;
$previous = [0,0];
while ($i < strlen($string)) {
$shift = $result = 0x00;
do {
$bit = ord(substr($string, $i++)) - 63;
$result |= ($bit & 0x1f) << $shift;
$shift += 5;
} while ($bit >= 0x20);
$diff = ($result & 1) ? ~($result >> 1) : ($result >> 1);
$number = $previous[$index % 2] + $diff;
$previous[$index % 2] = $number;
$index++;
$points[] = $number * 1 / pow(10, static::$precision);
}
return $points;
}
final public static function flatten( $array ) {
$flatten = [ ];
array_walk_recursive(
$array, // @codeCoverageIgnore
function ($current) use (&$flatten) {
$flatten[] = $current;
}
);
return $flatten;
}
final public static function pair( $list ){
return is_array($list) ? array_chunk($list, 2) : [ ];
}
}
$points = [
[41.89084,-87.62386 ],
[33.89086,66.62279 ],
[-23.89028,-37.62277 ],
[-44.89028,97.62385 ],
[41.89084,-87.62386 ],
];
Polyline::encode($points);
wxt~Fd`yuOCuErBC?vEoB@
Devemos assinar digitalmente nossa URL para que não haja roubo da APIKEY
1. Construa a URL usando utf-8 e usar a função url_encode()
2. Separe o path e query da URL usando parse_url()
3. Faça uma assinatura digital com a chave privada (Google) usando o hash sha1
4. Passe para base64 e troque os caracteres + e / por - e _
5. Adicione a URL o parâmetro signature com o resultado
function signQuery($query, $privateKey){
$url = parse_url($query);
$urlPartToSign = $url['path'].'?'.$url['query'];
$decodedKey = base64_decode(str_replace(['-', '_'], ['+', '/'], $privateKey));
$signature = hash_hmac('sha1', $urlPartToSign, $decodedKey, true);
$encodedSignature = str_replace(array('+', '/'), array('-', '_'), base64_encode($signature));
return sprintf('%s&signature=%s', $query, $encodedSignature);
}
https://maps.googleapis.com/maps/api/staticmap?center=40.714%2c%20-73.998&zoo
m=12&.......&signature=base64signature
1000 consultas = $2
(credito de $200)
Alternativas para Google Maps
1. OPENLAYERS
● Preço: Gratuito. Mapas lado a lado, mapas vetoriais e marcadores
2. TOMTOM
● Preço: Grátis por 2.500 solicitações diárias, US$ 0,42– US$ 0,50 por cada 1.000
subsequentes. Mapas lado a lado, mapas vetoriais, marcadores, pesquisa de localização,
densidade de tráfego, localização de rotas
● navegação: TomTom
● precisão: Mapfit
● visualizações de mapas: Here
● outros: Mapbox OpenLayers
www.LGA.com.br
bit.ly/php2019geo
github: lga37
slideshare: lga33
br.linkedin.com/in/lga37
Geolocalização em PHP - Google Places, Maps e Routes

Geolocalização em PHP - Google Places, Maps e Routes