Re: [GRASS-user] Grass SQLite driver math funtions

2013-10-01 Thread Enrico Gallo
2013/9/26 Pietro peter.z...@gmail.com

 On Thu, Sep 26, 2013 at 2:18 PM, Enrico Gallo enrico.ga...@gmail.com
 wrote:
  So there is not a way to use this kind of funtions with vector attributes
  without compile extra library and load it in SQLIte?
  Any python workaround?

 this example works only in grass7, otherwise you have to write your
 python code to work directly with the sqlite table.



[...]



 #
 # work around
 import math

 for geo in foo:
 geo.attrs['level'] = geo.attrs['power'] -
 math.log10(geo.attrs['distance'])

 }}}

 Note that this is far to be efficient...


As I have to manage table with 1E5 - 1E6 rows, I will try some python code
using pysqlite or APSW

thank you in any case for suggestions and workaround

best regards,

Enrico
___
grass-user mailing list
grass-user@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/grass-user

Re: [GRASS-user] Grass SQLite driver math funtions

2013-09-26 Thread Enrico Gallo
Dear list, dear Markus,


2013/9/26 Markus Neteler nete...@osgeo.org

 On Wed, Sep 25, 2013 at 11:42 AM, Enrico Gallo enrico.ga...@gmail.com
 wrote:
  Dear list,
  I am struggling with the use of simple math functions in SQL expression,
  using SQLIte and db.execute.
  I am writing a script for multiplatform end-users, so nor compiling
 SQLite
  math contrib library nor piping data to bc using command line seem to me
  feasable solutions.
 
  Do you have any suggestion?

 Could you post an example?



GRASS 6.4
from North Carolina data set
sqlite mapset

g.copy vect=railroads@PERMANENT,foo
v.db.addcol map=foo columns=power double precision,distance double
precision,level double precision

v.db.update map=foo column=power value=80
v.db.update map=foo column=distance value=100

v.db.update map=foo column=level value=power-distance
#  OK

v.db.update map=foo column=level value=power-log10(distance)
DBMI-SQLite driver error:
Error in sqlite3_prepare():
no such function: log10
ERROR: Error while executing: 'UPDATE foo SET level=power-log10(distance)
'

same error for sqrt(), log(), etc

see also [1] (in Italian) with dbf driver; SQLite suggestion seems wrong



  Including SQLite math functions in the standard binary GRASS GIS
  distribuition could be a long term solution? I think this is the choice
  SpatialLite did since 2.3 version.

 You mean
 http://www.gaia-gis.it/gaia-sins/spatialite-sql-3.0.0.html#math

 hence
 http://www.sqlite.org/contrib
 -- extension-functions.c (50.96 KB) contributed by Liam Healy on
 2010-02-06 15:45:07
 Provide mathematical and string extension functions for SQL queries
 using the loadable extensions mechanism. Math: acos, asin, atan, atn2,
 atan2, acosh, asinh, atanh, difference, degrees, radians, cos, sin,
 tan, cot, cosh, sinh, tanh, coth, exp, log, log10, power, sign, sqrt,
 square, ceil, floor, pi. String: replicate, charindex, leftstr,
 rightstr, ltrim, rtrim, trim, replace, reverse, proper, padl, padr,
 padc, strfilter. Aggregate: stdev, variance, mode, median,
 lower_quartile, upper_quartile.
 

 If you refer to this file, then it is more related to (your) SQLite
 installation rather than GRASS itself since GRASS just calls SQLite.

 best,
 Markus


It's exactly what I meant

So there is not a way to use this kind of funtions with vector attributes
without
compile extra library and load it in SQLIte?
Any python workaround?

Users need to change database, switching to MySQL or PostgreSQL?


Many thanks,
Enrico


[1] http://listserv.unipr.it/pipermail/grass-italia/2012-April/005897.html
___
grass-user mailing list
grass-user@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/grass-user

