If you're a developer, you can also use the GPS of mobile devices quite easily (we actually use this in IP.Nexus to make the address input field autocomplete, you usually only need to enter your house number and it knows the rest), though I wouldn't recommend it for things like location-based advertising.
With GPS location, it requires both the user to have GPS-compatible hardware, and them to specifically allow access. While that's fine for specific cases, most users aren't going to allow access to their precise location unless they know what you want it for. And for things like location-based advertising, getting it based on their IP is specific enough (I assume you're going to do ads based on their country, or maybe state, but you're not going to show different ads to different streets, presumably ).
The methods available are:
/* IP address */
IPSGeoLocation::getByIp( $ipAddress );
/* Latitude and longitude (such as returned by the GPS) */
IPSGeoLocation::getByLatLong( $latitude, $longitude );
/* Manually */
$geolocation = new IPSGeoLocation;
$geolocation->addressLines = array( '123 Fake St.' );
$geolocation->city = 'City';
$geolocation->country = 'US';
So, if you wanted it, it's there. You'd just need to write the JS to ask the user for permission and post the values (which is just a couple lines of JS).