4 votos

¿Cómo encoger polígono de dos lados?

Tengo un polígono que sé que es un rectángulo, aunque puede ser en cualquier tipo de orientación:

Example polygon

Quiero reducir este polígono por un tercio de la anchura de los dos lados, por lo que acabo de llegar de la franja en el medio - para terminar con un resultado como el rojo en esta imagen:

enter image description here

No puedo pensar en cómo ir sobre hacer esto fácilmente. Si trato y negativamente de búfer en el polígono, a continuación, será reducido en todos los lados. Tengo muchas decenas de miles de estos polígonos hacer - así que, obviamente, no puede hacer manualmente.

Alguna idea? Tengo acceso a ArcGIS, QGIS y estoy bastante experiencia en programación Python - si eso ayuda.

5voto

Jay Bazuzi Puntos 194

Aquí un poco de código R que hace el trabajo, la restricción es que estamos en coordenadas cartesianas. La matriz de entrada coords es un 5x2 matriz de x,y columnas, con el último punto de ser coincidente con el primer punto. Esto es lo que obtienes de los objetos espaciales en R cuando se lee un archivo shapefile, por ejemplo.

thinrect <- function(coords, factor=1/3){
    dx = diff(coords[,1])
    dy = diff(coords[,2])
    ## test if slope(1-2) is > slope(2-3)
    w = diff(atan2(abs(dx[1:2]), abs(dy[1:2])) %% pi) > 0
    ## if it is, then wrap it round so the first side is the steepest
    if(w){
        coords = rbind(coords[-1,], coords[1,])
        dx = c(dx[-1],dx[1])
        dy = c(dy[-1],dy[1])
    }
    ## now its just four points offset from corners 1 and 3
    dxy = c(dx[1],dy[1])
    p1 = coords[1,] + factor*dxy
    p2 = coords[1,] + (0.5+factor/2)*dxy
    p3 = coords[3,] - (factor)*dxy
    p4 = coords[3,] - (0.5+factor/2)*dxy

    rbind(p1, p2, p3, p4, p1)
}

Aquí está la salida de un rectángulo bajo diferentes rotaciones. Nota cómo el rectángulo seleccionado cambios para mantenerse paralelo a la línea de máxima lado.

enter image description here

Uso Simple, la creación de un 5x2 matriz de una unidad cuadrada:

> coords=matrix(c(0,0,0,1,1,1,1,0,0,0),ncol=2,byrow=TRUE)
> coords
     [,1] [,2]
[1,]    0    0
[2,]    0    1
[3,]    1    1
[4,]    1    0
[5,]    0    0
> thinrect(coords)
        [,1] [,2]
p1 0.3333333    1
p2 0.6666667    1
p3 0.6666667    0
p4 0.3333333    0
p1 0.3333333    1
> plot(coords)
> polygon(thinrect(coords))

Bucle en un shapefile es bastante trivial.

El algoritmo podría ser portado a Python bastante simplemente demasiado.

3voto

John Kramlich Puntos 286

Esto puede ser solucionado con un modelo, pero hay 4 aspectos:

  • Usted necesita una Antelación (ArcInfo) licencia
  • Este modelo asume que el rectángulo es un rectángulo, lo de los 2 lados verticales son más largos
  • El rectángulo está construido a partir de 4 vértices solo
  • Si desea automatizar esto, entonces todos los rectángulos deben tener las mismas dimensiones

Model

Así que después de la ejecución de este modelo que está a la izquierda con el resto de centro rectángulo como se muestra en esta imagen:

Finished rectangle

Usted necesitaría para terminar con un iterador y ajustar los diversos parámetros como usted requiere.

1voto

john Puntos 11

He creado una ArcGIS Crear Cuadrícula Personalizada herramienta que podría ser útil para esto. Sin embargo, podría tener problemas si alguno de los rectángulos están orientados como una forma de diamante.

Establece la división vertical a 3 y salir de la horizontal a 0.

Después de que se corrió la herramienta que usted necesita para utilizar la División de Polígonos herramienta en la Edición Avanzada de la barra de herramientas.

Si usted lo usa, hágamelo saber si usted tiene cualquier problema.

Puede descargar el cuadro de herramientas en la parte superior de la página aquí:

http://ianbroad.com/creating-quarter-quarter-section-grid-python/

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