Ok, here's Dave's solution which is extremely fast and I would never have
been able to do the math, my dog ate the homework wouldn't even have
worked....

Here's my sql select:

I simply opened the warrant file positioned on a record, closed the browse
window and did a scatter memvar then, 

SELECT * FROM MAPWANTS WHERE
DISTANCE(2,VAL(M.LAT),VAL(M.LONG),VAL(LAT),VAL(LONG),1)<=1

The <= 1 is 1 mile.

Here's his distance function:
http://www.intellectiongroup.com/
Dave Bernard
[EMAIL PROTECTED]

*----------------------------------------------------------------------*
* Given a pair of lattitude and longitudes, return the approximate
* distance in nautical miles between points A and B.
*
* P_FUNC  1 = DD:MM:SS format, 2 = DD.MMMM format
* P_LT1   Lattitude of point A
* P_LG1   Longitude of point A
* P_LT1   Lattitude of point B
* P_LG2   Longitude of point B
* P_TYPE  0=Nautical Miles, 1=Statute Miles, 2=Kilometers
*
* All lattitude and longitude values are passed as strings in function 1
* and as numbers in function 2.
*
* Assumes N lattitude and W longitude
*
* Examples:
* a = Distance(1, "33:57:00", "118:24:00", "40:38:00", "73:47:00", 2)
* a = Distance(2, 33.95, 118.4, 40.6333, 73.7833, 2)
*
* Test with http://www.indo.com/distance
*
*----------------------------------------------------------------------*
function Distance
parameters p_func, p_lt1, p_lg1, p_lt2, p_lg2, p_type

   private p_func, p_lt1, p_lg1, p_lt2, p_lg2, p_svdec, p_pi,;
           p1_degN, p1_minN, p1_secN, p1_degW, p1_minW, p1_secW,;
           p2_degN, p2_minN, p2_secN, p2_degW, p2_minW, p2_secW,;
           p_lat1, p_lon1, p_lat2, p_lon2, p_dist, p_type

   p_svdec = set("decimals")

   set decimals to 9
   
   if type("p_type") <> "N"
      p_type = 0
   endif
   
   if p_type > 2
      p_type = 0
   endif
   
   p_pi = pi()

   do case
      case p_func = 1
           p_lt1 = p_lt1 + ":00"
           p_lg1 = p_lg1 + ":00"
           p_lt2 = p_lt2 + ":00"
           p_lg2 = p_lg2 + ":00"
           
           p1_degN = val(left(p_lt1, at(":", p_lt1) - 1))
           p_lt1   = substr(p_lt1, at(":", p_lt1) + 1)
           p1_minN = val(left(p_lt1, at(":", p_lt1) - 1))
           p_lt1   = substr(p_lt1, at(":", p_lt1) + 1)
           p1_secN = val(p_lt1)

           p1_degW = val(left(p_lg1, at(":", p_lg1) - 1))
           p_lg1   = substr(p_lg1, at(":", p_lg1) + 1)
           p1_minW = val(left(p_lg1, at(":", p_lg1) - 1))
           p_lg1   = substr(p_lg1, at(":", p_lg1) + 1)
           p1_secW = val(p_lg1)

           p2_degN = val(left(p_lt2, at(":", p_lt2) - 1))
           p_lt2   = substr(p_lt2, at(":", p_lt2) + 1)
           p2_minN = val(left(p_lt2, at(":", p_lt2) - 1))
           p_lt2   = substr(p_lt2, at(":", p_lt2) + 1)
           p2_secN = val(p_lt2)

           p2_degW = val(left(p_lg2, at(":", p_lg2) - 1))
           p_lg2   = substr(p_lg2, at(":", p_lg2) + 1)
           p2_minW = val(left(p_lg2, at(":", p_lg2) - 1))
           p_lg2   = substr(p_lg2, at(":", p_lg2) + 1)
           p2_secW = val(p_lg2)

           p_lat1 = (p1_degN + ((p1_minN + (p1_secN / 60)) / 60)) * p_pi /
