[gdal-dev] [Proposed new feature] A '"SQLite" SQL dialect for OGR

Smith, Michael ERDC-RDE-CRREL-NH Michael.Smith at erdc.dren.mil
Sat Aug 18 10:28:09 PDT 2012


This is "wicked cool".

Mike

-- 
Michael Smith

US Army Corps
Remote Sensing GIS/Center



On 8/18/12 1:03 PM, "Even Rouault" <even.rouault at mines-paris.org> wrote:

>Hi folks,
>
>I've attached in 
>http://trac.osgeo.org/gdal/attachment/ticket/4782/sqlite_dialect.patch a
>patch 
>that adds a SQLite alternate SQL dialect that can be used with any OGR
>datasource (only available if GDAL/OGR is configured with SQLite support
>of 
>course)
>
>To remind you the concept of SQL dialects, for non-RDBMS OGR drivers, OGR
>uses 
>its own SQL engine, which is the called the OGRSQL dialect. Whereas for
>RDBMS 
>OGR drivers, their own SQL engine will be used, unless otherwise
>specified.
>
>This patchs adds the capability to use a SQLite dialect (through the
>-dialect 
>option of ogrinfo or ogr2ogr for example). When doing so, the SQLite SQL
>engine is used, and when Spatialite is available, all the Spatialite
>functions 
>( see http://www.gaia-gis.it/gaia-sins/spatialite-sql-3.0.0.html ) can
>also be 
>used.
>
>Technically, this works thanks to a temporary in-memory SQLite DB and a
>module 
>(ogr/ogrsf_frmts/sqlite/ogrsqlitevirtualogr.cpp) that exposes OGR layers
>to 
>SQLite through its Virtual Table mechanism (
>http://www.sqlite.org/vtab.html
>). When the datasource you operate on is opened in update mode and that
>the 
>corresponding OGR driver supports
>CreateFeature()/SetFeature()/DeleteFeature()
>operations, SQL INSERT/UPDATE/DELETE operations will work too.
>
>What do you think about it ?
>
>A few non-exhaustive examples of things you can do :
>
># Initial CSV file :
>
>$ cat my.csv
>id,foo,bar,long,lat
>1,"foo","bar",2,49
>1,"foo","bar",3,50
>2,"foo2","bar2",-2,49
>2,"foo2","bar2",-3,51
>
># Creates a Geometry field from each (long,lat) tuple :
>
>$ ogrinfo my.csv -dialect sqlite -sql "SELECT *, MakePoint(CAST(long AS
>FLOAT), CAST(lat AS FLOAT)) as geometry FROM my" -q
>
>Layer name: SELECT
>OGRFeature(SELECT):0
>  id (String) = 1
>  foo (String) = foo
>  bar (String) = bar
>  long (String) = 2
>  lat (String) = 49
>  POINT (2 49)
>
>OGRFeature(SELECT):1
>  id (String) = 1
>  foo (String) = foo
>  bar (String) = bar
>  long (String) = 3
>  lat (String) = 50
>  POINT (3 50)
>
>OGRFeature(SELECT):2
>  id (String) = 2
>  foo (String) = foo2
>  bar (String) = bar2
>  long (String) = -2
>  lat (String) = 49
>  POINT (-2 49)
>
>OGRFeature(SELECT):3
>  id (String) = 2
>  foo (String) = foo2
>  bar (String) = bar2
>  long (String) = -3
>  lat (String) = 51
>  POINT (-3 51)
>
>
># Merge all the points that have the same id into a line :
>
>$ ogrinfo my.csv -dialect sqlite -sql "SELECT id, foo,bar,
>MakeLine(MakePoint(CAST(long AS FLOAT), CAST(lat AS FLOAT))) FROM my
>GROUP BY 
>id" -q
>
>Layer name: SELECT
>OGRFeature(SELECT):0
>  id (String) = 1
>  foo (String) = foo
>  bar (String) = bar
>  LINESTRING (2 49,3 50)
>
>OGRFeature(SELECT):1
>  id (String) = 2
>  foo (String) = foo2
>  bar (String) = bar2
>  LINESTRING (-2 49,-3 51)
>
># Compute the geodesic length of each line :
>
>$ ogrinfo my.csv -dialect sqlite -sql "SELECT id,
>GeodesicLength(SetSRID(MakeLine(MakePoint(CAST(long AS FLOAT), CAST(lat
>AS 
>FLOAT))),4326)) AS total_length FROM my GROUP BY id" -q
>
>Layer name: SELECT
>OGRFeature(SELECT):0
>  id (String) = 1
>  total_length (Real) = 132725.477910869
>
>OGRFeature(SELECT):1
>  id (String) = 2
>  total_length (Real) = 233720.037020965
>
># Appends a new entry in the CSV :
>
>$ ogrinfo my.csv -dialect sqlite -sql "insert into my
>(id,foo,bar,long,lat)
>values (3,'foo3','bar3',2.5,49.5)"
>
>$ cat my.csv
>id,foo,bar,long,lat
>1,"foo","bar",2,49
>1,"foo","bar",3,50
>2,"foo2","bar2",-2,49
>2,"foo2","bar2",-3,51
>3,foo3,bar3,2.5,49.5
>
># Reprojection from EPSG:32631 to EPSG:4326 :
>
>$ ogrinfo poly.shp -dialect sqlite -sql "SELECT
>ST_Transform(SetSRID(GEOMETRY,32631),4326) AS GEOMETRY, * FROM poly WHERE
>EAS_ID = 170"
>INFO: Open of `poly.shp'
>      using driver `ESRI Shapefile' successful.
>
>Layer name: SELECT
>Geometry: Unknown (any)
>Feature Count: 1
>Extent: (2.750069, 43.034444) - (2.751428, 43.035184)
>Layer SRS WKT:
>GEOGCS["WGS 84",
>    DATUM["WGS_1984",
>        SPHEROID["WGS 84",6378137,298.257223563,
>            AUTHORITY["EPSG","7030"]],
>        AUTHORITY["EPSG","6326"]],
>    PRIMEM["Greenwich",0,
>        AUTHORITY["EPSG","8901"]],
>    UNIT["degree",0.0174532925199433,
>        AUTHORITY["EPSG","9122"]],
>    AUTHORITY["EPSG","4326"]]
>Geometry Column = GEOMETRY
>AREA: Real (0.0)
>EAS_ID: Real (0.0)
>PRFEDEA: String (0.0)
>OGRFeature(SELECT):0
>  AREA (Real) = 5268.813
>  EAS_ID (Real) = 170
>  PRFEDEA (String) = 35043413
>  POLYGON ((2.751427625469495 43.034734578878634,2.750298298604006
>43.034443959553869,2.75006933958772 43.03490271631064,2.75124435992688
>43.035184432169061,2.751427625469495 43.034734578878634))
>
>Note: a similar capability was already available in OGR 1.9 for
>Shapefiles, 
>through the use of the VirtualShape module that is embedded in
>Spatialite. See 
>the http://gdal.org/ogr/drv_sqlite.html page.
>
>Best regards,
>
>Even
>
>_______________________________________________
>gdal-dev mailing list
>gdal-dev at lists.osgeo.org
>http://lists.osgeo.org/mailman/listinfo/gdal-dev



More information about the gdal-dev mailing list