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
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)
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)
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
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.
Paso 1. Proceder con 'Polygons to lines'
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 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
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.