Switch to using the nearest-connector method from the center point

The next in the line of sequential updates. This switches from connecting services at the center of each service icon to connecting them from the nearest "connector", which is a point on one of the four cardinal directions on each service icon.
Perhaps define a new type to represent a line:

  type line struct {
      p0, p1 image.Point
  }

Then you can make this function return a line, and
perhaps even add a function to add a line that you
could use elsewhere:

   func canvasLine(ln line, attrs ...string) {
       canvas.Line(ln.p0.X, ln.p0.Y, ln.p1.X, ln.p1.Y, attrs...)
   }

You could also rename pointDistance to line.length
and making strokeDashArray take a line.

I'd also suggest naming this method "shortestRelationLine"
as "get" methods aren't generally idiomatic in Go.