You know the length of the lines, and by drawing the lines in a Jupyter Notebook, you know that lines 1 and lines 3 intersect. In PostGIS, you can use the ST_Intersects() function, passing either geometries or geographies. The database will return either true or false.
The following code will execute the query on lines 1 and lines 3 and return True:
cu.execute("SELECT ST_Intersects(l.location::geography,ll.location::geometry)
FROM lines l, lines ll WHERE l.id=1 AND ll.id=3")
cu.fetchall()
The previous code will return True, because lines 1 and lines 3 intersect. But where do they intersect? Using ST_Intersection() will return to the point where the two lines meet:
cu.execute("SELECT ST_AsText(ST_Intersection(l.location::geography,
ll.location::geometry)) FROM lines l, lines ll
WHERE l.id=1 AND ll.id=3")
cu.fetchall()
By switching from ST_Intersects to ST_Intersection, you get a point of contact between the two lines. The point is as follows:
[('POINT(-106.628684465508 35.1053370957485)',)]