Skip to content

Commit

Permalink
add 59esimo esempio
Browse files Browse the repository at this point in the history
  • Loading branch information
pigreco committed Oct 31, 2021
1 parent 3ebc6d1 commit 99b6ac0
Show file tree
Hide file tree
Showing 5 changed files with 116 additions and 1 deletion.
65 changes: 65 additions & 0 deletions docs/esempi/geometria_vicina_filtro.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Geometria più vicina e filtro condizionato

Tre layer:
1. Layer di punti che rappresenta delle utenze (**layer1**).
2. Layer di punti derivante da un rilevamento topografico (**layer2**).
3. Layer di poligoni rappresentante degli edifici (**layer3**).

Popolare un nuovo campo del `layer1` con il valore dell'attributo presente nel `layer2` relativo alla geometria più vicina a condizione che i punti ricadono nello steso poligono, `layer3`.

Esempio:

soluzione di Andrea Giudiceandrea
```
attribute(
array_filter(
overlay_nearest( 'layer2', $currentfeature, limit:=-1 ),
attribute( @element, 'IDp' ) = "IDp" )[0], 'IDl2' )
```

Soluzione pigreco

```
relation_aggregate(
relation:='rel',
aggregate:='array_agg',
expression:="IDl2")
[
with_variable('fufu',
array_foreach(
relation_aggregate(
relation:='rel',
aggregate:='array_agg',
expression:=$geometry),
distance($geometry,@element)),
array_find(@fufu,array_min(@fufu)))
]
```

Soluzione pigreco in SQL

```sql
SELECT l1."IDAG" AS la1 , id, shortestline(l1."geom", l2."geom") as geom
FROM "layer1" l1 , "layer2" l2
WHERE l1."IDAG"=l2."IDAG"
group by l1."IDAG"
having min(st_distance(l1."geom", l2."geom"))
```

### prova tu

[dati e progetto QGIS 3.12](https://mega.nz/file/lUgwhIIA#gEwH2RpsdkNFGWM6qvqDFnXcMS6IIlfqhnkJnH3m164)

---

Funzioni e variabili utilizzate:

* [with_variable](../gr_funzioni/variabili/with_variable.md)
* [array_find](../gr_funzioni/array/array_unico.md#array_find)
* [array_filter](../gr_funzioni/array/array_unico.md#array_filter)
* [array_agg](../gr_funzioni/aggrega/aggrega_unico.md#array_agg)
* [line_locate_point](../gr_funzioni/geometria/geometria_unico.md#line_locate_point)
* [line_interpolate_point](../gr_funzioni/geometria/geometria_unico.md#line_interpolate_point)
* [intersection](../gr_funzioni/geometria/geometria_unico.md#intersection)
* [length](../gr_funzioni/geometria/geometria_unico.md#length)
* [\$geometry](../gr_funzioni/geometria/geometria_unico.md#geometry)
45 changes: 45 additions & 0 deletions docs/esempi/geometria_vicina_filtro_condizionato.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Geometria più vicina con filtro condizionato

Due layer di punti: `layer1` con attributo `id1` e `layer2` con `id2`.<br>
A partire dal `layer1`, ottenere per ogni punto del `layer1` tutti i punti del `layer2` dove `id2` ha un valore diverso da `id1` (collegarli con un segmento).

Esempio:

![](https://i.stack.imgur.com/NsXXB.png)

Come si evince dallo screenshot, i punti in rosso devono collegarsi con i punti blu che hanno `id` differente. Il punto 6 è rimasto isolato perché non cisono punti vicini e con id diverso da 6.

Espressione utilizzata:

```
collect_geometries(
make_line(
$geometry,
geometry(get_feature('layer2','id2',
attribute(
array_filter(
overlay_nearest('layer2',$currentfeature,limit:=-1),
attribute( @element, 'id2' ) != "id1" )[0], 'id2' ))))
)
```

idea presa da qui:

- [stackexchange](https://gis.stackexchange.com/questions/391120/qgis-expression-with-overlay-fuction-filter-condition-based-on-comparison-of-at)


### prova tu
- [GitHub](https://github.com/qgis/QGIS/issues/43146#issuecomment-836472827)
- [dati](https://drive.switch.ch/index.php/s/af5cHue6P3NA9xM)

---

Funzioni e variabili utilizzate:

* [array_filter](../gr_funzioni/array/array_unico.md#array_filter)
* [overlay_nearest](../gr_funzioni/geometria/geometria_unico.md#overlay_nearest)
* [attribute](../gr_funzioni/record_e_attributi/record_e_attributi_unico/#attribute)
* [make_line](../gr_funzioni/geometria/geometria_unico.md#make_line)
* [collect_geometries](../gr_funzioni/geometria/geometria_unico.md#collect_geometries)
* [$geometry](../gr_funzioni/geometria/geometria_unico.md#geometry)
* [geometry](../gr_funzioni/geometria/geometria_unico.md#geometry_1)
1 change: 1 addition & 0 deletions docs/esempi/lista_esempi.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ nro|Esempio|Descrizione|Autore | Livello | funzioni utilizzate
56|[Ricerca caratteri speciali](ricerca_caratteri_speciali.md)|Ricerca e selezione di record con campi che contengono caratteri speciali |Salvatore Fiandaca | 3 | regexp_substr, <>
57|[confrontare campi tabella](confrontare_campi_tabella.md)|Ricercare valori uguali in due campi diversi |Salvatore Fiandaca | 3 | array_to_string, array_majority, array_cat, string_to_array
58|[estrarre campo da un hstore](estrarre_campo_hstore.md)|Aggiungere un campo a partire da un altro campo in formato hstore (tipico di OSM) |Salvatore Fiandaca | 3 | hstore_to_map, map_get, to_int
59|[geometrie vicine ma con condizione](geometria_vicina_filtro_condizionato.md)|tracciare un segmento tra punti vicini che soddisfano la condizione `id1` <> `id2` |Salvatore Fiandaca | 4 | overlay_nearest, array_filter, attribute, make_line, collect_geometries, $geometry, geometry

## Partecipa

Expand Down
5 changes: 4 additions & 1 deletion docs/release/novita_324.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,7 @@ In costruzione!!!

- `get_feature e array` : <https://github.com/qgis/QGIS/pull/43352>
- `annotazioni` : <https://github.com/qgis/QGIS/pull/45114>
- `scale` : <https://github.com/qgis/QGIS/pull/45505>
- `scale` : <https://github.com/qgis/QGIS/pull/45505>
- `triangular/square/curved waves` : <https://github.com/qgis/QGIS/pull/45583>
- https://github.com/qgis/QGIS/pull/45744
- https://github.com/qgis/QGIS/pull/45734
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,7 @@ nav:
- Nome del campo con massimo valore: esempi/maxValoreCampoNome.md
- Ricercare caratteri speciali: esempi/ricerca_caratteri_speciali.md
- Confrontare campi tabella attributi: esempi/confrontare_campi_tabella.md
- Geometrie vicine con condizione: esempi/geometria_vicina_filtro_condizionato.md
- Provaci tu: mettiti_alla_prova.md

- Corsi di Formazione:
Expand Down

0 comments on commit 99b6ac0

Please sign in to comment.