Vai al contenuto

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:

  1. estrarre i centroidi delle facciate;
  2. 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:

shortest_line( $geometry,
overlay_nearest('roads',$geometry)[0])

ecco il risultato:


Funzioni e variabili utilizzate:

dati↵

https://t.co/u0xGe5YtCT?amp=1