This weekend i've got a situation where having lat/long for a city had to find the country/state where it is located. It turned to be a not so complicated task. After a quick googling i found this site that has a lot of interesting info including a list of web services. And one of them provided exactly what i needed .
A sample call would look like this:
http://ws.geonames.org/countrySubdivision?lat=47.03&lng=10.2

And the result:
<geonames><countrySubdivision><countryCode>AT</countryCode><countryName>Austria</countryName><adminCode1>07</adminCode1><adminName1>Tyrol</adminName1><code type="FIPS10-4">07</code><code type="ISO3166-2">7</code><distance>0.0</distance></countrySubdivision></geonames>

And few minutes later i've got the following function that cover at least USA and Canada (the 2 i needed):
<cffunction name="getCountryInfo" output="no" returntype="any"><cfargument name="lat" type="any" required="Yes"><cfargument name="long" type="any" required="Yes"><cfset var cfhttp = ""><cfset var rez = ""><cfset var theXML = ""><cfhttp url="http://ws.geonames.org/countrySubdivision?lat=#arguments.lat#&lng=#arguments.long#" method="GET" useragent="Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14"/><cfif IsXML(cfhttp.FileContent)><cfset theXML = XMLParse(cfhttp.FileContent)><cfset rez = StructNew()><cfif not StructKeyExists(theXML, "geonames")><cfset rez.isError = 1><cfset rez.message = cfhttp.FileContent><cfelse><cfset rez.isError = 0><cfif StructKeyExists(theXML.geonames, "countrySubdivision")><cfset rez.country = LCase(theXML.geonames.countrySubdivision.countryCode.XmlText)><cfif rez.country eq "ca"><cfswitch expression="#theXML.geonames.countrySubdivision.adminCode1.XmlText#"><cfcase value="01"><cfset rez.state = 'AB'></cfcase><cfcase value="02"><cfset rez.state = 'BC'></cfcase><cfcase value="03"><cfset rez.state = 'MB'></cfcase><cfcase value="04"><cfset rez.state = 'NB'></cfcase><cfcase value="05"><cfset rez.state = 'NL'></cfcase><cfcase value="06"><cfset rez.state = '></cfcase><cfcase value="07"><cfset rez.state = 'NS'></cfcase><cfcase value="08"><cfset rez.state = 'ON'></cfcase><cfcase value="09"><cfset rez.state = 'PE'></cfcase><cfcase value="10"><cfset rez.state = 'QC'></cfcase><cfcase value="11"><cfset rez.state = 'SK'></cfcase><cfcase value="12"><cfset rez.state = 'YT'></cfcase><cfcase value="13"><cfset rez.state = 'NT'></cfcase><cfcase value="14"><cfset rez.state = 'NU'></cfcase><cfdefaultcase><cfset rez.state = '></cfdefaultcase></cfswitch><cfelse><cfset rez.state = theXML.geonames.countrySubdivision.adminCode1.XmlText></cfif><cfelse><cfset rez.isError = 1><cfset rez.message = cfhttp.FileContent></cfif></cfif><cfelse><cfset rez = cfhttp.FileContent></cfif><cfreturn rez></cffunction>