{"id":33,"date":"2014-11-17T01:43:02","date_gmt":"2014-11-17T00:43:02","guid":{"rendered":"http:\/\/www.mikropunto.org\/?p=33"},"modified":"2025-07-30T13:41:37","modified_gmt":"2025-07-30T12:41:37","slug":"angularjs-mysql-google-maps-y-demasiados-datos","status":"publish","type":"post","link":"https:\/\/mikropunto.org\/?p=33","title":{"rendered":"AngularJS, mysql, google maps y demasiados datos"},"content":{"rendered":"<p>AngularJS es una opci\u00f3n estupenda a la hora de escribir una aplicaci\u00f3n interactiva; est\u00e1 dise\u00f1ado para vigilar los cambios en la vista y reaccionar inmediatamente. Cuando se trata de hacer una p\u00e1gina que funcione como un programa, el dise\u00f1o es muy r\u00e1pido y moderadamente sencillo.<\/p>\n<p>Para una demostraci\u00f3n de <a title=\"ver art\u00edculo\" href=\"http:\/\/elpais.com\/diario\/1999\/01\/09\/andalucia\/915837748_850215.html\" target=\"_blank\" rel=\"noopener\">Los Nombres de Europa<\/a>, de Alberto Porlan, escrib\u00ed una aplicaci\u00f3n, que est\u00e1 desactivada en estos momentos, hace unos meses. Se presentaron varios problemas: para empezar, la base de datos de top\u00f3nimos hubo que extraerla de un mdb de access que tiene aproximadamente 850.000 entradas. Para hacer m\u00e1s sencilla la b\u00fasqueda, convert\u00ed los top\u00f3nimos a un sistema simplificado usando enteros en base 3 usando un script de perl y depurando las excepciones. por otro lado, cada b\u00fasqueda implica el c\u00e1lculo de todos los top\u00f3nimos cercanos, teniendo en cuenta que es una distancia topogr\u00e1fica y no sobre un plano recto, lo que la hace mucho m\u00e1s lenta. Por \u00faltimo la representaci\u00f3n en un mapa de google dio sus problemas; la documentaci\u00f3n brillaba por su ausencia.<\/p>\n<p>En un futuro a\u00f1adir\u00e9 una b\u00fasqueda relacional por tres atingentes y un sistema de estad\u00edsticas, que muestren los datos de top\u00f3nimos relacionados por \u00e1reas de la pen\u00ednsula.<\/p>\n<p><a href=\"https:\/\/mikropunto.org\/nomeuropae\/\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-34\" src=\"https:\/\/mikropunto.org\/wp-content\/uploads\/nomeuropae_1-300x211.jpg\" alt=\"nomeuropae\" width=\"300\" height=\"211\" srcset=\"https:\/\/mikropunto.org\/wp-content\/uploads\/nomeuropae_1-300x211.jpg 300w, https:\/\/mikropunto.org\/wp-content\/uploads\/nomeuropae_1.jpg 700w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<h2>C\u00e1lculo de distancias<\/h2>\n<p>Para hallar la distancia entre dos puntos topogr\u00e1ficos (a vista de p\u00e1jaro) hay que tener en cuenta la curvatura terrestre. En este caso he usado la\u00a0 f\u00f3rmula del <a href=\"http:\/\/www.movable-type.co.uk\/scripts\/latlong.html\" target=\"_blank\" rel=\"noopener\">haverseno<\/a>, ya que permite un c\u00e1lculo lo suficientemente preciso sin tener que recurrir a algoritmos mucho mas lentos.<\/p>\n<pre>CREATE FUNCTION geo_distance(lon0 DECIMAL, lat0 DECIMAL, lon1 DECIMAL, lat1 DECIMAL) RETURNS DECIMAL(3,4)\n BEGIN\n DECLARE distance DECIMAL(3,4) DEFAULT 0;\n SET distance = 6372 * 2 * ASIN(SQRT(POWER(SIN((lat0 - lat1) * PI()\/180\/2),2) + COS(lon0 * PI()\/180) * COS(lat1 * PI() \/ 180) * POWER(SIN((lon0 - lon1) * PI()\/180\/2),2) ));\nRETURN distance;\nEND;\n<\/pre>\n<p><strong>nota:<\/strong> El valor 6372 es el radio terrestre medio en km, suficiente para la precisi\u00f3n que se necesita para esta aplicaci\u00f3n.<\/p>\n<p>Este procedimiento es r\u00e1pido, pero se puede mejorar el rendimiento total de una forma muy simple si s\u00f3lo lo aplicamos entre los valores aproximados, filtrando por sus coordenadas de una forma aproximada. Es decir, s\u00f3lo buscando entre los lugares que se encuentren a una distancia m\u00e1xima seg\u00fan su logitud y latitud:<\/p>\n<pre>SELECT *, ...\nFROM temp_table JOIN temp_table1\nWHERE\n (LON_ROOT BETWEEN temp_table.LON - 0.25 AND temp_table.LON + 0.25)\n AND\n (LAT_ROOT BETWEEN temp_table.LAT - 0.25 AND temp_table.LAT + 0.25)\nHAVING ...\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>AngularJS es una opci\u00f3n estupenda a la hora de escribir una aplicaci\u00f3n interactiva; est\u00e1 dise\u00f1ado para vigilar los cambios en la vista y reaccionar inmediatamente. Cuando se trata de hacer una p\u00e1gina que funcione como un programa, el dise\u00f1o es &hellip; <a href=\"https:\/\/mikropunto.org\/?p=33\">Sigue leyendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[],"class_list":["post-33","post","type-post","status-publish","format-standard","hentry","category-angularjs"],"_links":{"self":[{"href":"https:\/\/mikropunto.org\/index.php?rest_route=\/wp\/v2\/posts\/33","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mikropunto.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mikropunto.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mikropunto.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mikropunto.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=33"}],"version-history":[{"count":13,"href":"https:\/\/mikropunto.org\/index.php?rest_route=\/wp\/v2\/posts\/33\/revisions"}],"predecessor-version":[{"id":157,"href":"https:\/\/mikropunto.org\/index.php?rest_route=\/wp\/v2\/posts\/33\/revisions\/157"}],"wp:attachment":[{"href":"https:\/\/mikropunto.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=33"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mikropunto.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=33"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mikropunto.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=33"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}