The message headers should contain a full list of “received” headers, assuming the mail servers are not intentionally configured not to add the headers, and they have not been removed by something,
The first received header, which will be the lowest one in the list should detail the IP address of the first smtp server, and the address it received the message from. In the case of web based services like gmail, you’re obviously not going to get the address of the end user. Also if the user has a local mail server (like an exchange server on a lan), you’ll need to go further up the received chain to get the correct public address (as the client address in the first connection will be a lan address)
The original location information comes from the IP registries such as ripe/arin/etc. I’m sure you can find a decent lookup website with a 5 second google search. Note that, in most cases, location information is just where the IP is registered, not the actual end user address.
For basic home internet, you’ll probably find the IP address of an end user is part of a large block, and registered to the ISPs location, which could be hundreds of miles away. For a medium or larger business that have their own block of addresses, their ISP *may* have gone to the trouble of specifically registering that block to the customer, along with the customers address.