A few months ago the GPS in my 3G has become really unreliable.  The blue circle in google maps looks to be about 2 miles in diameter, and never shrinks to a pinpoint.  Apps like RunKeeper can never get a strong enough GPS signal.  This may have coincided with the iPhone not picking up wifi unless almost on top of the access point, but that could have been a coincidence.

Things I've tried that haven't worked:

 - Trying to lock on to a satillite when outside with clear skys for >30 minutes
 - General Settings -> Network -> Cellular Data -> Reset Settings
 - Restoring the iPhone from a back-up
 - Giving the phone a prelonged stern look

Any ideas greatly appreciated.