Re: [GRASS-user] Grass SQLite driver math funtions

2013-09-26 Thread Pietro
On Thu, Sep 26, 2013 at 2:18 PM, Enrico Gallo enrico.ga...@gmail.com wrote:
 So there is not a way to use this kind of funtions with vector attributes
 without compile extra library and load it in SQLIte?
 Any python workaround?

this example works only in grass7, otherwise you have to write your
python code to work directly with the sqlite table.

{{{
from grass.pygrass.modules.shortcuts import general as g
from grass.pygrass.vector import VectorTopo

# copy the vector map
g.copy(vect=['railroads', 'foo'], overwrite=True)

# define the column
cols = [('power', 'double precision'),
('distance', 'double precision'),
('level', 'double precision')]

# instantiate the vector map
foo = VectorTopo('foo')
foo.open('rw')

# add the new columns
for cname, ctype in cols:
foo.table.columns.add(cname, ctype)

# add some values
foo.table.execute('UPDATE foo SET power=80')
foo.table.execute('UPDATE foo SET distance=100')
foo.table.conn.commit()

#
# work around
import math

for geo in foo:
geo.attrs['level'] = geo.attrs['power'] - math.log10(geo.attrs['distance'])

}}}

Note that this is far to be efficient...

If you compile sqlite including the support for the extra functions,
you simply need to substitute the workaroud with:

{{{
foo.table.execute('UPDATE foo SET level=power - log10(distance)')
foo.table.conn.commit()
}}}

Best regards

Pietro
___
grass-user mailing list
grass-user@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/grass-user


[GRASS-user] Grass SQLite driver math funtions

2013-09-25 Thread Enrico Gallo
Dear list,
I am struggling with the use of simple math functions in SQL expression,
using SQLIte and db.execute.
I am writing a script for multiplatform end-users, so nor compiling SQLite
math contrib library nor piping data to bc using command line seem to me
feasable solutions.

Do you have any suggestion?

Including SQLite math functions in the standard binary GRASS GIS
distribuition could be a long term solution? I think this is the choice
SpatialLite did since 2.3 version.

Thank you for your help

Regards
___
grass-user mailing list
grass-user@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/grass-user

Re: [GRASS-user] Grass SQLite driver math funtions

2013-09-25 Thread Markus Neteler
On Wed, Sep 25, 2013 at 11:42 AM, Enrico Gallo enrico.ga...@gmail.com wrote:
 Dear list,
 I am struggling with the use of simple math functions in SQL expression,
 using SQLIte and db.execute.
 I am writing a script for multiplatform end-users, so nor compiling SQLite
 math contrib library nor piping data to bc using command line seem to me
 feasable solutions.

 Do you have any suggestion?

Could you post an example?

 Including SQLite math functions in the standard binary GRASS GIS
 distribuition could be a long term solution? I think this is the choice
 SpatialLite did since 2.3 version.

You mean
http://www.gaia-gis.it/gaia-sins/spatialite-sql-3.0.0.html#math

hence
http://www.sqlite.org/contrib
-- extension-functions.c (50.96 KB) contributed by Liam Healy on
2010-02-06 15:45:07
Provide mathematical and string extension functions for SQL queries
using the loadable extensions mechanism. Math: acos, asin, atan, atn2,
atan2, acosh, asinh, atanh, difference, degrees, radians, cos, sin,
tan, cot, cosh, sinh, tanh, coth, exp, log, log10, power, sign, sqrt,
square, ceil, floor, pi. String: replicate, charindex, leftstr,
rightstr, ltrim, rtrim, trim, replace, reverse, proper, padl, padr,
padc, strfilter. Aggregate: stdev, variance, mode, median,
lower_quartile, upper_quartile.


If you refer to this file, then it is more related to (your) SQLite
installation rather than GRASS itself since GRASS just calls SQLite.

best,
Markus
___
grass-user mailing list
grass-user@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/grass-user