Segmento minimo tra facciata e strada↵
New SpatialAnalysis Challenge: Riesci a definire un flusso di lavoro per collegare il bordo di ogni edificio rivolto verso la strada al punto più vicino sul segmento di strada? L'idea alla base della sfida è trovare il bordo del poligono il cui punto centrale è più vicino a una strada e quindi collegarlo con il punto più vicino sulla strada. tweet1,tweet2
Prima soluzione↵
with_variable('andy',
array_foreach( array_foreach(
generate_series(1,num_geometries(segments_to_lines($geometry))),
centroid(geometry_n(segments_to_lines($geometry),@element))),
distance(@element, overlay_nearest('roads',$geometry)[0])),
/*shortest line*/
shortest_line(
array_foreach(
generate_series(1, num_geometries( segments_to_lines($geometry))),
centroid(geometry_n(segments_to_lines($geometry),@element)))
[array_find( @andy,array_min(@andy))],
overlay_nearest('roads',$geometry)[0]))
L'espressione può essere usata come tema tramite il generatore di geometrie:
oppure direttamente nell'algoritmo Geometria tramite espressione per ottenere un nuovo layer:
altra soluzione con stesso risultato:
with_variable('toto',
collect_geometries(
array_foreach(
generate_series(1,num_geometries(segments_to_lines($geometry))),
centroid(geometry_n(segments_to_lines($geometry),@element)))),
/*shortest line*/
shortest_line(@toto,overlay_nearest('roads',$geometry)[0]))
ma entrambe le soluzioni hanno un problema, la funzione overlay_nearest
restituisce la strada più vicina all'edificio e non al centroide della facciata, ecco un esempio estratto dal dataset:
la freccia rossa indica il segmanto più corto tracciato erroneamente in quanto la strada più vicina risulterebbe quella indicata con (1).
Seconda soluzione↵
La soluzione corretta deve per forza passare per due step:
- estrarre i centroidi delle facciate;
- tracciare il segmento più corto.
I centroidi delle facciate degli edifici li estraggo con:
collect_geometries (
array_foreach (
generate_series (1, num_geometries (segments_to_lines ($ geometry)))),
centroid (geometry_n (segments_to_lines ($ geometry), @ element))))
il segmento più corto lo traccio con:
ecco il risultato:
Funzioni e variabili utilizzate:
- @with_variable
- generate_series
- array_foreach
- array_find
- num_geometries
- collect_geometries
- geometry_n
- segments_to_lines
- overlay_nearest
- distance
- centroid
- shortest_line
- $geometry