Pregunta

Estoy tratando de ver si alguien sabe cómo agrupar algunos resultados Lat / Long, utilizando una base de datos, para reducir la cantidad de resultados enviados a través de la transferencia a la aplicación.

Hay varios recursos sobre cómo agrupar, ya sea en el lado del cliente O en el lado del servidor (aplicación) ... pero no en el lado de la base de datos :(

Esta es una pregunta similar , hecha por un compañero de S.O. miembro. Las soluciones están basadas en el lado del servidor (es decir, detrás del código C #).

¿Alguien ha tenido suerte o experiencia para resolver esto, pero en una base de datos? ¿Hay algún gurú de bases de datos que esté detrás de un desafío de DB hawt y sexy?

por favor ayuda :)

EDITAR 1: Aclaración: al agrupar, espero agrupar x número de puntos en un solo punto, para un área. Entonces, si digo agrupar todo en un cuadrado de 1 milla / 1 km, entonces todos los resultados en ese 'cuadrado' son GROUP'D en un solo resultado (digamos ... el centro del cuadrado).

EDIT 2: estoy usando MS Sql 2008, pero estoy abierto a escuchar si hay otras soluciones en otros DB.

¿Fue útil?

Solución

Probablemente usaría una versión * modificada de k -means agrupamiento utilizando las coordenadas cartesianas (por ejemplo, WGS-84 ECF) para sus puntos. Es fácil de implementar & amp; converge rápidamente y se adapta a sus datos sin importar cómo se ve. Además, puede elegir k para satisfacer sus requisitos de ancho de banda, y cada grupo tendrá el mismo número de puntos asociados (mod k).

Haría una tabla de centroides de clúster y agregaría un campo a la tabla de datos original para indicar a qué clúster pertenecía también. Obviamente, desearía actualizar el agrupamiento periódicamente si sus datos son dinámicos. No sé si podrías hacer eso con un procedimiento almacenado & amp; disparador, pero tal vez.

* La " modificación " sería ajustar la longitud de los vectores centroides calculados para que estuvieran en la superficie de la tierra. De lo contrario, terminaría con un montón de puntos con altitud negativa (cuando se convierte de nuevo a LLH).

Otros consejos

Si está agrupando en una ubicación geográfica, y no puedo imaginar que sea otra cosa :-), puede almacenar el " ID de clúster " en la base de datos junto con las coordenadas lat / long.

Lo que quiero decir con eso es dividir el mapa del mundo en (por ejemplo) una matriz de 100x100 (10,000 grupos) y cada coordenada se asigna a uno de esos grupos.

Entonces, puede detectar coordenadas muy cercanas seleccionando aquellas en el mismo cuadrado y moderadamente cercanas seleccionando aquellas en cuadrados adyacentes.

El tamaño de sus cuadrados (y, por lo tanto, el número de ellos) se decidirá según la precisión que necesite para que sea la agrupación. Obviamente, si solo tiene una matriz de 2x2, podría obtener una agrupación de coordenadas que están muy separadas.

Yo siempre tendrá los casos de borde como dos puntos muy juntos pero en diferentes grupos (uno más al norte en su grupo, el otro más al sur en su), pero puede ajustar el tamaño del grupo O post- procesar los resultados en el lado del cliente.

Hice algo similar para una aplicación geográfica donde quería asegurarme de que podía almacenar en caché los conjuntos de puntos fácilmente. Mi código de geohashing se ve así:

def compute_chunk(latitude, longitude)
  (floor_lon(longitude) * 0x1000) | floor_lat(latitude)
end

def floor_lon(longitude)
  ((longitude + 180) * 10).to_i
end

def floor_lat(latitude)
  ((latitude + 90) * 10).to_i
end

Todo se volvió realmente fácil a partir de ahí. Tenía un código para tomar todos los fragmentos de un punto dado a un radio determinado que se traduciría en un solo multigetio de memcache (y un código para rellenarlo cuando faltaba).

Para movielandmarks.com utilicé el código de agrupación de Mike Purvis , uno de los autores de Inicio de aplicaciones de Google Maps con PHP y AJAX . Construye árboles de grupos / puntos para diferentes niveles de zoom usando PHP y MySQL, almacenándolos en la base de datos para que la recuperación sea muy rápida. Parte de esto puede ser útil incluso si está utilizando una base de datos diferente.

¿Por qué no probar múltiples enfoques?

  1. traduzca la weka en .NET CLI con IKVM.NET
  2. agregue un ensamblado resultante de su código y weka.dll (use ilmerge) en su base de datos

Haz algunas pruebas, eso es. Ningún agrupamiento específico funciona mejor que nadie.

Creo que puede usar tipos de datos espaciales de MSSQL . Si son similares a otros tipos de datos espaciales que conozco, almacenarán sus puntos en un árbol de rectángulos, y luego puede ir a los rectángulos de menor resolución para obtener grupos implícitos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top