I made some changes to the DAL geo APIs. This is an experimental feature so 
we are allowed to make changes. Anyway, the changes should be backward 
compatible. The only issue is that I am documenting the geodal api in the 
book and I would not want to change them later.

Can you please check them:

The DAL supports geographical APIs using PostGIS (for PostgreSQL), 
spatialite (for SQLite), and MSSQL and Spatial Extensions.

DAL provides geometry and geography fields types and the following 
functions:

st_asgeojson (PostGIS only)
st_astext
st_contained
st_contains
st_distance
st_equals
st_intersects
st_overlaps
st_simplify (PostGIS only)
st_touches
st_within

examples:

    >>> from gluon.dal import DAL, Field, geoPoint, geoLine, geoPolygon
    >>> db = DAL("mssql://user:pass@host:db")
    >>> sp = db.define_table('spatial',Field('loc','geometry()'))

    >>> sp.insert(loc=geoPoint(1,1))
    >>> sp.insert(loc=geoLine((100,100),(20,180),(180,180)))
    >>> sp.insert(loc=geoPolygon((0,0),(150,0),(150,150),(0,150),(0,0)))


    >>> print db(sp.id>0).select()
    spatial.id,spatial.loc
    1, POINT (1 2)"
    2, LINESTRING (100 100, 20 180, 180 180)
    3, POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))

    >>> query = sp.loc.st_intersects(geoLine((20,120),(60,160)))
    >>> query = 
sp.loc.st_overlaps(geoPolygon((1,1),(11,1),(11,11),(11,1),(1,1)))
    >>> query = sp.loc.st_contains(geoPoint(1,1))
    >>> print db(query).select(sp.id,sp.loc)
    spatial.id,spatial.loc
    3,"POLYGNON ((0 0, 150 0, 150 150, 0 150, 0 0))"

    >>> dist = sp.loc.st_distance(geoPoint(-1,2)).with_alias('dist')
    >>> print db(sp.id>0).select(sp.id, dist)
    spatial.id, dist
    1 2.0
    2 140.714249456
    3 1.0

-- 



Reply via email to