Vai al contenuto

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))
    )
)

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

dati e progetto QGIS 3.24


Funzioni e variabili utilizzate: