14 votos

¿Detección de forma ramificada polígono?

Tengo una capa vectorial con millones de polígonos de decisiones de cobertura continua. Necesito clasificar de acuerdo a su forma. Yo ya estoy usando varios de forma que los índices de ecología del paisaje como la compacidad (4piA/P^2), la media de ancho (2A/P), de forma de número (P/sqrt(A)), también vi esta respuesta para el Cálculo de la redondez/compacidad de polígono?

Mi problema es que todas estas métricas son el uso de algunos proporción de área y perímetro solamente. Incluso el índice de Dimensión Fractal está utilizando sólo el área y el perímetro (2ln(0.25 P)/ln(A)). Pero, ¿cómo puedo distinguir dos polígonos con el mismo perímetro y área, pero absolutamente diferente forma? Como esta ramificada el polígono:

branched polygon vs curved strip

lo que traté de dibujar con la misma área y perímetro curvo tira B. Todos mis conocidos índices será el mismo para ellos. Pero para mí es muy importante diferenciar simples tiras (incluyendo curvas como la de la luna nueva) de complejas formas ramificadas.

He querido mostrar el polígono B como una curva de la tira y no una recta tira porque soy consciente de Relacionados con la circunferencia circunscrita índice que detecta directamente alargadas formas, pero mi polígonos pueden tener también el mismo circumcircles. Incluso si construyo Convex hull y calcular un cociente de áreas Apolygon/Aconvex, puede ser muy similar aquí.

Así que, ¿cómo puedo distinguir claramente ramificada polígono Un polígono de B en el vector de datos de forma automática? (La conversión de raster requeriría extremadamente pequeño tamaño de la celda, un enorme conjunto de datos y una falta de memoria, por lo que no es posible). Hay otra forma de índices que incluyen otros parámetros? Idealmente, el método de distinguir no sólo claramente ramificada polígonos, sino incluso C y D:

enter image description here

Mi única idea es construir el convex hull, a continuación, borrar el polígono de convex hull y cuente el número de la (gran) obras de hojas (borrar polígono por polígono y no la totalidad de la capa). Esto podría demostrar la frontera de la complejidad.

Doy la bienvenida a soluciones matemáticas/algoritmos, que me gustaría implementar más adelante en Python.

13voto

Cemre Puntos 153

Usted puede tener una mirada en el siguiente método : skeletonize su polígonos y lugar de trabajo en la línea de tipo de características relacionadas con su original polígono con una única fuente polígono ID. Supongo que hay algunas suposiciones que hacer (por ejemplo, cuando a considerar la posibilidad de una polilínea como una verdadera línea central : longitud mínima de una polilínea para ser elegible a la línea central de estado). Cuando el número de la línea central es mayor a 1 para una sola fuente de polígono, entonces es ramificado.

Ramificada polígono, cuando se limpian a una línea en el centro, tendrá múltiples líneas, mientras que una escalera de un polígono puede tener sólo una línea grande en el centro (la misma de la interpretación humana, de hecho).

Ejemplo :

  • al dibujar una Y letra, utilice al menos 2 trazos continuos (= 2 polilíneas),, por lo que es ramificada, porque el mínimo número de golpes es > 1.
  • cuando se dibuja una L carta, utilice al menos 1 trazo continuo. No ramificados.

Más ejemplos de esta lógica :

  • Cuando dibuja Una : 2 trazos = es ramificado
  • Cuando un daw B : 3 trazos = es ramificado
  • cuando se dibuja una C : 1 carrera = no ramificados
  • etc

No he probado nada, simplemente tratando de lógica, pero creo que podría funcionar.

Ver : Skeletonize vectores en QGIS/Python o http://postgis.net/docs/ST_StraightSkeleton.html

O

Example

Fuente: la Extracción de la línea central de un Complejo de Polígono en PostGIS/Python

EDIT : Para los casos C Y D, usted necesita ya que se han filtrado B formas (no ramificada).

  • Asegúrese de que haya un único ID de enlaces de la línea central y la fuente de polígono.
  • Transformar su polígonos en polilíneas
  • Densificar la línea central de la polilínea y el límite de la polilínea con puntos regulares (no demasiado, para evitar problemas de memoria más tarde, pero lo suficiente como para "atrapar" el irregular bits.
  • Crear una matriz de distancias entre los puntos de la línea central y los puntos de la frontera
  • Mantener en la matriz de líneas sólo aquellos donde ID_centerline = ID_borderline
  • Crear estadísticas para tener una desviación estándar valor
  • Establecer un valor de límite para indicar de alta SD valores que no se puede regular el contorno y crear el indicador se requiere, para cada IDENTIFICADOR único
  • Volver el indicador a la original polígono uniendo el campo en la base de la IDENTIFICACIÓN única.

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