Principios: qué puede esperar de esta solución
Esta solución es un enfoque heurístico. Devuelve las parcelas en las que seguro se puede colocar un rectángulo de 500 m2 así como otras parcelas "candidatas" con una alta probabilidad de que sea posible, pero que deben comprobarse manualmente. Véase la captura de pantalla:
Resultado: edificio inicial (gris) con búfer (wihte) y parcela restante (rojo). Los dos edificios posibles de 500 m² (sombreados en gris con contorno negro). El inferior está completamente dentro de la parcela, por lo que se reconoce automáticamente como solución; el superior no está completamente, pero casi dentro de la parcela (sólo un 3% de su superficie fuera de la parcela), por lo que es un candidato a tener en cuenta y, de hecho, desplazando un poco el polígono, quedaría completamente dentro de la parcela:
La solución paso a paso
-
Obtener la parcela que queda al recortar los edificios amortiguados (utilizando Difference
herramienta).
-
Corta estrechos "pasillos" de conexión entre las formas principales mediante un amortiguamiento con un valor negativo de, digamos, -5 m, y aplica a continuación el valor inverso, positivo, para el amortiguamiento: 5 m.
Izquierda: edificio 8gris), búfer (amarillo), parcela restante (rojo); centro: parcela restante (rojo), búfer negativo (azul); derecha: parcela restante (delineada en rojo), búfer negativo (delineado en azul), las dos parcelas resultantes que utilizaremos a partir de ahora (naranja sólido):
-
Convertir de Multipart a partes individuales y añadir un id único (aquí: fid
) al resultado.
-
Utilice Menu Processing / Toolbox / Minimum bounding geometry
y crear el Minimum oriented rectangle
basado en el fid
para obtener una caja separada para cada característica.
-
Escala los polígonos del paso 4 con un factor de escala para que tengan el tamaño que desees (500 metros cuadrados, en tu caso). El factor de escala es el square root of (500 divided by the area of the polygon)
(pseudocódigo).
Las parcelas de arriba (naranja), el rectángulo orientado mínimo del paso 4 (azul) y estos rectángulos reducidos a 500 m2 (rojo) - aquí utilizando el generador de Geometría:
La expresión 1 (ver abajo) devuelve el Minimum oriented rectangle
con una superficie de 500 m2 y el mismo centroide.
-
Ahora calcule la intersección del polígono escalado (paso 5) con el polígono de la parcela del paso 3. Si el polígono a escala de 500 m2 está completamente dentro de la parcela, la intersección es la misma que la salida del paso 5. Si está no completamente dentro de ella, algunas partes están cortadas. Calcule ahora el área de esta intersección con la expresión 2 de abajo (una extensión de la expresión 1) creando un nuevo campo de atributo con la calculadora Field.
-
Ahora seleccione todas las características en las que el campo calculado en el paso 6 esté cerca del valor de 500 m2. Lo ideal sería buscar sólo los valores que tengan exactamente 500 m². Pero deberíamos restar un cierto umbral de tolerancia para tener en cuenta el hecho de que, a veces, desplazar el polígono escalado dentro de la parcela podría dar lugar a una intersección mayor. Por tanto, en función de sus necesidades y del tipo de datos que tenga, seleccione todos los valores que se encuentren en un determinado intervalo (por ejemplo, de 450 a 500).
Expresiones
Expresión 1
with_variable(
'scale',
sqrt (500/$area),
make_rectangle_3points(
project (
centroid ($geometry),
@scale*length (make_line (point_n ($geometry, 1), centroid ($geometry))),
azimuth (point_n ($geometry, 1), centroid ($geometry))
),
project (
centroid ($geometry),
@scale*length (make_line (point_n ($geometry, 2), centroid ($geometry))),
azimuth (point_n ($geometry, 2), centroid ($geometry))
),
project (
centroid ($geometry),
@scale*length (make_line (point_n ($geometry, 2), centroid ($geometry))),
azimuth (point_n ($geometry, 3), centroid ($geometry))
)
)
)
Expresión 2
area (
intersection (
with_variable(
'scale',
sqrt (5000/area($geometry)),
make_rectangle_3points(
project (
centroid ($geometry),
@scale*length (make_line (point_n ($geometry, 1), centroid ($geometry))),
azimuth (point_n ($geometry, 1), centroid ($geometry))
),
project (
centroid ($geometry),
@scale*length (make_line (point_n ($geometry, 2), centroid ($geometry))),
azimuth (point_n ($geometry, 2), centroid ($geometry))
),
project (
centroid ($geometry),
@scale*length (make_line (point_n ($geometry, 2), centroid ($geometry))),
azimuth (point_n ($geometry, 3), centroid ($geometry))
)
)
),
overlay_nearest ('parcel',$geometry)[0]
)
)