180
*                    p_pi * (p1_degN + (p1_minN / 60) + (p1_secN / 3600)) /
180
           p_lon1 = (p1_degW + ((p1_minW + (p1_secW / 60)) / 60)) * p_pi /
180
           p_lat2 = (p2_degN + ((p2_minN + (p2_secN / 60)) / 60)) * p_pi /
180
           p_lon2 = (p2_degW + ((p2_minW + (p2_secW / 60)) / 60)) * p_pi /
180
      
      case p_func = 2
           p1_degN = p_lt1
           p1_minN = 0
           p1_secN = 0
           p1_degW = p_lg1
           p1_minW = 0
           p1_secW = 0
           p2_degN = p_lt2
           p2_minN = 0
           p2_secN = 0
           p2_degW = p_lg2
           p2_minW = 0
           p2_secW = 0

           p_lat1 = p1_degN * p_pi / 180
           p_lon1 = p1_degW * p_pi / 180
           p_lat2 = p2_degN * p_pi / 180
           p_lon2 = p2_degW * p_pi / 180
           
      otherwise
           set decimals to &p_svdec
           return 0
   endcase

***Method 1   
   p_dist = acos((sin(p_lat1) * sin(p_lat2)) + (cos(p_lat1) * cos(p_lat2) *
cos(p_lon1 - p_lon2)))
   p_dist = int((p_dist * 180 * 60 / p_pi) +.5)         && Distance in
Nautical Miles

***Method 2, with conversion to UTM (Mercator) coordinates
   p_er = 6371.315                              && Average radius of the
Earth

***Assume N lattitude and W longitude
***  For S lattitude: p_radlat1 = (p_pi / 2) + p_lat1
***  Others remain the same
   p_radlat1 = (p_pi / 2) - p_lat1
   p_radlon1 = (p_pi * 2) - p_lon1
   p_radlat2 = (p_pi / 2) - p_lat2
   p_radlon2 = (p_pi * 2) - p_lon2

***Spherical coordinates: x=r*cos(long)sin(lat), y=r*sin(long)*cos(lat),
z=r*cos(lat)
   p_x1 = p_er * cos(p_radlon1) * sin(p_radlat1)
   p_y1 = p_er * sin(p_radlon1) * sin(p_radlat1)
   p_z1 = p_er * cos(p_radlat1)

   p_x2 = p_er * cos(p_radlon2) * sin(p_radlat2)
   p_y2 = p_er * sin(p_radlon2) * sin(p_radlat2)
   p_z2 = p_er * cos(p_radlat2)

   p_d = sqrt((p_x1 - p_x2)^2 + (p_y1 - p_y2)^2 + (p_z1 - p_z2)^2)
   
***Side, side, side, law of cosines and arccos
   p_theta = acos(((p_er^2 * 2) - (p_d^2)) / (p_er^2 * 2))

***These need to be rounded
   p_dist2 = p_theta * p_er                             && Distance in
Kilometers
   p_dist3 = p_dist2 / 1.609344                 && Distance in Miles
   p_dist4 = p_dist2 / 1.852                    && Distance in Nautical
Miles
   
   set decimals to &p_svdec

   do case
      case p_type = 0
           return p_dist
      case p_type = 1
           return p_dist3
      case p_type = 2
           return p_dist2
   endcase

return p_dist





_______________________________________________
Post Messages to: ProFox@leafe.com
Subscription Maintenance: http://leafe.com/mailman/listinfo/profox
OT-free version of this list: http://leafe.com/mailman/listinfo/profoxtech
Searchable Archive: http://leafe.com/archives/search/profox
This message: http://leafe.com/archives/byMID/profox/[EMAIL 
PROTECTED]@shelbynet.com
** All postings, unless explicitly stated otherwise, are the opinions of the 
author, and do not constitute legal or medical advice. This statement is added 
to the messages for those lawyers who are too stupid to see the obvious.

Reply via email to