10 votos

Cultivo de una geometría de PostGIS en un porcentaje

Estoy buscando una manera de agregar un buffer alrededor de una geometría de PostGIS, pero el tamaño del búfer debe depender del tamaño de la geometría. Es decir, quiero que cada geometría ser ampliado por, digamos, 5%.

La idea es que estoy buscando geometrías que se cruzan, pero podría ser un error de hasta un 5% asociado a cada uno que quiero tener en cuenta.

¿Alguien sabe la mejor manera de ir sobre esto?

La base de datos tiene casi 1 millón de filas, así que prefiero que sea bastante rápido.

8voto

cjstehno Puntos 131

Los comentarios sugieren que el 5% no necesita ser alcanzado con una alta precisión. (Si lo hace, va a tomar un largo tiempo para amortiguar un millón de polígonos!) Por lo tanto, podemos invocar la Pizza Principio: linealmente reescalado 2D característica de un factor en una escala de su área por un^2.

He aquí cómo el razonamiento:

  • Cuando la forma no es muy complicado, sobre todo si es convexo, entonces el almacenamiento en búfer se produce un resultado comparable a la de reescalar la forma en torno a un punto central. (Es importante comprender, sin embargo, que el almacenamiento en búfer es que no siempre equivalente a un reescalado para cualquier otras formas además de los discos. Para algunas formas cóncavas, un "buffer" calculada a través de un reescalado en realidad podría no incluir partes de la forma original de la misma. Por lo tanto, en última instancia, nos va a calcular una auténtica buffer de la forma, pero sólo utiliza esta aproximar la equivalencia como una heurística para la estimación de cuánto de búfer.)

  • Si el búfer de la zona es de 5% mayor, la cantidad de reescalado por lo tanto debe ser sqrt(1 + 5/100), que está cerca de 1.025: es decir, debemos desea ampliar la forma del 2,5% en todas las direcciones.

  • Equivalentemente, si pensamos en la forma de como tener un "diámetro" (equivalente a una distancia típica de ancho), su radio de aumento de 2.5%. Eso equivale a un 2,5%/2 = 1.25% del diámetro.

  • Se puede estimar un diámetro típico de la forma del cuadro delimitador. El uso de, digamos, una media aritmética o la media geométrica de la caja del longitudes de los lados.

Esto sugiere el siguiente flujo de trabajo:

  1. Obtener la forma del cuadro delimitador.

  2. Deja e ser el promedio de las longitudes de los lados de la caja.

  3. El búfer de la forma del 1,25% de los e; es decir, por (5/100)/4 * e.

Dado que los pasos 1 y 2 requieren muy poco de computación, este se presenta como uno de los más expeditos posibles soluciones. Como una verificación de la exactitud, puede (por supuesto) calcular las áreas de la búfer de formas y compararlos con el original áreas para ver cuán cerca se vienen para el 5% de aumento. A veces el búfer áreas serán incluso más de un 5% mayor, pero debe ser raros que son menos, y es imposible para ellos para ser apreciablemente menor.

Ejemplos

Como un cheque y la ilustración, vamos a considerar algunas formas simples.

  1. Un disco de radio r tiene un cuadro delimitador con lados de longitud 2 r. Nuestra fórmula calcula e = (5/100)/4 * 2 * r = r / 40. El búfer de forma que, obviamente, es un concéntricos disco de radio r + r / 40 = 1.025 r. La zona antigua fue pi * r ^2, mientras que la nueva área es pi * (1.025 r)^2 = pi * 1.0506 * r ^2, que es de 5.06% mayor.

  2. Un rectángulo con lados paralelos a los ejes de coordenadas de longitud r y s da e = (r + s)/2. El área adicional de almacenamiento en búfer el rectángulo viene de cuatro rectángulos de ancho (5/100)/4 e = e / 80 = (r + s)/160 bordeando los lados, además de cuatro de círculo de radio e / 80 en las esquinas. Descuidar el círculo, que será pequeño en comparación con otras áreas, el total de La nueva área es igual

    2(r + s) * (r + s)/160 = (r^2 + s^2 + 2 r * s) / 80.

    Cuando r y s no son demasiado diferentes, podemos calcular r^2 + s^2 es de aproximadamente 2 r * s. Esta aproximación simplifica el total de la nueva área para 4 r * s / 80 = 5% de la superficie original de r * s, como se pretendía.

4voto

dlanod Puntos 8661

Desea utilizar una combinación de ST_Scale ( http://www.postgis.org/documentation/manual-2.0/ST_Scale.html) y ST_Translate ( http://www.postgis.org/documentation/manual-2.0/ST_Translate.html ) creo. Tenemos un ejemplo de esto en PostGIS en la Acción y similares en el Capítulo 8. Si no tienen el libro, puede descargar el código para que el capítulo aquí:

http://www.postgis.us/chapter_08

Fragmento del libro Vistazo al ejemplo 8.26:

    -- Listing 8.26 Combining Scale and Translation to maintain centroid
    SELECT xfactor, yfactor, 
       ST_Translate(ST_Scale(hex.the_geom, xfactor, yfactor), 
       ST_X(ST_Centroid(the_geom))*(1 - xfactor), 
       ST_Y(ST_Centroid(the_geom))*(1 - yfactor) ) As scaled_geometry
    FROM 
 ( SELECT ST_GeomFromText('POLYGON((0 0,64 64,64 128,0 192,-64 128,-64 64,0 0))') As the_geom)  As hex
    CROSS JOIN (SELECT x*0.5 As xfactor 
        FROM generate_series(1,4) As x) As xf
    CROSS JOIN (SELECT y*0.5 As yfactor
        FROM generate_series(1,4) As y) As yf;

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