Programadores. El hilo de los hinformáticos profesionales como PABLOPL.

Que Dios os lo pague con cuantiosos emolumentos :121 por la tarde lo pruebo.
 
Al final como no se trata de obtener la distancia más corta respecto a una serie de puntos dados sino simplemente comprobar si la distancia entre las coordenadas que nos dan y las almacenadas es inferior a un campo almacenado en la BDD, ha resultado ser más sencillo de lo que parecía pero la fórmula que me habéis pasado ha ido de perlas, me habéis ahorrado mucho trabajo, muchas gracias.

Por si os interesa esta es la 卐Solución Final卍 que he implementado:

PHP:
//$filters es un array pasado como parámetro que contiene pares de índice=>valor donde los índices son campos de la base de datos y los valores los que nos llegan por POST. Si un campo no llega en el filtro significa que no hay que evaluarlo, de forma que si no llega ningún filtro se recuperan todos los mensajes

//como uso CodeIgniter he aprovechado los active records para simplificar el trabajo
		//ejecutamos la consulta
		//$query = $this->db->get('sent_messages');

		//preparamos la consulta
		if(!empty($filters['date'])) {
			$this->db->where("date > ".$filters['date']);
		}
		if(!empty($filters['codeRecipient'])) {
			$this->db->where('codeRecipient', $filters['codeRecipient']);
		}
		if(!empty($filters['country'])) {
			$this->db->where('country', $filters['country']);
		}
		if(!empty($filters['language'])) {
			$this->db->where('language', $filters['language']);
		}
		if(!empty($filters['latitude']) && !empty($filters['longitude'])) {

			$lat = floatval($filters['latitude']);
			$lng = floatval($filters['longitude']);

			$this->db->where("111.045* DEGREES(ACOS(COS(RADIANS($lat))
					                 * COS(RADIANS(latitude))
					                 * COS(RADIANS($lng) - RADIANS(longitude))
					                 + SIN(RADIANS($lat))
					                 * SIN(RADIANS(latitude)))) < distance");
		}

Por si os interesa las coordenadas se obtienen a partir de una dirección natural usando la API Geocode de todopoderoso google.
 
Última edición:
Sí, pero había una comprobación redundante en las cláusulas where, ahora queda incluso más sencillo y va como un tiro incluso con 15000 mensajes.

Otra curiosidad es que los valores para lenguaje y país también se obtienen en tiempo real a partir de nombres naturales a partir de unos XML que generé siguiendo las normas ISO-3166, es posible que haya servicios que ofrezcan lo mismo GRATIS y haya hecho el canelo? :lol:
 
Si lo hay no lo conozco, pero en todo caso me parece mejor tu solución, no dependes de llamadas a API's de terceros, que pueden ir bien o no, o ser gratis hoy y mañana de pago, una vez tuve que hacer algo parecido y genere yo las bases de datos procesando ficheros comprados a Correos, soy de la opinión de que si algo que vas consultar no cambia a menudo es mejor siempre tenerlo integrado en tu modelo, por ejemplo no lo haría con una base de datos de geolocalización por IP, demasiados cambios a diario, pero sí para lo que tu has hecho.
 
Na, había puesto otra solución, pero si ya lo tienes y te va bien....
 
Última edición:
Yo no lo veo complicado, si tienes coordenadas (longitud y latitud) y un radio, solo tienes que buscar aquellos que restando longitud y latitud sea menor que el radio.

