There's a lot more to this program, but I've cut it down to the bare
minimum that illustrates my problem.  I call a TCL script from the linux
commandline, and get an error message like so...

========================================================================
[waltdnes][~/SQLite] ./fragment 49.25 123 25
can't read "lat1": no such variable
    while executing
"expr $lat1 / $radian "
    (procedure "sql_distance" line 3)
    invoked from within
"sql_distance 49.25 123 48.916666666666664 -123.7"
    invoked from within
"db eval { select e_stnid, i_stnid, deci_lat, deci_long, elevation,
            distance($lat_degrees, $long_degrees, deci_lat, deci_long) as dist
    ..."
    (file "./fragment" line 21)
========================================================================

  Here is the cut-down program...

========================================================================
#!/usr/bin/tclsh
set lat_degrees [expr [lindex $argv 0]]
set long_degrees [expr [lindex $argv 1]]
set radius      [expr [lindex $argv 2]]
load /usr/lib/sqlite-3.6.17/libtclsqlite3.so
sqlite3 db :memory:
# Note: GIS convention has longitude negative in the western hemisphere.
# But end-users will get annoyed at having to enter the minus sign all the
# time.  So the conversion is done internally in the distance() function.
proc sql_distance {lat1, long1, lat2, long2} {
  set radian [expr 180 / 3.1415926]
  set lat1 [expr $lat1 / $radian ]
  set long1 [expr $long1 / $radian * (-1) ]
  set lat2 [expr $lat2 / $radian ]
  set long2 [expr $long2 / $radian ]
  return [expr {
    acos(sin($lat1) * sin($lat2) + cos($lat1) * cos($lat2) * cos($long2 - 
$long1)) * 6371}]}
db function distance sql_distance

db eval {attach 'climate.sqlite' as cl}
db eval { select e_stnid, i_stnid, deci_lat, deci_long, elevation,
            distance($lat_degrees, $long_degrees, deci_lat, deci_long) as dist
          from cl.stations
          where dist <= $radius} {puts stdout "$e_stnid, $i_stnid, $deci_lat, 
$deci_long, $elevation, $dist"}
db close
========================================================================

  I'm trying to do a select on all sites within a given radius of a
given point. I'm using the "spherical cosine law" to calculate distance.
The "sql_distance 49.25 123 48.916666666666664 -123.7" error message
shows that I successfully passed the first 2 command line parameters and
the last 2 came from an entry in table cl.stations.

  Given that all 4 parameters hace been passed tothe distance()
function, why are they undefined in the proc?

-- 
Walter Dnes <waltd...@waltdnes.org>
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to