Spostare i punti dentro i poligoni in base agli attributi↵
Un layer poligonale con tre particelle, attributo Parcel_No
(1,2 e 3) e un layer puntuale con mille punti e attributo Parcel_No
(1,2 e 3), quindi i punti hanno solo tre valori. Spostare i punti nel corrispondente poligono, utilizzando, appunto, l'attributo comune.
espressione utilizzata:
closest_point(
geometry(get_feature('polygon','Parcel_No',
attribute($currentfeature,'Parcel_No' ))),
$geometry)
l'espressione crea un altro punto più vicino al poligono, quindi li vedremo quasi tutti lungo il perimetro; se invece volessimo i punti dentro i relativi poligoni, per esempio lungo un cerchio, ecco altra espressione:
with_variable('geomPolygon',
geometry(
get_feature('polygon',
'Parcel_No',
attribute( $currentfeature, 'Parcel_No' ))),
closest_point(buffer(centroid(
@geomPolygon), bounds_height((@geomPolygon))/5),
$geometry))
l'espressione di sotto distribuisce casualmente i punti dentro ogni poligono, a partire dal centroide:
--> variabile
with_variable('geomPolygon',
geometry(
get_feature('polygon',
'Parcel_No',
attribute( $currentfeature, 'Parcel_No' ))),
--> variabile
project(
point:=
closest_point(
geometry1:=centroid(@geomPolygon), -- polygon
geometry2:=$geometry), -- point
distance:=
distance(
closest_point(
boundary(@geomPolygon),centroid(@geomPolygon)),
centroid(@geomPolygon))*randf(0,1),
azimuth:=
radians (rand(0,360))
)
)
- Maggiori dettagli nel blog post su Pigrecoinfinito
- idea presa da Stackexchange
Animazione:
espressione utilizzata:
per tracciare le linee:
with_variable('geomPolygon', geometry(get_feature('polygon','Parcel_No',attribute( $currentfeature, 'Parcel_No' ))),
if(contains(@geomPolygon,@canvas_cursor_point)=1,
make_line(
$geometry,
closest_point(buffer(centroid(
@geomPolygon), bounds_height((@geomPolygon))/5),
$geometry))
,null))
per tracciare i punti:
with_variable('geomPolygon',
geometry(get_feature('polygon','Parcel_No',attribute($currentfeature, 'Parcel_No'))),
-- condizione
if(contains(@geomPolygon,@canvas_cursor_point)=1,
closest_point(buffer(centroid(
@geomPolygon), bounds_height((@geomPolygon))/5),
$geometry), null))
prova tu↵
Funzioni e variabili utilizzate: