understanding glm::perspective vs glm::ortho
I don't understand why, if I make the first argument to glm::lookAt be glm::vec3(0.0f, 0.0f, 2.0f), I see nothing.


It's because of the up vector. If you think about the look-at operation, you specify where the camera is and what point it's looking towards. These two things alone leave one degree of freedom: the rotation around that axis. Which way is up on your screen? The third argument is for specifying that: it's a direction in world space which will correspond to up on the screen. If your first argument is that and the rest of the code is as your example, you're calling lookAt((0,0,2), (0,0,0), (0,0,1)). Your up vector points along the $z$-axis, which is the same direction the camera is looking (well, the opposite direction. This can't define which way is up on the screen. 

You probably want to pass a vector (0,1,0) as the third argument, which will make $y$ point up on your screen.

If you're making a plan view of a 3D scene, then perspective projection is probably the right answer, but if all your content is going to be in the $z=0$ plane, then you probably want to use an orthographic rather than a perspective projection. Look at What&#39;s the difference between orthographic and perspective projection? to learn more about that.

Last of all, remember that if you're projecting an $800m \times 800m$ scene onto $800 \times 800$ pixels, then a $1m$ radius circle will only be one pixel large. You probably need to scale up the size of your circle.