Por ejemplo: SELECT mensajes-Json FROM Base_Subnormales WHERE (( SQR(longitud - longitud_pajilleros) < SQR(radio)) AND ( SQR( latitud - latitud_pajilleros) < SQR(radio))

Si los datos de coordenadas están en otra tabla pues lo mismo pero con un having.

Esta aproximación valdría para coordenadas sobre un plano, pero no sobre una esfera. De todas formas ya está resuelto gracias a la fórmula de los semiversenos que me pasó PatoLaqueado.
 
Sí, me va de coña. Realmente no era tan difícil pero como desconocía esa ecuación que se ve que es un estándar en geodesia pensé que sería mucho más complicado de lo que realmente es, en realidad queda una consulta bastante simple y más usando los active records de codeigniter y construyéndola por partes.

A decir verdad no sé hasta qué punto sería óptima esta forma de resolverlo si, por ejemplo, hubiera que calcular el punto más cercano de una serie de puntos y comparar distancias resultantes pero para lo que yo quiero está genial.
 
Esta aproximación valdría para coordenadas sobre un plano, pero no sobre una esfera. De todas formas ya está resuelto gracias a la fórmula de los semiversenos que me pasó PatoLaqueado.

Si, tienes razón. No he caído en la cuenta que la longitud y latitud están en grados y el radio no. Supongo que por eso la formula esa tiene tantos senos y coseno. Para pasar los grados a la misma escala del radio.

Aunque yo, como buen español, seguiría en mis trece e intentaría hacerlo al revés, pasar el radio también a grados.
 
Si, tienes razón. No he caído en la cuenta que la longitud y latitud están en grados y el radio no. Supongo que por eso la formula esa tiene tantos senos y coseno. Para pasar los grados a la misma escala del radio.

Aunque yo, como buen español, seguiría en mis trece e intentaría hacerlo al revés, pasar el radio también a grados.

No, en realidad es así porque no es lo mismo la distancia entre dos puntos en un plano que en una esfera, así que por mucho que te empeñes en cambiar unidades si quieres que te funcione vas a tener que aplanar también la tierra de paso, entonces sí te funcionará, salvo que después de aplanarla se te ocurra "poner el radio en grados".

Mira que no tengo nada contra ti, pero es que es una detrás de otra, ¿Tu trabajas de programador?
 
Última edición:
Podemos bromear con editores, lenguajes de programación y metodologías ágiles. La cosa puede ponerse incluso algo tensa.

Pero con las matemáticas no se juega, hijos de la gran puta.

Pasar el radio a grados, me cago en Satanás.
 
No, en realidad es así porque no es lo mismo la distancia entre dos puntos en un plano que en una esfera, así que por mucho que te empeñes en cambiar unidades si quieres que te funcione vas a tener que aplanar también la tierra de paso, entonces sí te funcionará, salvo que después de aplanarla se te ocurra "poner el radio en grados".

Mira que no tengo nada contra ti, pero es que es una detrás de otra, ¿Tu trabajas de programador?

Nop, para ser programador ya veo que hay que pedir ayuda a los foros y robar código hecho por otros.

Supongo que cuando acabes el programa además tendrás los santos cojones de encima poner una licencia de software prohibiendo la copia o modificación del mismo, ¿no?. :lol:
 
pi-simbolo-constante-matematica_318-58870.jpg
 
Nop, para ser programador ya veo que hay que pedir ayuda a los foros y robar código hecho por otros.

Supongo que cuando acabes el programa además tendrás los santos cojones de encima poner una licencia de software prohibiendo la copia o modificación del mismo, ¿no?. :lol:

¿Robar, qué he robado? ¿Acabar qué programa, de qué coño hablas tarado? Eres definitivamente demasiado corto para ser programador.
 
Podemos bromear con editores, lenguajes de programación y metodologías ágiles. La cosa puede ponerse incluso algo tensa.

Pero con las matemáticas no se juega, hijos de la gran puta.

Pasar el radio a grados, me cago en Satanás.

Pos mira, leyendo leyendo hasta se puede hacer :lol:

1 grado = 20 leguas = 111.12 kilómetros. (Grado de latitud - Wikipedia, la enciclopedia libre)

Si buscas paisanos que vivan a menos de un radio de 500km de donde estás. Pues con una sencilla regla de 3...... 500*1/111,12= 0.04499640028 grados. Y ahora es comparar que el paisano no viva a +- 0.04499640028 grados longitud/latitud de donde te interesa.

hqdefault.jpg



Mañana si quieres lo calculamos en leguas marinas :1 :lol::lol::lol:


P.D: A ver si aprendes un poco Pato-Roba-Código
 
Última edición:
Pos mira, leyendo leyendo hasta se puede hacer :lol:

1 grado = 20 leguas = 111.12 kilómetros. (Grado de latitud - Wikipedia, la enciclopedia libre)

Si buscas paisanos que vivan a menos de un radio de 500km de donde estás. Pues con una sencilla regla de 3...... 500*1/111,12= 0.04499640028 grados. Y ahora es comparar que el paisano no viva a +- 0.04499640028 grados longitud/latitud de donde te interesa.

Radio de la Tierra [km] * 2 * pi / 360º = 111,12

¿Qué pretendes demostrar con eso?

Aunque no sea un cálculo nada fino, ¿compensaría la falta de precisión en la ubicación geoespacial una mayor eficiencia en las operaciones?

:yoshi:
 
Sí, gran parte del trabajo de un programador consiste en rastrear y pedir ayuda en foros, o por lo menos hay que hacerlo asiduamente y saber cómo hacerlo, que también tiene su qué.


La fórmula que puso Pato es un estándar, por esa regla de tres cada vez que calcules una trayectoria le estás robando código a Pitágoras no? Madre mía, lo que hay que leer :lol:
 
Última edición:
Que su nick es Leandro Gado. Leandro Gado, jejeje. No os ensañéis mucho.
 
Déjarlo no lo va a entender, para el un plano y una esfera son lo mismo, y las distancias se pueden calcular igual, y por si fuera poco las matemáticas "como buen español [sic]" se las pasa por el forro.

Leandro eres tonto, muy tonto, porque ni una sola de las respuestas que te he dado han sido para humillarte o quedar por encima de ti, simplemente te intentaba hacer ver que estabas equivocado, normalmente dabas la callada por respuesta en vez de bajarte de la burra. No se porque esta vez no haces lo mismo y te empeñas en seguir dejando patente que no tienes capacidad para entender lo que aquí se discute, ni esto, ni lo del JS ni lo del C++, y si sigo buscando seguro que más, pero por mi te puede seguir formando otro, si eso ya al siguiente problema que se plantee contestas tú pasando los radios a grados, y quitando "tantos senos y consenos".


PD: @Boniato que te falla la url de la firma rey.
 
Es que además, strictu senso, el único que ha puesto código aquí he sido yo. Pato se limitó a contestarme elegantemente con una respuesta que documentó con un paper y encima se tomó la molestia de probar las consultas SQL él mismo.


Por cierto, hoy he estado testeando y me funciona con una precisión de 50 metros, no he probado si afinando más funcionaría pero usando doubles estoy seguro de que sí. Teniendo en cuenta que los radios serán del orden de kilómetros no está nada mal.
 
Buenas, ¿Alguien ha tenido alguna experiencia con Ruby on rails?
Por lo que veo es la forma más rápida y fácil de hacer proyectos web que no requieran demasiadas conexiones activas y concurrentes. Ya ha pasado su mejor momento, pero sigue siendo la opción Startup por defecto.
 
Por cierto, hoy he estado testeando y me funciona con una precisión de 50 metros, no he probado si afinando más funcionaría pero usando doubles estoy seguro de que sí. Teniendo en cuenta que los radios serán del orden de kilómetros no está nada mal.


Qué sepas que no se me olvida que me debes un Easter Egg lolesco en la app. :lol:
 
Buenas, ¿Alguien ha tenido alguna experiencia con Ruby on rails?
Por lo que veo es la forma más rápida y fácil de hacer proyectos web que no requieran demasiadas conexiones activas y concurrentes. Ya ha pasado su mejor momento, pero sigue siendo la opción Startup por defecto.

Es un tiro para montar webs en un abrir y cerrar de ojos.

Si no fuera porque soy un pesao con el python, usaría RoR en lugar de Django, que es de la que tiro para montar webs de cuando en cuando. RoR me recuerda a CakePHP porque partes de algo funcional desde el principio, te basas en una estructura de directorios orientada al MVC. Por supuesto Ruby le da mil patadas a Php, pero eso sólo le da mérito a CakePHP, que aún hoy seguiría siendo un framwork decente si tuviera los recursos de los que ya dispones en RoR y Django.
 
Radio de la Tierra [km] * 2 * pi / 360º = 111,12

¿Qué pretendes demostrar con eso?

Aunque no sea un cálculo nada fino, ¿compensaría la falta de precisión en la ubicación geoespacial una mayor eficiencia en las operaciones?

:yoshi:

Pero que debe ser un puto programa para enviar mierda, propaganda o dar la trisca a los que tenga cerca. ¿Qué precisión quieres que tenga esa mierda?¿que sea capaz de acertarte en el ojete cuando estés en el baño?.

Sí, gran parte del trabajo de un programador consiste en rastrear y pedir ayuda en foros, o por lo menos hay que hacerlo asiduamente y saber cómo hacerlo, que también tiene su qué.


La fórmula que puso Pato es un estándar, por esa regla de tres cada vez que calcules una trayectoria le estás robando código a Pitágoras no? Madre mía, lo que hay que leer :lol:

Claro que si wapi !, es lo que está de moda, freelancer fusilando todo lo que puedas de internet porque es todo gratis, y luego ya si se cae el sistema, le echamos la culpa al becario.


Déjarlo no lo va a entender, para el un plano y una esfera son lo mismo, y las distancias se pueden calcular igual, y por si fuera poco las matemáticas "como buen español [sic]" se las pasa por el forro.

Leandro eres tonto, muy tonto, porque ni una sola de las respuestas que te he dado han sido para humillarte o quedar por encima de ti, simplemente te intentaba hacer ver que estabas equivocado, normalmente dabas la callada por respuesta en vez de bajarte de la burra. No se porque esta vez no haces lo mismo y te empeñas en seguir dejando patente que no tienes capacidad para entender lo que aquí se discute, ni esto, ni lo del JS ni lo del C++, y si sigo buscando seguro que más, pero por mi te puede seguir formando otro, si eso ya al siguiente problema que se plantee contestas tú pasando los radios a grados, y quitando "tantos senos y consenos".


PD: @Boniato que te falla la url de la firma rey.


Además de plagiador y chapucero pulsateclas, eres un llorón, pero llorón llorón. No me extraña que la informática esté tan mal en españa con patos-plagiadores como tú.

Espero que en foros más serios de informática, además de robar código, no te dediques también a llorar como aquí.
 
Claro que si wapi !, es lo que está de moda, freelancer fusilando todo lo que puedas de internet porque es todo gratis, y luego ya si se cae el sistema, le echamos la culpa al becario.

El sistema se va a caer por usar un algoritmo público? Si usas el algoritmo de burbuja para ordenar una lista estás fusilando código?

Tú eres idiota o qué te pasa :lol:

- - - Updated - - -

Qué sepas que no se me olvida que me debes un Easter Egg lolesco en la app. :lol:

Lo tengo presente :oops:
 
Atrás
Arriba Pie