Hannibal is located at 39°42'15" North, 91°22'39" West (39.704065, -91.377378){{GR|1}}.
According to the [[United States Census Bureau]], the city has a total area of 39.1 [[square kilometer|km²]] (15.1 [[square mile|mi²]]). 37.8 km² (14.6 mi²) of it is land and 1.2 km² (0.5 mi²) of it is water. The total area is 3.12% water.