8 votos

¿Cómo contar polígonos en características multiparte?

Estoy tratando de contar el número de polígonos en una característica multiparte. Mi objetivo es disponer de un atributo "recuento" para cuantificar la fragmentación de las parcelas multiparte.

He buscado en la calculadora de campos y en plugins adecuados, pero no veo nada que pueda ayudar. Hay muchas formas de contar puntos, líneas y vértices, pero no polígonos.

14voto

a.anonymous Puntos 6

4 años después parece que QGIS ha integrado esta función en la calculadora de campos. La sintaxis de la expresión es:

num_geometries($geometry)

Field Calculator: num_geometries

4voto

Sé que estás buscando una respuesta que utilice QGIS pero si estás dispuesto a utilizar el SIG de código abierto Herramientas de análisis geoespacial de caja blanca entonces aquí hay una respuesta completa que tomará cualquier shapefile, y creará un nuevo campo de atributo en su tabla que contiene el número de partes de características. Simplemente necesita abrir la ventana Scripter en Whitebox, cambiar el lenguaje de script a Groovy, y pegar el siguiente código:

import whitebox.geospatialfiles.ShapeFile
import whitebox.geospatialfiles.shapefile.*
import whitebox.geospatialfiles.shapefile.attributes.*

def inputFileName = "/MY_DIRECTORY/MY_FILE_NAME.shp"
def shape = new ShapeFile(inputFileName)
AttributeTable table = shape.getAttributeTable()

DBFField field = new DBFField()
field.setName("NUM_PARTS")
field.setDataType(DBFField.DBFDataType.NUMERIC)
field.setFieldLength(5)
field.setDecimalCount(0)
table.addField(field)
for (int i = 0; i < shape.getNumberOfRecords(); i++) {
    ShapeFileRecord record = shape.getRecord(i)
    int numParts = record.getGeometry().getParts().length
    recData = table.getRecord(i)
    recData[recData.length - 1] = new Double(numParts)
    table.updateRecord(i, recData)
}

println("I'm done")

Tendrás que actualizar el valor de la variable inputFileName cerca de la parte superior para que apunte a tu archivo. También podrías usar Python para lograr lo mismo, pero yo escribí esto en Groovy. Si lo desea, también puedo tener la secuencia de comandos excluir partes del agujero si está trabajando con polígonos.

Este es un ejemplo de un mapa mundial de países que se ha renderizado para mostrar el número de partes que incluye la característica poligonal de cada país:

enter image description here

4voto

Excrubulent Puntos 124

Si QGIS es la única herramienta disponible El siguiente código python en la Consola Python podría servir:

layer = iface.activeLayer()
for x in layer.getFeatures():
    geometry = x.geometry().asMultiPolygon()
    print len(geometry)

Por supuesto, esto no es una solución completa, sólo imprimirá un montón de números sin indicar a qué característica pertenecen, pero es un comienzo. También podría imprimir el campo "NOMBRE" u otro atributo clave preferido. O usted podría modificar para escribir el len(geometry) entero a algún otro campo en la capa.

2voto

Joe Puntos 16

Otra solución sin QGIS es utilizar OpenJUMP. Dispone de una herramienta especial en Herramientas - Estadísticas - Estadísticas de características. La herramienta crea una nueva capa con estos atributos:

  • nPts (número de vértices)
  • nHoles (número de agujeros)
  • nComponentes (número de componentes)
  • zona
  • longitud
  • type (tipo ot geometría)

Si su objetivo es contar el número de polígonos en multipolígonos esta herramienta debería hacer bien el trabajo. Sin embargo, si quieres contar cuántos polígonos hay en GeometryCollections que contienen también otro tipo de geometrías debes explotar las colecciones primero.

1voto

Laykes Puntos 221

Puede intentar disociar los polígonos múltiples en polígonos únicos y, a continuación, abrir la tabla de atributos y observar el número de líneas (que representa el número de polígonos).

Para separar multipolígonos : Vector->Geometry Tools->Multipart to single parts

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