9 votos

PostGIS equivalente a ArcGIS Select by Location "Are within"

Estoy tratando de seleccionar polígonos que están dentro de un polígono más grande en PostGIS pero no se devuelven los que comparten límites con el polígono más grande.

Si utilizo ArcGIS Select By Location obtengo el resultado que necesito, 17 características. Pero si utilizo PostGIS sólo obtengo 4 características, lo mismo que si utilizo ArcGIS "están completamente dentro".

Correct result in ArcGIS

Consultas que he intentado, pero sin éxito:

select count(a.cd_geocodi)
from t_ibge_setor_censitario a, t_ibge_municipio_2015 b
where b.nm_municip = 'PARAÍSO DAS ÁGUAS'

cand ST_Intersects(a.geom,b.geom); Resultado: 34

select count(a.cd_geocodi)
from t_ibge_setor_censitario a, t_ibge_municipio_2015 b 
where b.nm_municip = 'PARAÍSO DAS ÁGUAS'
and ST_Within(a.geom,b.geom);

Resultado: 4

select count(a.cd_geocodi)
from t_ibge_setor_censitario a, t_ibge_municipio_2015 b
where b.nm_municip = 'PARAÍSO DAS ÁGUAS'
and ST_Contains(b.geom,a.geom);

Resultado: 4

select count(a.cd_geocodi)
from t_ibge_setor_censitario a, t_ibge_municipio_2015 b
where b.nm_municip = 'PARAÍSO DAS ÁGUAS'
and ST_Coveredby(a.geom,b.geom);

Resultado: 4

select count(a.cd_geocodi)
from t_ibge_setor_censitario a, t_ibge_municipio_2015 b
where b.nm_municip = 'PARAÍSO DAS ÁGUAS'
and ST_Covers(b.geom,a.geom);

Resultado: 4

¿Hay alguna manera de obtener esas 17 características en PostGIS?

9voto

alpha-beta-soup Puntos 1449

Esto depende un poco de si los rasgos pequeños dependen de los rasgos más grandes: ¿comparten realmente un límite común o hay pequeñas discrepancias a lo largo de sus bordes aparentemente comunes?

ST_Within(a.geom, b.geom) : le da las geometrías en b que son totalmente dentro de a.geom . Y significa totalmente dentro de .

ST_Intersects(a.geom, b.geom) : esto es un poco más tolerante, devolviendo cualquier cosa en b que simplemente toca a en absoluto, incluso en un solo punto de la frontera. Pero si se combina con NOT ST_Touches(a.geom, b.geom) como se menciona en un comentario de John Barça ( ST_Intersects(a.geom, b.geom) AND NOT ST_Touches(a.geom, b.geom) ), entonces le quedará (con suerte) el resultado que desea. Tenga en cuenta que las pequeñas imperfecciones en los límites podrían significar que el resultado no es adecuado, y podría necesitar algún tipo de tolerancia para obtener el resultado correcto. Si todavía tiene problemas, puede aplicar un pequeño búfer negativo a las geometrías en b para hacerlos más pequeños (aunque esto es bastante sucio), o utilizar ST_DWithin(a.geom, b.geom, 10) o tal vez podría asegurarse de que a.geom y b.geom tienen una relación topológica verificada y no difieren ligeramente en los bordes.

1voto

Phaedrus Puntos 378

Supongo que esta respuesta llega un poco tarde, pero he descubierto una manera de hacerlo en QGIS, y un proceso similar puede ser utilizado para PostGIS. Primero utilicé la herramienta de geoprocesamiento, buffer. Establecer valores muy pequeños (esto dependerá de la escala de sus características) para obtener un archivo de forma que tiene límites muy similares.

Después de eso, utilicé la nueva capa como base para seleccionar por ubicación, utilizando dentro.

0voto

heavyd Puntos 8845

Utiliza un buffer negativo para actuar como una distancia de búsqueda negativa. Es decir, encontrar las características de la tabla 2 que están dentro de -5m de la tabla 1. Esto detendrá los polígonos limítrofes de fuera del área seleccionada.

SELECT b.*
FROM table1 a,
table2 b
WHERE ST_DWITHIN(b.geom,(ST_BUFFER(a.geom,-5)),0);

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