{"id":182,"date":"2016-05-17T23:44:32","date_gmt":"2016-05-18T03:44:32","guid":{"rendered":"https:\/\/ventiladorcito.com\/blog\/?p=182"},"modified":"2016-05-25T16:05:12","modified_gmt":"2016-05-25T20:05:12","slug":"geohash-mysql-agrupando-coordenadas-gps-cercanas","status":"publish","type":"post","link":"https:\/\/ventiladorcito.com\/blog\/2016\/05\/geohash-mysql-agrupando-coordenadas-gps-cercanas\/","title":{"rendered":"GEOHASH MySQL &#8211; Agrupando coordenadas GPS cercanas"},"content":{"rendered":"<p>Desde el post anterior, estoy queriendo hacer otro mostrando como se puede usar el ffmpeg, pero estoy armando unos timelapses buenos primero, para mostrar el verdadero potencial, aparte estoy investigando m\u00e1s sobre los par\u00e1metros que se pueden usar, para mejorar la performance, y tratando de entenderlos mejor, en cuanto tenga eso solucionado, les mostrar\u00e9.<\/p>\n<p><a href=\"https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2016\/05\/wow46.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-183 alignright\" src=\"https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2016\/05\/wow46-300x223.png\" alt=\"muchos puntos en un solo lugar\" width=\"300\" height=\"223\" srcset=\"https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2016\/05\/wow46-300x223.png 300w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2016\/05\/wow46-768x571.png 768w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2016\/05\/wow46-624x464.png 624w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2016\/05\/wow46.png 845w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>Ahora quiero hablarles de otro proyecto en el que estoy (s\u00ed, s\u00e9 que es malo tener varios proyectos en simult\u00e1neo, porque no termino ni lo uno ni lo otro, \u00bfpero que puedo hacer?, mi mente se dispersa muy r\u00e1pido), el proyecto con el que estoy, es relacionado a ir almacenando puntos GPS.<\/p>\n<p>Ahora mismo estoy teniendo un problema ya que cuando se est\u00e1 mucho tiempo en un solo lugar, normalmente \u00a0como los aparatos GPS tienen cierto margen de error de unos metros, se empiezan a formar nubes de puntos en un solo lugar, haciendo que uno tenga cientos o inclusive miles de puntos si uno estuvo mucho tiempo quieto.<!--more--><\/p>\n<p>Buscando por la red, encontr\u00e9 que la forma en la que muchos solucionaron el problema, es usando algo que se conoce como geo-hashing, de que se trata? Bueno, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Geohash\">la Wikipedia nos dice lo siguiente<\/a>:<\/p>\n<blockquote><p><b>Geohash<\/b> is a <a title=\"Geocoding\" href=\"https:\/\/en.wikipedia.org\/wiki\/Geocoding\">geocoding<\/a> system invented by <a class=\"new\" title=\"Gustavo Niemeyer (page does not exist)\" href=\"https:\/\/en.wikipedia.org\/w\/index.php?title=Gustavo_Niemeyer&amp;action=edit&amp;redlink=1\">Gustavo Niemeyer<\/a> and placed into the <a title=\"Public domain\" href=\"https:\/\/en.wikipedia.org\/wiki\/Public_domain\">public domain<\/a>. It is a hierarchical spatial data structure which subdivides space into buckets of <a title=\"Grid (spatial index)\" href=\"https:\/\/en.wikipedia.org\/wiki\/Grid_(spatial_index)\">grid<\/a> shape, which is one of the many applications of what is known as a <a title=\"Z-order curve\" href=\"https:\/\/en.wikipedia.org\/wiki\/Z-order_curve\">Z-order curve<\/a>, and generally <a class=\"mw-redirect\" title=\"Space-filling curves\" href=\"https:\/\/en.wikipedia.org\/wiki\/Space-filling_curves\">space-filling curves<\/a>.<\/p>\n<p>Geohashes offer properties like arbitrary precision and the possibility of gradually removing characters from the end of the code to reduce its size (and gradually lose precision).<\/p>\n<p>As a consequence of the gradual precision degradation, nearby places will often (but not always) present similar prefixes. The longer a shared prefix is, the closer the two places are.<\/p><\/blockquote>\n<p>que mal y pronto se traduce en algo parecido a esto:<\/p>\n<blockquote><p><strong>Geohash\u00a0<\/strong>es un sistema de geocodificaci\u00f3n inventado por Gustavo Niemeyer y que fue hecho de dominio p\u00fablico. Es una estructura jer\u00e1rquica de datos espaciales que divide el espacio en retazos menores formando una grilla (tal vez se pueda traducir como red tambi\u00e9n), que es \u00a0una de las muchas aplicaciones de lo que se conoce como una curva de orden Z, y generalmente curvas de relleno de espacio.<\/p>\n<p>Los geohashes ofrecen propiedades como precisi\u00f3n arbitraria y la posibilidad de gradualmente remover caracteres del final del c\u00f3digo para reducir su tama\u00f1o (y gradualmente perder precisi\u00f3n).<\/p>\n<p>Como consecuencia de la degradaci\u00f3n de la precisi\u00f3n, lugares cercanos a menudo (pero no siempre) presentar\u00e1n prefijos similares.<\/p><\/blockquote>\n<h1>Esto b\u00e1sicamente, era lo que estaba buscando!!! \ud83d\ude00<\/h1>\n<p>En mi caso yo uso un hash de doce caracteres, por ej.\u00a0<strong>tk2zym7mjztt\u00a0<\/strong><br \/>\nTengo entendido que a partir de ciertas versiones de MySQL\u00a0y tambien en MariaDB estas funciones ser\u00e1n nativas, pero como no es mi caso, tuve que buscar alguien que las haya hecho, de no ser as\u00ed terminar\u00eda viendo como funciona por dentro para hacer una yo mismo (por suerte no fue el caso). En el repositorio de\u00a0<a href=\"https:\/\/github.com\/nowelium\/\">nowelium<\/a>\u00a0encontr\u00e9 la soluci\u00f3n <a href=\"https:\/\/github.com\/nowelium\/geohash-mysql-func\">aqu\u00ed<\/a>. Bastaba con implementar su c\u00f3digo que quedar\u00e1 como procedimiento almacenado dentro de mi base de datos, para cuando lo necesite.<\/p>\n<p>Ejemplo de una consulta SQL, que actualmente estoy usando para obtener los puntos.<\/p>\n<table id=\"ci_profiler_queries_db_0\">\n<tbody>\n<tr>\n<td><code><strong>SELECT<\/strong>\u00a0p.*, C<strong>ON<\/strong>VERT_TZ<strong>(<\/strong>fecha_sistema,\u00a0\"+00:00\",\u00a0\"-04:00\"<strong>)<\/strong>\u00a0as\u00a0fecha_sistema_local,<br \/>\n<\/code><code>\u00a0 \u00a0 \u00a0 \u00a0SUBSTR<strong>IN<\/strong>G<strong>(<\/strong>geohash_encode<strong>(<\/strong>latitud,\u00a0longitud,\u00a012<strong>)<\/strong>,\u00a01,\u00a08<strong>)<\/strong>\u00a0as\u00a0gh<br \/>\n<strong>FROM<\/strong>\u00a0`posiciones`\u00a0`p`<br \/>\n<strong>WHERE<\/strong>\u00a0C<strong>ON<\/strong>VERT_TZ<strong>(<\/strong>fecha_sistema,\"+00:00\",\"-04:00\"<strong>)<\/strong>\u00a0&gt;\u00a0'2016-05-17 00:00:00'<br \/>\n<strong>\u00a0 \u00a0 \u00a0 \u00a0AND<\/strong>\u00a0C<strong>ON<\/strong>VERT_TZ<strong>(<\/strong>fecha_sistema,\"+00:00\",\"-04:00\"<strong>)<\/strong>\u00a0&lt;=\u00a0'2016-05-17 23:50:20'<br \/>\n<\/code><code><strong>AND<\/strong>\u00a0`gps_disponible`\u00a0=\u00a0'A'<br \/>\n<\/code><code><strong>GROUP\u00a0BY<\/strong>\u00a0`gh`<br \/>\n<strong>ORDER\u00a0BY<\/strong>\u00a0`fecha_sistema`\u00a0DESC\u00a0<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><a href=\"https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2016\/05\/wow47.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-184\" src=\"https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2016\/05\/wow47-300x227.png\" alt=\"Menos puntos en el mismo lugar\" width=\"300\" height=\"227\" srcset=\"https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2016\/05\/wow47-300x227.png 300w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2016\/05\/wow47-768x580.png 768w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2016\/05\/wow47-624x472.png 624w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2016\/05\/wow47.png 819w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>En el substring que se hace sobre el resultado de la funci\u00f3n, aumentando el numero, en este caso 8 en direcci\u00f3n al 12, se obtendr\u00e1n m\u00e1s puntos, y disminuyendo, es decir, acerc\u00e1ndolo a 1, se ir\u00e1n obteniendo menos puntos ( esto es, se perder\u00e1 precisi\u00f3n). En mi caso, yo no quer\u00eda perder tanta precisi\u00f3n, as\u00ed que fui probando finalmente el 8 resulto ser el n\u00famero que necesitaba. Esto redujo de cerca de 236\u00a0puntos que ten\u00eda inicialmente a unos 90 aproximadamente, donde igual tengo noci\u00f3n del recorrido hecho.<\/p>\n<p>Bueno, eso es lo que ten\u00eda para escribir hoy, antes de ir a dormir.<\/p>\n<p>Saludos!!!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Desde el post anterior, estoy queriendo hacer otro mostrando como se puede usar el ffmpeg, pero estoy armando unos timelapses buenos primero, para mostrar el verdadero potencial, aparte estoy investigando m\u00e1s sobre los par\u00e1metros que se pueden usar, para mejorar la performance, y tratando de entenderlos mejor, en cuanto tenga eso solucionado, les mostrar\u00e9. Ahora [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22,12,80,15],"tags":[88,87,84,81,86,85,82,83],"class_list":["post-182","post","type-post","status-publish","format-standard","hentry","category-adelantos","category-bases-de-datos","category-geo","category-mysql","tag-agrupacion","tag-coordenadas","tag-geohash","tag-gps","tag-gustavo-niemeyer","tag-hash","tag-latitud","tag-longitud"],"_links":{"self":[{"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/posts\/182","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/comments?post=182"}],"version-history":[{"count":3,"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/posts\/182\/revisions"}],"predecessor-version":[{"id":193,"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/posts\/182\/revisions\/193"}],"wp:attachment":[{"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/media?parent=182"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/categories?post=182"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/tags?post=182"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}