5 votos

¿Cómo puedo seleccionar los puntos dentro de una distancia especificada de un polígono de la frontera?

Tengo una tabla con puntos y otra tabla con los polígonos (multipolyons para ser más exactos). ¿Cómo puedo encontrar los puntos que caen dentro de una distancia especificada del polígono de la frontera? La mayoría de los puntos caen dentro de un polígono, pero quiero una lista de puntos que caen dentro de 100 metros de un polígono perimetral. Si un punto está a 20 metros de un límite que es compartida por polígonos adyacentes, yo esperaría que el punto a se enumeran a menos de 100 metros de los dos polígonos.

El SQL a continuación selecciona demasiados puntos. Seleccionar puntos en el interior del polígono, pero fuera de el interior de búfer. No debe seleccionar puntos en el interior del polígono y de más de 100 metros de la orilla.

select * 
from towers t, areas c
where st_dwithin(t.geom, c.geom, 100.00)
order by t.description

¿Cómo puedo modificar esta consulta para devolver los puntos que están a menos de 100 metros de un polígono de la frontera, no necesariamente todos los puntos dentro de la poylgon?

4voto

Sanket Gupta Puntos 21

Este era complicado, así que me descompone mucho el uso de CTE.

Por lo que he entendido la pregunta que él quiere encontrar puntos a menos de 100 metros de cualquier límite, ya sea dentro de nuestro fuera del polígono. Yo también proporcionan una variante para el caso donde se desea eliminar duplicados puntos (en el alcance de los más de un polígono).

Estoy asumiendo que usted tabla inicial de las tablas que se llama 'mutipolytable' y 'puntos'.

WITH 
--Dump as single polygon
poly as (SELECT *, (ST_dump(geom)).geom AS geom_poly FROM mutipolytable),
--Dump every rings in polygon
rings as (SELECt *, (ST_DumpRings(geom_poly)).geom as geom_rings from poly),
--Convert every rings to linestrings
boundary as (SELECT *, ST_boundary(geom_rings) as geom_boundary from rings)

--Join points table to boundary using ST_DWithin
SELECT boundary.*, points.* FROM
point JOIN boundary
ON ST_DWithin(points.geom,boundary.geom_boundary,100)

Alternativamente, si su objetivo es seleccionar el punto cerca de la frontera sin necesidad de mantener la información acerca de qué polígono se encuentra en llegar a reemplazar sólo el final de la instrucción SELECT.

SELECT DISTINCT point.* FROM
point JOIN boundary
ON ST_DWithin(point.the_geom,boundary.geom_boundary,100)

1voto

PhiLho Puntos 23458

EDITAR:

Después de un par de veces la lectura de la pregunta:

Esta respuesta sólo funciona para los puntos fuera de los polígonos


Puede excluir los puntos dentro de los polígonos con la función ST_Contains.

SELECT * 
FROM points a, polygons b
  WHERE ST_DWithin(a.geom, b.geom, 100.00)
    AND NOT ST_Contains(b.geom, a.geom);

Con NOT selecciona sólo los puntos que se colocan fuera de los polígonos.

Esta consulta va a ser muy rápido, cuando han espacial de los índices para las tablas.

Tiene una tabla con multipolígonos. Con la siguiente consulta puede agrupar los puntos resultantes para cada polígono de el tipo de multipolygon:

WITH single_obj AS (
SELECT
  id,
  name,
  (ST_Dump(geom)).geom
FROM polygons
)
SELECT
  b.id,
  b.name,
  count(a.*),
  ST_Collect(a.geom) AS geom 
FROM points a, single_obj b
  WHERE ST_DWithin(a.geom, b.geom, 100.00)
  AND NOT ST_Contains(b.geom, a.geom)
    GROUP BY b.id,b.name;

-1voto

evojacking Puntos 21
SELECT *
FROM towers t
JOIN areas c ON ST_DWithin(t.geom, c.geom, 100)
EXCEPT
SELECT *
FROM towers t
JOIN areas c ON ST_Within(t.geom, c.geom);

Esto le da todos los puntos que están dentro de 100m metros pero no exactamente dentro del polígono. Pero no estoy realmente seguro de si esto es lo que estás buscando.

ACTUALIZACIÓN:

SELECT *
FROM towers t
JOIN areas c ON ST_DWithin(t.geom, c.geom, 100)

Esto le da todos los puntos que están dentro de 100m de cualquier límite de un polígono. No puede ser duplicado geometrías cuando el punto se encuentra dentro de 100m de más de un polígono. Utilizar DISTINTOS para mantener sólo las geometrías únicas.

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