Saltar al contenido

Calcular la distancia más larga dentro del polígono en QGIS

Esta crónica fue aprobado por expertos para garantizar la veracidad de nuestra esta reseña.

Solución:

Puede usar PyQGIS para medir las distancias entre todos los vértices de cada polígono y encontrar el máximo:

import itertools

layer = iface.activeLayer() #Click layer in tree

for feat in layer.getFeatures():
    verts = [v for v in feat.geometry().vertices()] #List all vertices
    maxdistance = max([p1.distance(p2) for p1,p2 in itertools.combinations(verts, 2)]) #Find max distance for all combinations of vertices (https://stackoverflow.com/questions/464864/how-to-get-all-possible-combinations-of-a-list-s-elements)
    print('Polygon: 0, max distance: 1'.format(feat.id(), round(maxdistance,0))) #Print results

Ejemplo 1

Para guardar distancias máximas en un campo:

import itertools

layer = iface.activeLayer() #Click layer in tree
field_to_save_maxdistance_in = 'maxdist' #Change maxdist to the name of your field

fields = layer.fields()
fx = fields.indexFromName(field_to_save_maxdistance_in)

with edit(layer):
    for feat in layer.getFeatures():
        verts = [v for v in feat.geometry().convexHull().vertices()] #List all vertices
        maxdistance = max([p1.distance(p2) for p1,p2 in itertools.combinations(verts, 2)]) #Find max distance for all combinations of vertices
        layer.changeAttributeValue(feat.id(), fx, maxdistance)

ejemplo2

También puede crear una capa de línea:

import itertools

layer = iface.activeLayer() #Click layer in tree

#Create line layer
vl = QgsVectorLayer("LineString?crs=&index=yes".format(layer.crs().authid()), "myLayer", "memory")
provider = vl.dataProvider()

#For each polygon find the two points most far apart
for feat in layer.getFeatures():
    all_points = []
    verts = [v for v in feat.geometry().vertices()] #List all vertices
    for p1,p2 in itertools.combinations(verts, 2):
        all_points.append([p1,p2])

    #Create a line feature
    pointpair_most_far_apart = max(all_points, key=lambda x: x[0].distance(x[1]))
    gLine = QgsGeometry.fromPolyline(pointpair_most_far_apart)
    f = QgsFeature()
    f.setGeometry(gLine)
    provider.addFeature(f)

QgsProject.instance().addMapLayer(vl)

ingrese la descripción de la imagen aquí

Tenga en cuenta que alguien señaló correctamente muy pronto en los comentarios que había leído mal la pregunta. Mi respuesta da el diámetro del círculo mínimo, pero esto no siempre corresponde a la distancia más larga entre los vértices de un polígono. Tan pronto como más de 2 vértices toquen el círculo o si los vértices que definen el círculo son adyacentes, los valores pueden diferir. Lo dejé allí porque proporciona una respuesta para un problema similar, pero incluso yo estoy de acuerdo en que no debería ser la respuesta aceptada.

Es posible hacerlo con expresiones simples en la calculadora de campo (al menos en QGIS 3.12.x). Tomemos, por ejemplo, estos dos polígonos. La simbología muestra cuatro cosas (usando el generador de geometría, con fines explicativos):

  • Contorno rojo del true polígono
  • Círculo naranja semitransparente resultante de la minimal_circle() función
  • Punto azul resultante de la centroid() función del círculo mínimo
  • Punto blanco resultante de la point_n() función del primer vértice del círculo mínimo

ingrese la descripción de la imagen aquí

Entonces, para obtener el diámetro del círculo mínimo que contiene el polígono, vaya a la calculadora de campo y use esta expresión en un nuevo campo decimal:

distance(centroid(minimal_circle($geometry)),point_n(minimal_circle($geometry),1)) * 2

Esto calculará la distancia entre el centroide y el primer vértice a lo largo del círculo (el radio), luego lo multiplicará por dos.

Supongamos que hay una capa de polígono "Layer_A" (azul) con su correspondiente attribute tabla en consecuencia, vea la imagen a continuación.

aporte

Paso 1. Proceder con 'Polygons to lines'

paso 1

Paso 2. Proceder con 'Points along geometry'. Tenga en cuenta que la distancia afecta la calidad del resultado final y la eficiencia de la capa virtual en el paso 3.

paso 2

Paso 3. Por medio de un "Virtual Layer" mediante Layer > Add Layer > Add/Edit Virtual Layer... aplicar esta consulta

SELECT p1.id,
       setsrid(make_line(p1.geometry, p2.geometry), 'put your srid here'),
       max(st_length(make_line(p1.geometry, p2.geometry))) AS length
FROM "Points" AS p1
JOIN "Points" AS p2 ON p1.id = p2.id
WHERE NOT st_equals(p1.geometry, p2.geometry)
GROUP BY p1.id

resultado

PD si está interesado en las distancias más largas entre vértices, extraiga vértices del polígono a través de 'Extract vertices' y vaya directamente al paso 3.

step_1_2_alternative

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *