{"id":229213,"date":"2022-11-06T17:18:00","date_gmt":"2022-11-06T14:18:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229213"},"modified":"2022-11-09T05:59:18","modified_gmt":"2022-11-09T02:59:18","slug":"latitud-y-longitud-en-php-algunas-practicas-utiles","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/latitud-y-longitud-en-php-algunas-practicas-utiles\/","title":{"rendered":"Latitud y longitud en PHP: algunas pr\u00e1cticas \u00fatiles"},"content":{"rendered":"\n<p>En publicaciones anteriores, escrib\u00ed un poco sobre c\u00f3mo trabajar con la <a href=\"https:\/\/tommcfarlin.com\/tag\/google-maps-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">API de Google Maps<\/a>. A decir verdad, no he trabajado con \u00e9l desde esa publicaci\u00f3n.<\/p>\n<p>Sin embargo, he tenido que trabajar con latitud y longitud en PHP, y hay algunas pr\u00e1cticas que he comenzado a usar que creo que nos pueden servir bien cuando trabajamos con coordenadas o valores de punto flotante, en general.<\/p>\n<p>En el siguiente fragmento de c\u00f3digo, desglosar\u00e9 el enfoque que he usado y por qu\u00e9 lo he hecho. Pero quiero dejar claro que si est\u00e1 leyendo esto en relaci\u00f3n con la API de Google Maps, no hay mucho que pueda ofrecer sobre c\u00f3mo funciona esto y la versi\u00f3n actual de su API.<\/p>\n<h2>Latitud y longitud en PHP<\/h2>\n<p>Cada vez que trabaja con latitud y longitud en PHP, est\u00e1 trabajando con valores de coma flotante, \u00bfverdad? As\u00ed que nunca querr\u00e1s analizarlos en nada menos que eso; de lo contrario, est\u00e1 perdiendo datos y no podr\u00e1 localizar lo que sea que est\u00e9 tratando de localizar.<\/p>\n<p>Entonces, para todos los efectos, supongamos que tiene informaci\u00f3n que ingresa al servidor y necesita trabajar con ella usando PHP.<\/p>\n<p>Las dos cosas que quieres recordar son:<\/p>\n<ol>\n<li>desinfectar los datos entrantes,<\/li>\n<li>aseg\u00farese de que se convierta a un valor de coma flotante.<\/li>\n<\/ol>\n<p>Esto se puede hacer mediante el uso de las funciones <a href=\"https:\/\/php.net\/manual\/en\/function.filter-var.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">filter_var<\/a> y <a href=\"https:\/\/php.net\/manual\/en\/function.floatval.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">floatval<\/a> de PHP, de las que hablar\u00e9 en un momento. Tenga en cuenta, sin embargo, que si el resultado de <strong>floatval<\/strong> no devuelve un punto flotante, debe tener una forma elegante de manejar eso.<\/p>\n<p>Seg\u00fan el manual, <strong>floatval<\/strong> puede devolver lo siguiente:<\/p>\n<blockquote>\n<p>El valor flotante de la variable dada. Las matrices vac\u00edas devuelven 0, las matrices no vac\u00edas devuelven 1. Lo m\u00e1s probable es que las cadenas devuelvan 0, aunque esto depende de los caracteres m\u00e1s a la izquierda de la cadena. Se aplican las reglas comunes de fundici\u00f3n flotante.<\/p>\n<\/blockquote>\n<p>Veremos c\u00f3mo manejar esto con m\u00e1s gracia m\u00e1s adelante en la publicaci\u00f3n.<\/p>\n<h3>An\u00e1lisis de latitud y longitud entrantes<\/h3>\n<p>Supongamos que los valores entrantes est\u00e1n en la colecci\u00f3n <a href=\"https:\/\/php.net\/manual\/en\/reserved.variables.request.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$_REQUEST<\/a> de PHP (que se refieren a las solicitudes HTTP que ingresan al servidor) codificadas como <strong>acme-demo-latitude<\/strong> y <strong>acme-demo-longitude.\u00a0<\/strong><\/p>\n<p>Podemos recuperarlos <a href=\"https:\/\/gist.github.com\/anonymous\/99e718375ec9ad9bbdd6d4c366a40752#file-00-retrieving-floating-point-values-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed<\/a> :<\/p>\n<pre><code>&lt;?php\n\n$latitude  = $_REQUEST['acme-demo-latitude'];\n$longitude = $_REQUEST['acme-demo-longitude'];<\/code><\/pre>\n<p>Pero esto no es suficiente. Primero, necesitamos usar <strong>filter_var<\/strong> para asegurarnos de que los datos est\u00e9n desinfectados y sigan <a href=\"https:\/\/gist.github.com\/anonymous\/99e718375ec9ad9bbdd6d4c366a40752#file-01-filtering-floating-point-values-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">el esquema de punto flotante<\/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>A continuaci\u00f3n, encuentro \u00fatil usar <strong>floatval<\/strong> para analizar el resultado como un valor de punto flotante. Esto deja el siguiente bloque de c\u00f3digo con <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\">este<\/a> aspecto :<\/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>Despu\u00e9s de lo cual eres libre de usarlo. Pero recuerde, a\u00fan debemos asegurarnos de que los valores devueltos sean valores de punto flotante.<\/p>\n<h3>Validaci\u00f3n de los datos<\/h3>\n<p>Ahora que tenemos la informaci\u00f3n, debemos asegurarnos de que se vea bien. Y si no es as\u00ed, tenemos que manejarlo apropiadamente. Si no es as\u00ed, simplemente podemos:<\/p>\n<ol>\n<li>devuelve falso de la funci\u00f3n de la que est\u00e1 contenido,<\/li>\n<li>lanzar una excepci\u00f3n y permitir que la persona que llama lo maneje como mejor le parezca.<\/li>\n<\/ol>\n<p>Cada uno de estos ejemplos puede verse <a href=\"https:\/\/gist.github.com\/anonymous\/99e718375ec9ad9bbdd6d4c366a40752#file-03-validating-values-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed<\/a> :<\/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>Sin embargo, en \u00faltima instancia, la decisi\u00f3n es suya sobre c\u00f3mo manejar los valores cuando no est\u00e1n en el formato adecuado una vez que los analiza.<\/p>\n<h2>\u00bfSon estas mejores pr\u00e1cticas?<\/h2>\n<p>Para ser honesto, lo dudo. S\u00e9 que estas son las cosas que he estado usando y que he encontrado \u00fatiles. Tambi\u00e9n proporciona una forma defensiva y resistente de asegurarse de que sus valores sean correctos.<\/p>\n<p>Pero si hay mejores formas de hacer esto, estoy abierto a escucharlas en los comentarios.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>He estado trabajando con latitud y longitud en PHP. Hay pr\u00e1cticas que creo que nos sirven bien cuando trabajamos con valores de coma flotante.<\/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":[914,840,861],"tags":[1172],"class_list":["post-229213","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-otro","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=229213"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229213\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/166466"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=229213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=229213"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=229213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}