The formal name for your task is the Direct (aka Forward, aka First) Problem of Geodesy. The complication is that Earth is not spherical but spheroidal, making the task of locating a generic point at a bearing and distance from another point a partial differential equation (
dLon changes with respect to
There are three basic approaches:
- Ignore the spheroidal Earth, and solve the problem as a sphere (using the law of haversines)
- Transform the frame of the problem to an appropriate projection, solve in Cartesian space, and de-project the result back to degrees (the solution provided by @Dan)
- Solve the Direct problem using Vincenty's formulae
There is a fourth method: Use a code library to solve using any of the above methods.
When I was challenged, 25 years ago, to identify similar properties within 2 statue miles from a property for sale, I despaired of finding a effective solution, and decided to settle for using an iterative method of partially solving the problem, then measuring how far short I was, then trying again.
Then I tripped across the website of the US National Geodetic Survey, and discovered I only needed to port FORTRAN code to 'C'. Ironically, the partial differential equation is only solvable through iterative means, so I was chasing the right solution when a complete answer was dropped in my lap (albeit some assembly required).
You have a trivial case of my problem, since you only need to compute three points (east and west are at the same distance, in degrees longitude, from the center point), and the distances are so small that haversines will suffice, but given the number of times that this problem has been solved, tested, and published, I doubt you need to spend too much effort locating a code library that will meet your needs.
Note that I recently had a Python project that could have used a port of the code library I had wrapped around the port or NGS's code, but I actually used
arcpy.PointGeometry.pointFromAngleAndDistance() since the client already had ArcGIS available. I haven't researched further, but I know PostGIS must have this solved, since ST_DWithin exists.