5 votos

Actualización añadió una nueva columna de una tabla mediante ST_Intersection como un filtro

Yo estaría muy agradecido a cualquiera que me pueda ayudar con el siguiente problema. He utilizado PostGIS mucho antes de lo que podría ser considerado un novato...

Mi Situación:

Tengo DOS PostGIS tablas:

  1. carreteras
  2. country_boundary

Los caminos de mesa es tan grande (dentro de la aplicación de 500MB) que quiero mostrar es por country_boundary.

Puedo hacer esto con éxito utilizando la siguiente consulta:

select ST_ASBINARY(roads.geog::geometry) from roads, country_boundary 
where country_boundary.adm0_name='Sudan' 
and ST_Intersects(roads.geog::geometry, country_boundary.geog::geometry)

Sin EMBARGO se toma demasiado tiempo para mostrar los datos (varios minutos) nota: he probado la mayoría de las técnicas de optimización, los índices espaciales, (ST_Simplify/ST_SimplifyPreserveTopology) estos quitar datos o toma tan mucho tiempo.

Pensé que había encontrado una solución simple que trabajó - añadir una nueva columna 'adm0_name' (también conocido como nombre del país) para las carreteras de la tabla y se rellena mediante la ST_Intersects consulta anterior.

update roads 
set adm0_name = 'Sudan'
where ST_ASBINARY(roads.geog::geometry) in
(
  select ST_ASBINARY(roads.geog::geometry) from roads, country_boundary where country_boundary.adm0_name='Sudan' and ST_Within(roads.geog::geometry, country_boundary.geog::geometry)
);

La resultante de la pantalla de consulta: funciona rápido, y como era de esperar.. >>problema resuelto<< ??

select ST_ASBINARY(roads.geog::geometry) from roads where roads.adm0_name='Sudan'

LAMENTABLEMENTE NO...

