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