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:
- carreteras
- 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 --