El ST_Intersects incluye un pequeño número de geometrías (polilínea(s) que son compartidos con los países vecinos. Esto significa polilíneas (caminos) que atraviesan el país de los límites, no se puede dar un país único nombre. Nota: he utilizado originalmente ST_Within pero esta eliminado los datos que se comparten entre los países vecinos (como era de esperar, con características como las carreteras o ríos que no respetan las fronteras de los países).

..... gracias por dar conmigo...

Decidí que necesitaba usar ST_Intersection porque esto podría evitar el problema con el límite de - 'clip' el camino de conjunto de datos para cada país de límite evitando así la polilínea de contorno del problema.

Esto funciona - tengo una intersección de consulta que muestra los datos OK

Select ST_ASBINARY (
ST_Intersection(g1.geom1, g1.geom2)) FROM (Select country_boundary.geog::geometry As geom1, roads.geog::geometry As geom2 from country_boundary, roads 
where country_boundary.adm0_name = 'Sudan') AS g1;

MI PROBLEMA: no puedo encontrar una manera de actualizar las carreteras.adm0_name columna con el nombre del país porque ST_Intersection parece devuelve una geometría, no se comporta como un ST_Intersects, donde pude actualizar la columna.

Mi intento de hacer esto es la siguiente ---> 26 horas más tarde he llegado a un punto de rascarse la cabeza. Podría alguien de ustedes me ayude a salir?

update roads 
set adm0_name = 'Sudan'
where ST_ASBINARY(roads.geog::geometry) in
(
 Select ST_ASBINARY (
ST_Intersection(g1.geom1, g1.geom2)) FROM (Select country_boundary.geog::geometry As geom1, roads.geog::geometry As geom2 from country_boundary, roads where country_boundary.adm0_name = 'Sudan') AS g1;
);

Sin embargo, la afirmación anterior se produce un error ---> necesito actualizar los caminos.adm0_name con country_boundary.adm0_name donde (country_boundary "ST_Intersection" caminos).

Gracias de nuevo --

3voto

fd. Puntos 6835

Gracias por la ayuda.

Al final he hecho una nueva tabla y se copian las columnas necesitaba -- solución más abajo Nota: digno mencionar a Paul Ramsey que se recomienda el método siguiente para acelerar el ST_Intersection la consulta fue de 6 horas y 4 minutos. Vale la pena mirar hacia arriba...

BEGIN;

--insert into contours

insert into contours_country(gid,fnode_,tnode_,lpoly_,rpoly_,length,contourl_,contourl_i,f_code,f_code_des,hqc,hqc_descri,zv2,zv2_descri,tile_id,edg_id,adm0_name,geog,geom)
select 
a.gid As gid,
a.fnode_ As fnode_,
a.tnode_ As tnode_,
a.lpoly_  As lpoly_,
a.rpoly_ As rpoly_,
a.length As length,
a.contourl_ As contourl,
a.contourl_i AS contourl_i,
a.f_code As f_code,
a.f_code_des As f_code_des,
a.hqc As hqc,
a.hqc_descri As hqc_descri,
a.zv2 As zv2,
a.zv2_descri As zv2_descri,
a.tile_id As tile_id,
a.edg_id As edg_id,
b.adm0_name As adm0_name,
a.geog As geog,

CASE
WHEN ST_WITHIN(a.geog::geometry,b.geog::geometry)
THEN a.geog::geometry
ELSE ST_Intersection(a.geog::geometry, b.geog::geometry)
END AS geom

From contours a
JOIN country_boundary b

ON ST_Intersects(a.geog::geometry, b.geog::geometry)

Where b.adm0_name ='Niger';

--insert in roads

insert into roads_country(gid,fnode_,tnode_,lpoly_,rpoly_,length,road3a_,road3a_id,fnode___7,tnode___8,lpoly___9,rpoly___10,road3_,road3_id,rdline_,rdline_id,rdlntype,rdlnstat,adm0_name,geog,geom)
select 
a.gid As gid,
a.fnode_ As fnode_,
a.tnode_ As tnode_,
a.lpoly_ As lpoly_,
a.rpoly_ As rpoly_,
a.length As length,
road3a_ As road3a_,
road3a_id As road3a_id,
fnode___7 As fnode___7,
tnode___8 As tnode___8,
lpoly___9 As lpoly___9,
rpoly___10 As rpoly___10,
road3_ As road3_,
road3_id As road3_id,
rdline_ As rdline_,
rdline_id As rdline_id,
rdlntype As rdlntype,
rdlnstat As rdlnstat,
b.adm0_name As adm0_name,
a.geog As geog,

CASE
WHEN ST_WITHIN(a.geog::geometry,b.geog::geometry)
THEN a.geog::geometry
ELSE ST_Intersection(a.geog::geometry, b.geog::geometry)
END AS geom

From roads a
JOIN country_boundary b

ON ST_Intersects(a.geog::geometry, b.geog::geometry)

Where b.adm0_name ='Niger';



--insert into wadis

insert into wadis_country(gid,fnode_,tnode_,lpoly_,rpoly_,length,dnnet_,dnnet_id,dnlntype,dnlnstat,adm0_name,geog,geom)
select 
a.gid As gid,
a.fnode_ As fnode_,
a.tnode_ As tnode_,
a.lpoly_ As lpoly_,
a.rpoly_ As rpoly_,
a.length As length,
a.dnnet_ As dnnet_,
a.dnnet_id As dnnet_id,
a.dnlntype As dnlntype,
a.dnlnstat As dnlnstat,
b.adm0_name As adm0_name,
a.geog As geog,

CASE
WHEN ST_WITHIN(a.geog::geometry,b.geog::geometry)
THEN a.geog::geometry
ELSE ST_Intersection(a.geog::geometry, b.geog::geometry)
END AS geom

From wadis a
JOIN country_boundary b

ON ST_Intersects(a.geog::geometry, b.geog::geometry)

Where b.adm0_name ='Niger';

COMMIT;

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X