Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Planteamiento de consulta ¡¡Help!!

Estas en el tema de Planteamiento de consulta ¡¡Help!! en el foro de PostgreSQL en Foros del Web. Lo primero un saludo a todos los usuarios del foro. Ahora el problema. El entorno es (PostgreSQL + Postgis), tengo una tabla con geometrías ('Linestring'), ...
  #1 (permalink)  
Antiguo 16/12/2010, 03:43
 
Fecha de Ingreso: diciembre-2010
Mensajes: 4
Antigüedad: 13 años, 11 meses
Puntos: 0
Pregunta Planteamiento de consulta ¡¡Help!!

Lo primero un saludo a todos los usuarios del foro.

Ahora el problema.

El entorno es (PostgreSQL + Postgis), tengo una tabla con geometrías ('Linestring'),
con todas sus caracteristicas, Srid, etc, dentro de la tabla tengo la columna length de tipo double la cual es la longuitud de la geometria.

La consulta que querría desarrollar seria la siguiente:

Separar todas las geometrias por grupos dadas 2 condiciones.

1ª que las geometrias se toquen.

Para ello tengo la función
Código SQL:
Ver original
  1. st_touches( the_geom , the_geom)
que retorna true o false

2ª que la suma de las longuitudes del grupo que se vaya generando sea <= a un numero variable que yo le pasaria y cuando llegue a ese total aproximadamente,
se cierre ese grupo y continue con los siguientes registros, generando tantos grupos como fueran necesarios.

No debiendo existir registros duplicados, pues si una geometria forma parte de un grupo, no puede formar parte de otro.

Teniendo en cuenta que cada geometria se puede tocar con una o varias.

Y generar una tabla nueva con los campos de id de la geometría y Grupo al que pertenecería.

Lo más que de momento tengo es:

Código SQL:
Ver original
  1. SELECT  t1.gid, t2.gid, SUM(t1.LENGTH+t2.LENGTH) AS Metros  
  2. FROM tabla t1, tabla t2    
  3. WHERE st_touches(t1.the_geom,t2.the_geom) = 't' -- se tocan
  4. AND t1.LENGTH + t2.LENGTH <= 5500 -- variable
  5. GROUP BY t1.gid,t2.gid,t1.the_geom,t2.the_geom
  6. ORDER BY t1.gid,t2.gid;

Como podeis ver no se por donde empezar, ¿una función recursiva?, ¿un select?.

Con el problema que cualquiera de ellos seria el primero que voy hacer en serio y en profundidad.

Me he leido todas las paginas del foro y en algunas he visto cosas que creo que podian ayudarme, pero no termino de encontrar el camino.

Muchas gracias de antemano, y un saludo.
  #2 (permalink)  
Antiguo 16/12/2010, 08:23
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 19 años, 3 meses
Puntos: 7
Respuesta: Planteamiento de consulta ¡¡Help!!

aja... y esa consulta que muestras, ¿no te funciona?
__________________
Gracias de todas todas
-----
Linux!
  #3 (permalink)  
Antiguo 16/12/2010, 08:58
 
Fecha de Ingreso: diciembre-2010
Mensajes: 4
Antigüedad: 13 años, 11 meses
Puntos: 0
Exclamación Respuesta: Planteamiento de consulta ¡¡Help!!

Gracias por interesarte cacr.

No, ni se acerca.

Devuelve todas las combinaciones de elementos, imagina de una tabla de 2033 registros, devolvera aproximadamente unas aprox 8153 relaciones.

Por que no va separando los registros ya procesados.

Por ejemplo devuelve algo parecido a esto:

geom1 geom2 suma_de_ambas
geom1 geom3 suma_de_ambas
geom2 geom1 suma_de_ambas -- duplicado es = al primer registro

y asi hasta el final
  #4 (permalink)  
Antiguo 16/12/2010, 09:42
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Planteamiento de consulta ¡¡Help!!

Aunque tengo cero (0) conocimientos en POSTGIS veo que haces referencia a 2 tablas y no tienes una condiciones que relacione ambas tablas.

asumiendo que gid es el campo que tienen en común ambas tablas prueba de esta forma.

Código SQL:
Ver original
  1. SELECT  t1.gid, t2.gid, SUM(t1.LENGTH+t2.LENGTH) AS Metros  
  2. FROM tabla t1 INNER JOIN tabla t2    
  3. ON t1.gid=t2.gid
  4. WHERE st_touches(t1.the_geom,t2.the_geom) = 't' -- se tocan
  5. AND t1.LENGTH + t2.LENGTH <= 5500 -- variable
  6. GROUP BY t1.gid,t2.gid,t1.the_geom,t2.the_geom
  7. ORDER BY t1.gid,t2.gid;
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 16/12/2010, 10:31
 
Fecha de Ingreso: diciembre-2010
Mensajes: 4
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Planteamiento de consulta ¡¡Help!!

Gracias y un saludo.
No, es una tabla unicamente, de la cual quiero selecionando los grupos
segun las condiciones anteriores:

1ª se tocan.

2ª la suma de ellas no sobrepasa el valor dado.

Perdon por no saber explicarme.

Seria pasar a una tabla nueva los registros segun se vayan seleccionando.

Por Ej.-
reg1 toca con reg2 y suma_reg1+reg2 <= valor; ok

-pasaria a una tabla nueva el reg1 y reg2 con mismo valor de grupo

reg1 toca con reg3 y suma_reg1+reg2+reg3 < = valor ok;

-pasaria a la tabla nueva el reg3 con mismo valor grupo que anteriores

reg1 toca con reg4 y suma_reg1+reg2+reg3+reg4 > = valor no;

-lo descarto y continuo con reg5

-si no encuentro ninguno más que toque con reg1, continuaria con reg2 evitando los que ya tengo en la tabla nueva.

asi hasta llegar lo mas cercano al numero pasado como variable.

En resumen seria dividir el total de las distancias de todos los elementos x la variable, lo que daria aprox. el numero de grupos que tendria que tener en la tabla nueva.

No se si me he explicado, o lo he liado más.

De ser así pido perdón.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:11.