5 votos

SQL / PostGIS: expandir polígonos contenidos dentro de otro polígono hasta que un vértice toque el cuadro delimitador

Tenemos un problema que no estamos muy seguros de cómo se enfoque, tenemos un número de polígonos que figuran dentro de una mayor delimitación de polígonos, necesitamos ampliar estos polígonos tanto como sea posible, pero sólo hasta que de un solo filo toca el polígono que contiene.

Espero un diagrama en el que se ayuda con mi explicación:

enter image description here

Los polígonos en red puede ser asumido como ya creado, el punteado de los polígonos en verde indican el final polígono que queremos crear (ampliada sólo lo suficiente hasta que un lado toca las paredes de la delimitación del polígono).

Esta será de ejecución de datos grandes (cientos de millones de polígonos con cientos de millones de interior de los polígonos), ya que la eficiencia es uno de los problemas que estamos enfrentando. En el código, lo que es razonablemente trivial, sin embargo no es factible para el conjunto de datos que tenemos.

Tenemos una gran instalación de clúster que puede procesar Geoespacial SQL eficiente que tenemos la intención de utilizar para esta tarea, pero hay otras que arbitrariamente pasar un valor a una función expand no estamos muy seguro de cómo hacer esto de forma inteligente a cantidades masivas de datos.

Creo que tenemos que ampliar el polígono usando ST_Expand y parar cuando ST_Intersects sobre el principal polígono es cierto - sólo tengo ni idea de cómo hacer que en una sola llamada SQL.

5voto

Patrick Puntos 20392
  1. Encontrar que contiene polígono
  2. Encontrar la distancia más cercana entre cada uno de los contenidos polígono y es que contiene polígono
  3. El búfer de la figura de los polígonos que por la distancia a la que se encuentra en 2.

Se supone, en la 1, que no es el único que contiene polígono. Si no, se vuelve un poco más complicado, y usted tendrá que hacer un grupo por/distinto o una partición con el fin de obtener el más cercano de varios posibles que contiene los polígonos..

Hay una inmediata gotcha a tener en cuenta aquí, que es que si uso ST_Distance(geom1, geom2) y geom1 contiene geom2, obtendrá 0. Así, con el fin de determinar la distancia por que para hacer crecer su contenido polígonos, usted debe utilizar ST_Exteriorring, que devolverá una cadena de línea y dan resultados razonables para ST_Distance.

SELECT ST_Distance(ST_Exteriorring(geom1), geom2).

Poniendo todo junto, y el etiquetado (aliasing) de tablas a partir de su diagrama como polygons_outer (a) y polygons_inner (b):

WITH 
    to_buffer(distance, b.id) AS (
SELECT
   ST_Distance(ST_Exteriorring(a.geom), b.geom),
   b.id
 FROM 
    polygons_outer a, polygons_inner b 
 WHERE ST_Contains(a.geom, b.geom)
 UPDATE polygons_inner b
   SET geom = ST_Buffer(geom, distance)
  FROM to_buffer tb
  WHERE b.id = tb.id;

Esto también supone que desea buffer (crecen por igual en todas las direcciones, de acuerdo a la más cercana a pie) o si usted quiere crecer todos los lados hasta llegar a la que contiene polígono. Esta última situación es potencialmente mucho más complicado y sería involucrar dumping su polígonos a linestrings, encontrar la distancia más cercana, tanto en las direcciones x e y, asumiendo que están en vertical/horizontal alineado -- y el uso de ST_Expand.

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