Repository: sunpy/sunpy

Issue:
Tighter definition of the bottom left and top right coordinate map properties required?
<!-- This comments are hidden when you submit the issue so you do not need to remove them!
Please be sure to check out our contributing guidelines: https://github.com/sunpy/sunpy/blob/master/CONTRIBUTING.rst
Please be sure to check out our code of conduct:
https://github.com/sunpy/sunpy/blob/master/CODE_OF_CONDUCT.rst -->

<!-- Please have a search on our GitHub repository to see if a similar issue has already been posted.
If a similar issue is closed, have a quick look to see if you are satisfied by the resolution.
If not please go ahead and open an issue! -->

### Description
<!-- Provide a general description of the bug. -->
Map provides the bottom left and top right coordinates as properties. The issue is that the meaning of the positions described by these coordinates is not obvious.

### Expected behavior
<!-- What did you expect to happen. -->
The expected behavior is that the meaning of these coordinates is consistent.

### Actual behavior
<!-- What actually happened. -->
<!-- Was the output confusing or poorly described? -->
It appears that map.bottom_left_coord is the position of the lower left hand vertex of that pixel, and map.top_right_coord is the position of the upper right hand vertex of that pixel.  Therefore the positions that these coordinates refer to are different relative to the pixel.  This is not explicit to the user.  There may be an implicit assumption that these positions define the extent of the map in the world.

### Steps to Reproduce
<!-- Ideally a code example could be provided so we can run it ourselves. -->
<!-- If you are pasting code, use tripe backticks (```) around your code snippet. -->
```
import numpy as np
import sunpy.data.test 
import sunpy.map
import os
import astropy.units as u

testpath = sunpy.data.test.rootdir

m = sunpy.map.Map((os.path.join(testpath, 'aia_171_level1.fits')))
m_bl = m.bottom_left_coord
m_tr = m.top_right_coord

x, y = np.meshgrid(*[np.arange(v.value) for v in m.dimensions]) * u.pix
ac = m.pixel_to_world(x, y)

ac_bl = np.nanmin(ac.Tx.value), np.nanmin(ac.Ty.value)
ac_tr = np.nanmax(ac.Tx.value), np.nanmax(ac.Ty.value)

print(m_bl, ac_bl)
print(m_tr, ac_tr)
```

### System Details
<!-- We at least need to know the SunPy version you are using. -->
<!-- We provide a short function in SunPy that will provide some of the below information. -->
<!-- It is sunpy.util.system_info(), this is optional but strongly recommended. -->
==========================================================
 SunPy Installation Information

==========================================================

###########
 General
###########
System : Darwin
Processor : i386
Arch : 64bit
SunPy : 1.0.0.dev10506
SunPy_git : 10a1729ebc2c9acce33c849fe531e547a359b5fe
OS: Mac OS X 10.13.6 (i386)


###########
 Required Libraries 
###########
Python: 3.6.8
NumPy: 1.15.4
SciPy: 1.1.0
matplotlib: 3.0.2
Astropy: 3.1.1
Pandas: 0.23.4


###########
 Recommended Libraries 
###########
beautifulsoup: 4.6.3
PyQt: NOT INSTALLED
Zeep: NOT INSTALLED
Sqlalchemy: 1.2.15



Discussion:
Hmmm. I thought all the pixel references should be centre of the pixel. I will investigate.
From the FITS paper -  "Coordinate values normally correspond to the center of all pixels (see Sect. 8.2);".  If that is the case then going in any axis there should be 127 pixels between centers and 1/2 pixel on either side to get the full extent of the test image.
As @ehsteve has discovered, this also manifests as a half-pixel out error in `map.plot` when not using `WCSAxes`.
Just to record this, is the solution to change the map extent calculation?
I think if we fix the top_right bottom_left hopefully extent will fall into line?

Resolving patch:
diff --git a/sunpy/map/mapbase.py b/sunpy/map/mapbase.py
--- a/sunpy/map/mapbase.py
+++ b/sunpy/map/mapbase.py
@@ -509,14 +509,14 @@ def processing_level(self):
     @property
     def bottom_left_coord(self):
         """
-        The physical coordinate for the bottom left [0,0] pixel.
+        The physical coordinate at the center of the bottom left ([0, 0]) pixel.
         """
         return self.pixel_to_world(0*u.pix, 0*u.pix)
 
     @property
     def top_right_coord(self):
         """
-        The physical coordinate for the top left pixel.
+        The physical coordinate at the center of the the top left ([-1, -1]) pixel.
         """
         return self.pixel_to_world(*self.dimensions)
 


Test patch: