All pastes #707786 Raw Edit

Anonymous

public text v1 · immutable
#707786 ·published 2007-09-23 08:57 UTC
rendered paste body
	<cffunction name="Geocode" access="remote" returntype="struct" hint="sends data to google, and returns lat/long">
		<!---
		Thanks to Jeff Gladnick for providing the base code for the following function (http://www.jeffgladnick.com)
		--->
		<!--- Arguments --->
		<cfargument name="fullAddress"	type="string"	required="false" default=""  hint="full address string bypassing the arguments">
		<cfargument name="address1"	    type="string"	required="false" default=""  hint="street address line 1">
		<cfargument name="address2"	    type="string"	required="false" default=""  hint="street address line 2">
		<cfargument name="city"			type="string"	required="false" default=""  hint="city">
		<cfargument name="state"		type="string"	required="false" default=""  hint="state">
		<cfargument name="postalCode"	type="string"	required="false" default=""  hint="postal code">
		<cfargument name="countryCode"	type="string"	required="false" default=""  hint="the country code that we use to look up the states for">
		<cfargument name="googleMapKey" type="string"	required="false" default=""  hint="your google map key for your site">
		<cfargument name="attempt"		type="numeric"	required="false" default="1" hint="number of times we've tried to find a code">
		<!--- Declare local variables --->
		<cfset var instance = structNew()>
		<cfset var cfhttp	= structNew()>
		<!--- Logic --->
			<!--- Create address string based on what attempt this is --->
			<cfif len(arguments.fullAddress)>
				<cfset instance.addressString = arguments.fulladdress>
			<cfelse>
				<cfif arguments.attempt IS 1>
				    <cfset instance.addressString = "#arguments.address1# #arguments.address2#, #arguments.city#, #arguments.state# #arguments.postalCode# #arguments.countryCode#">
				<cfelseif arguments.attempt IS 2>
				    <cfset instance.addressString = "#arguments.address1#, #arguments.City#, #arguments.State# #arguments.postalCode# #arguments.countryCode#">
				<cfelseif arguments.attempt IS 3>
				    <cfset instance.addressString = "#arguments.address1#, #arguments.City#, #arguments.State# #arguments.countryCode#">
				<cfelseif arguments.attempt IS 4>
				    <cfset instance.addressString = "#arguments.City#, #arguments.State# #arguments.countryCode#">
				<cfelseif arguments.attempt IS 5>
				    <cfset instance.addressString = "#arguments.City#, #arguments.countryCode#">
				<cfelse>
				    <cfset instance.addressString = "#arguments.countryCode#">
				</cfif>
			</cfif>
			<!---<cfdump var="#instance#">
			<cfdump var="#arguments#">--->
			
			<!--- replace all spaces with + sign because thats the way google geocoder likes it --->
			<cfset instance.addressString = replace(instance.addressString," ","+","all")>
	        <!--- send geocoder request to google --->
	        <cfhttp method="get" url="http://maps.google.com/maps/geo?q=#instance.addressString#&output=xml&key=#arguments.googleMapKey#" resolveurl="no" ></cfhttp>
	        <!---<cfoutput>#htmleditFormat(cfhttp.filecontent)#</cfoutput>--->
	            
	        <cftry>
	            <!--- parse the xml file that is returned --->   
	            <cfset instance.xmlFile = xmlparse(cfhttp.filecontent)>   
	            <!--- extract the lat long coordinates out of the xml file --->
	            <cfset instance.locationList = instance.xmlFile.kml.response.placemark.point.coordinates.XmlText>
				
				<cfcatch type="any">
	                <!--- recall the geocode function with less accurate coordinates --->
					<cfset arguments.attempt = arguments.attempt + 1>
	                <cfif NOT len(arguments.fullAddress)>
						<cfset instance.sReturn  = Geocode(argumentCollection=arguments)>
					</cfif>
	            </cfcatch>
	        </cftry>

	        <cfset instance.sReturn = structNew()>
	        <cfset instance.sReturn.hasGeocode = false>
	        <cfif isDefined("instance.locationList")>
				<cfif listLen(instance.locationList) GTE 2>
					<cfset instance.sReturn.hasGeocode	= true>
	        		<cfset instance.sReturn.Lon			= listGetAt(instance.locationList,1)>
					<cfset instance.sReturn.Lat			= listGetAt(instance.locationList,2)>
					<cfset instance.sReturn.Accuracy	= arguments.attempt>
				</cfif>
			</cfif>
		<!--- return --->
		<cfreturn instance.sReturn/>
	</cffunction>