4

I am doing a research project for which I need to find an effective way for drawing lines between a number of points along a square. I need there to be a line between every point on the square in order to simulate the ability to cross the square whichever way a pedestrian pleases.

enter image description here

Ideally the process should generate a new line layer.

The end result needs to look something like this:

enter image description here

I have taken a look at previous posts on the subject, however the plugins that they recommend - PointsToPaths, Points2One - don't seem to be available in QGIS anymore, and the Points2One one doesn't work.

Taras
  • 32,823
  • 4
  • 66
  • 137

2 Answers2

3

One way to do this would be using a "Virtual Layer".

  1. Create "X" and "Y" fields in your point layer containing the x and y coordinates
  2. Create a constant field with the same value
  3. Save a copy of the point layer
  4. Add a virtual layer joining by the constant value of both layers (original and copy) using the following expression:
SELECT *
FROM points
JOIN points_copy
    ON points.constant = points_copy.constant

This will create a Virtual Layer that will contain every combination of X,Y origin and destination coordinates. In my example I used 29 points thus resulting in a virtual layer of 841 points (29²).

All points to all

Just for symbolization purposes the point layer can be symbolized into lines using a geometry generator expression:

make_line(make_point("cx", "cy"), make_point("cx:1", "cy:1"))

To make a permanent layer I recommend using the tool XY to line from the plugin Shape Tools.

Taras
  • 32,823
  • 4
  • 66
  • 137
Albert
  • 2,607
  • 12
  • 31
2

In QGIS you can make use of the "Virtual Layer".

Go to Layer/ Add layer/ add-edit virtual layer and enter the following query. Feel free to add as many field as you want. The trick is to do a cross-join on the same table, generating every combination between the two layers.

select a.id, b.id, makeline(a.geometry, b.geometry) as geometry
from myLayer a, myLayer b
where a.id <> b.id
Taras
  • 32,823
  • 4
  • 66
  • 137
JGH
  • 41,794
  • 3
  • 43
  • 89