Hi Charlie
Thanks for your assistance and now the code to detect the distance between 2
points using long / lat works a treat
Some background for the use of the code for those who are interested
Its being used to detect when a tracking device is within x distance from a
nominated point. Its for geo fence alerting, in order words we take a co
ordinate long / lat (which you can visualise as being the centre of a circle
with a radius of x distance). The coordinates of the centre of the circle are
set, which creates the gep fence.
The variable coordinates are the location of the mobile tracking device. Each
time the tracking device reports its current location (coordinates) those
coordinates are passed through the code to determine how far the reported
location is from the centre of the coordinates representing the centre of the
circle.
When the distance between the 2 points is less than the radius then by
definition it means the portable device is now inside the geo fence circle area
if the distance is greater than the radius then the reported location is
outside the geo fence circle
You then create processes to run eg cfmail alerts for emails dependant on the
business rules you need to set relating to when the circle has been entered /
existed
<cfscript>
function getDistance(loclat, loclon, fencelat, fencelon, units = 'kilometers')
{
// earth's radius. Default is miles.
var radius = 3959;
if (arguments.units EQ 'kilometers' )
radius = 6371;
else if (arguments.units EQ 'feet')
radius = 20903520;
var toRad = pi() / 180;
var dLat = (fencelat-loclat) * toRad;
var dLon = (fencelon-loclon) * toRad;
var a = sin(dLat/2)^2 + cos(loclat * toRad) * cos(fencelat * toRad) *
sin(dLon/2)^2;
var c = 2 * createObject("java","java.lang.Math").atan2(sqr(a), sqr(1-a));
return radius * c;
}
</cfscript>
<cfquery datasource="#ds#" username="#un#" password="#pw#" NAME="GeoFences">
select latitude, longitude, fence_name, fence_status
from GeoFences
where deviceid = '#url.deviceid#
</cfquery>
<cfloop query="GeoFences">
<cfif #radius# gt #getDistance(url,gps_latit , url.gps_longit , latitude,
longitude, 'kilometers')#>
<cfset status='Entered'>
<cfelse>
<cfset status='Exited'>
</cfif>
<!--- Buisiness Rules --- >
<cfif #status# neq #fence_status#>
Process business rule given the geo fence status calculated is different to the
previous status recorded
</cfif>
<cfquery datasource="#ds#" username="#un#" password="#pw#" NAME="GeoFences">
update GeoFences
Set fence_status='#status#’
where deviceid = '#url.deviceid#'
</cfquery>
</cfloop>
NB: TrackingCentral is now a registered product & services provider for the
National Disability Insurance Scheme, under the category of Assisted Technology
Regards
Claude Raiola
Director
TrackingCentral Pty. Ltd
Free Call 1300 255 990
From: [email protected] [mailto:[email protected]] On Behalf Of
Charlie Arehart
Sent: Thursday, 26 March 2015 2:12 PM
To: [email protected]
Subject: RE: [cfaussie] Help With Dynamic Naming A CfScript Function
Claude, I’m not picking a fight but I don’t see how that answers my question at
all. The good news is that I think you are very close to a solution, but you
seem to have missed what I said.
Why do you have the function being defined within this query loop you refer to
(in words, but don’t reflect in the code). Are you saying, perhaps, that some
of the variables within the function are references to query variables? I don’t
see that. It seems the UDF (user-defined function) is self-contained, and it
operates on whatever is passed into it.
So I’ll ask again: why don’t you simply put this *definition* of the function
OUTSIDE the loop and just *call the function from within the loop*, passing it
the values within the loop on which you want to perform these calculations?
And your subject and initial question refer to this being about “dynamic
naming” of the function, but your code below shows no such thing. When you said
in your first note that you were trying to do that with “function
getDistance#id#”, I wonder: were you trying that simply because you were
getting the error about not being able to duplicate the function? Again, you
don’t need to have the function being duplicated.
Just move the function out of the loop and you should be all set. :-)
/charlie
From: [email protected] <mailto:[email protected]>
[mailto:[email protected]] On Behalf Of [email protected]
<mailto:[email protected]>
Sent: Wednesday, March 25, 2015 11:49 PM
To: [email protected] <mailto:[email protected]>
Subject: RE: [cfaussie] Help With Dynamic Naming A CfScript Function
This is the code I am using
/**
* Calculates distance between Latitude/Longitude points using haversine formula.
*
* @param lat1 latitude of first point (Required)
* @param lon1 longitude of first point (Required)
* @param lat2 latitude of second point (Required)
* @param lon2 longitude of second point (Required)
* @param units Units for return value. Default is miles. (Optional)
* @return Returns numeric distance between the two points. Units varies,
default is miles.
* @author Henry Ho ([email protected] <mailto:[email protected]> )
* @version 0, January 8, 2013
*/
function getDistance(lat1, lon1, lat2, lon2, units = 'miles')
{
// earth's radius. Default is miles.
var radius = 3959;
if (arguments.units EQ 'kilometers' )
radius = 6371;
else if (arguments.units EQ 'feet')
radius = 20903520;
var toRad = pi() / 180;
var dLat = (lat2-lat1) * toRad;
var dLon = (lon2-lon1) * toRad;
var a = sin(dLat/2)^2 + cos(lat1 * toRad) * cos(lat2 * toRad) *
sin(dLon/2)^2;
var c = 2 * createObject("java","java.lang.Math").atan2(sqr(a),
sqr(1-a));
return radius * c;
}
Its wrapped inside a cfloop as I need to validate code received into our portal
from mobile devices against data stored in the database hence the need to look
around the data records from the query as often there will be more than 1
records to test against
NB: TrackingCentral is now a registered product & services provider for the
National Disability Insurance Scheme, under the category of Assisted Technology
Regards
Claude Raiola
Director
TrackingCentral Pty. Ltd
Free Call 1300 255 990
From: [email protected] <mailto:[email protected]>
[mailto:[email protected]] On Behalf Of Charlie Arehart
Sent: Thursday, 26 March 2015 1:26 PM
To: [email protected] <mailto:[email protected]>
Subject: RE: [cfaussie] Help With Dynamic Naming A CfScript Function
Right, but why do you need the name of the function to be dynamic? Why isn’t it
enough that you pass in args within the loop (and declare the function outside
of it)?
/charlie
From: [email protected] <mailto:[email protected]>
[mailto:[email protected]] On Behalf Of [email protected]
<mailto:[email protected]>
Sent: Wednesday, March 25, 2015 11:14 PM
To: [email protected] <mailto:[email protected]>
Subject: RE: [cfaussie] Help With Dynamic Naming A CfScript Function
I am calculating distance between 2 sets of lon / lat and the information is
dynamic so I need to capture the values of the dynamic data and compare them to
the values stored in a database table of which there may been to be several
records tested against the values in the dynamic data
Eg 1 set of co ordinate received from a device in the field data is received by
the listener and needs to be tested against co ordinates recorded in the
database table of which there may be several records needing to be tested
against hence the need for the loop
Regards
Claude Raiola
--
You received this message because you are subscribed to the Google Groups
"cfaussie" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected]
<mailto:[email protected]> .
To post to this group, send email to [email protected]
<mailto:[email protected]> .
Visit this group at http://groups.google.com/group/cfaussie.
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups
"cfaussie" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected]
<mailto:[email protected]> .
To post to this group, send email to [email protected]
<mailto:[email protected]> .
Visit this group at http://groups.google.com/group/cfaussie.
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups
"cfaussie" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected]
<mailto:[email protected]> .
To post to this group, send email to [email protected]
<mailto:[email protected]> .
Visit this group at http://groups.google.com/group/cfaussie.
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups
"cfaussie" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/cfaussie.
For more options, visit https://groups.google.com/d/optout.