{"id":229598,"date":"2022-11-06T17:21:00","date_gmt":"2022-11-06T14:21:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229598"},"modified":"2022-11-09T08:38:30","modified_gmt":"2022-11-09T05:38:30","slug":"latitude-e-longitude-em-php-algumas-praticas-uteis","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/latitude-e-longitude-em-php-algumas-praticas-uteis\/","title":{"rendered":"Latitude e Longitude em PHP: Algumas Pr\u00e1ticas \u00dateis"},"content":{"rendered":"\n<p>Nos posts anteriores, escrevi um pouco sobre como trabalhar com a <a href=\"https:\/\/tommcfarlin.com\/tag\/google-maps-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API do Google Maps<\/a>. Sinceramente, eu n\u00e3o trabalhei com isso desde aquele post.<\/p>\n<p>No entanto, tive que trabalhar com latitude e longitude em PHP, e existem algumas pr\u00e1ticas que comecei a usar que acho que podem nos servir bem ao trabalhar com coordenadas ou valores de ponto flutuante, em geral.<\/p>\n<p>No trecho de c\u00f3digo a seguir, detalharei a abordagem que usei e por que fiz isso. Mas quero deixar claro que, se voc\u00ea estiver lendo isso em rela\u00e7\u00e3o \u00e0 API do Google Maps, n\u00e3o h\u00e1 muito que eu possa oferecer sobre como isso funciona e a vers\u00e3o atual de sua API.<\/p>\n<h2>Latitude e Longitude em PHP<\/h2>\n<p>Sempre que voc\u00ea est\u00e1 trabalhando com latitude e longitude em PHP, voc\u00ea est\u00e1 trabalhando com valores de ponto flutuante, certo? Ent\u00e3o voc\u00ea nunca quer analis\u00e1-los em nada menos do que isso; caso contr\u00e1rio, voc\u00ea estar\u00e1 perdendo dados e n\u00e3o conseguir\u00e1 localizar o que quer que esteja tentando localizar.<\/p>\n<p>Portanto, para todos os efeitos, vamos supor que voc\u00ea tenha informa\u00e7\u00f5es chegando ao servidor e precise trabalhar com elas usando PHP.<\/p>\n<p>As duas coisas que voc\u00ea quer lembrar s\u00e3o:<\/p>\n<ol>\n<li>higienizar os dados recebidos,<\/li>\n<li>certifique-se de que seja convertido em um valor de ponto flutuante.<\/li>\n<\/ol>\n<p>Isso pode ser feito atrav\u00e9s do uso das fun\u00e7\u00f5es <a href=\"https:\/\/php.net\/manual\/en\/function.filter-var.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">filter_var<\/a> e <a href=\"https:\/\/php.net\/manual\/en\/function.floatval.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">floatval<\/a> do PHP, sobre as quais falarei brevemente. Observe, no entanto, que se o resultado de <strong>floatval<\/strong> n\u00e3o retornar um ponto flutuante, voc\u00ea precisa ter uma maneira elegante de lidar com isso.<\/p>\n<p>De acordo com o manual, <strong>floatval<\/strong> pode retornar o seguinte:<\/p>\n<blockquote>\n<p>O valor float da vari\u00e1vel fornecida. Arrays vazios retornam 0, arrays n\u00e3o vazios retornam 1. Strings provavelmente retornar\u00e3o 0, embora isso dependa dos caracteres mais \u00e0 esquerda da string. As regras comuns de fundi\u00e7\u00e3o de flutua\u00e7\u00e3o se aplicam.<\/p>\n<\/blockquote>\n<p>Veremos como lidar com isso mais graciosamente mais adiante no post.<\/p>\n<h3>Analisando Latitude e Longitude de Entrada<\/h3>\n<p>Vamos supor que os valores recebidos estejam na cole\u00e7\u00e3o <a href=\"https:\/\/php.net\/manual\/en\/reserved.variables.request.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$_REQUEST<\/a> do PHP (que se refere \u00e0s solicita\u00e7\u00f5es HTTP que chegam ao servidor) codificados como <strong>acme-demo-latitude<\/strong> e <strong>acme-demo-longitude.\u00a0<\/strong><\/p>\n<p>Podemos recuper\u00e1-los <a href=\"https:\/\/gist.github.com\/anonymous\/99e718375ec9ad9bbdd6d4c366a40752#file-00-retrieving-floating-point-values-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/a> :<\/p>\n<pre><code>&lt;?php\n\n$latitude  = $_REQUEST['acme-demo-latitude'];\n$longitude = $_REQUEST['acme-demo-longitude'];<\/code><\/pre>\n<p>Mas isso n\u00e3o \u00e9 suficiente. Primeiro, precisamos usar <strong>filter_var<\/strong> para garantir que os dados sejam higienizados e sigam <a href=\"https:\/\/gist.github.com\/anonymous\/99e718375ec9ad9bbdd6d4c366a40752#file-01-filtering-floating-point-values-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o esquema de ponto flutuante<\/a> :<\/p>\n<pre><code>&lt;?php\n\n$latitude  = filter_var(\n    $_REQUEST['acme-demo-latitude'],\n    FILTER_SANITIZE_NUMBER_FLOAT\n);\n\n$longitude = filter_var(\n    $_REQUEST['acme-demo-longitude'],\n    FILTER_SANITIZE_NUMBER_FLOAT\n);<\/code><\/pre>\n<p>Em seguida, acho \u00fatil usar <strong>floatval<\/strong> para analisar o resultado como um valor de ponto flutuante. Isso deixa o seguinte bloco de c\u00f3digo <a href=\"https:\/\/gist.github.com\/anonymous\/99e718375ec9ad9bbdd6d4c366a40752#file-02-parse-the-floating-point-values-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/a> :<\/p>\n<pre><code>&lt;?php\n\n$latitude  = floatval(\n  filter_var(\n    $_REQUEST['acme-demo-latitude'],\n    FILTER_SANITIZE_NUMBER_FLOAT) );\n\n$longitude = floatval(\n  filter_var(\n    $_REQUEST['acme-demo-latitude'],\n    FILTER_SANITIZE_NUMBER_FLOAT) );<\/code><\/pre>\n<p>Depois disso, voc\u00ea est\u00e1 livre para us\u00e1-lo. Mas lembre-se, ainda precisamos ter certeza de que os valores retornados s\u00e3o valores de ponto flutuante.<\/p>\n<h3>Validando os dados<\/h3>\n<p>Agora que temos as informa\u00e7\u00f5es, precisamos ter certeza de que parece bom. E se isso n\u00e3o acontecer, precisamos lidar com isso adequadamente. Se n\u00e3o for, ent\u00e3o podemos simplesmente:<\/p>\n<ol>\n<li>retorne false da fun\u00e7\u00e3o da qual est\u00e1 contido,<\/li>\n<li>lan\u00e7ar uma exce\u00e7\u00e3o e permitir que o chamador a trate da maneira que achar melhor.<\/li>\n<\/ol>\n<p>Cada um desses exemplos pode ter <a href=\"https:\/\/gist.github.com\/anonymous\/99e718375ec9ad9bbdd6d4c366a40752#file-03-validating-values-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esta<\/a> apar\u00eancia :<\/p>\n<pre><code>&lt;?php\n\n\/\/ Return false...\nif (! (is_float( $latitude) &amp;&amp; is_float( $longitude) )) {\n  return false;\n}\n\n\/\/ Or throw an exception...\nif (! (is_float( $latitude) &amp;&amp; is_float( $longitude) )) {\n  throw new Exception('Latitude and longitude are not valid floating point values.');\n}\n<\/code><\/pre>\n<p>Em \u00faltima an\u00e1lise, por\u00e9m, a decis\u00e3o \u00e9 sua sobre como lidar com os valores quando eles n\u00e3o est\u00e3o no formato adequado depois de analis\u00e1-los.<\/p>\n<h2>Essas s\u00e3o as melhores pr\u00e1ticas?<\/h2>\n<p>Para ser sincero, duvido. Eu sei que estas s\u00e3o as coisas que eu tenho usado e que achei \u00fateis. Ele tamb\u00e9m fornece uma maneira defensiva e resiliente de garantir que seus valores estejam corretos.<\/p>\n<p>Mas se houver maneiras melhores de fazer isso, estou aberto a ouvi-las nos coment\u00e1rios.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eu tenho trabalhado com latitude e longitude em PHP. Existem pr\u00e1ticas que acho que nos servem bem ao trabalhar com valores de ponto flutuante.<\/p>\n","protected":false},"author":1,"featured_media":166466,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[920,846,867],"tags":[1170],"class_list":["post-229598","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-outro","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229598","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=229598"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229598\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/166466"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229598"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229598"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229598"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}