Spatialite http://www.gaia-gis.it/gaia-sins/ • Created by Alessandro Furieri (Italy) • First release published in 2008 • SpatiaLite is an open source library intended to extend the SQLite core to support fully fledged Spatial SQL capabilities. • SpatiaLite is smoothly integrated into SQLite to provide a complete and powerful Spatial DBMS (mostly OGC-SFS compliant). SQLite http://www.sqlite.org/ • Created by Richard Hipp • First release published in 2000 • SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine. SQLite is the most widely deployed SQL database engine in the world. • A single lightweight library implementing the full SQL engine • standard SQL implementation: almost complete SQL-92 • no complex client/server architecture • no installation, no configuration What do you need to get started? • Spatialite • Spatialite_GUI Program • http://www.gaia-gis.it/gaia-sins/ • SQLite • SQLite Manager (Firefox plugin) • Install extension from Firefox browser Resources SQLite: http://www.sqlite.org/ -File based relational database Spatialite: http://www.gaia-gis.it/gaia-sins/ -SQLite extension for gis functionality GDAL: http://www.gdal.org/ -Set of libraries for ETL operations with multiple GIS formats QGIS: http://www.qgis.org/ -Open Source GIS application OSGeo4W: http://trac.osgeo.org/osgeo4w/ -Installer for suite of open source GIS software and tools GIS Spatialite GUI Application SQLite database files DEMO • Spatialite GUI • Shapefile loader • GDAL Command line • Load shapefile, file geodatabase Loading Shapefile in Spatialite GUI Load Shapefil e Using GDAL to load data into Spatialite Using GDAL to load data into Spatialite -Load shapefile into Spatialite database ogr2ogr –update –append –f SQLite C:\GISData\NDIC\ndic.sqlite C:\GISData\NDIC\shapefiles\Horizontals_Lines.shp Horizontals_Lines –nln Horizontals_Lines Shapefile directory to Spatialite (windows): for %f in (/GISData/NDIC/*.shp) do ( ogr2ogr -update -append -t_srs ESPGS:4267 -f SQLite C:\GISData\NDIC\ndic.sqlite GISData\NDIC\%f -nln layers) -Load file geodatabase feature class into Spatialite database ogr2ogr –update –append –f SQLite C:\GISData\NDIC\ndic.sqlite MTND_CadNSDI.gdb PLSSFirstDivision –nln Landgrid_PLSS_Sections DEMO • Firefox SQLite Manager • Spatialite GUI Using Firefox SQLite Manager -Basic query Spatialite GUI -Basic query Spatialite GUI -query with spatial function Using Firefox SQLite Manager -Trying to use spatial functions in query SQLite vs Spatialite new database structure Spatial Metadata Empty Pros • • • • • • • Cross-platform No custom installation to use Single file for transport Simple access to SQL queries Large spatial function library Transform geometries within sql query Fast prototyping of geodatase modeling and analysis Cons • Only simple multi-editor environment, no conflict management • Less performant than server based RDBMS Who is Spatialite for? • Non-Enterprise user • Users with reasonable size datasets • User wanting to get started with SQL • Users needing another GIS tool in their belt • User familiar with SQL wanting access to spatial functions • User who needs functionality of RDBMS but does not have access to servers Who is Spatialite NOT for? • Enterprise user who needs maximum performance • Users who need a robust multi-editor environment with conflict management • User who have very large datasets DEMO • Spatialite GUI • Query examples Spatialite GUI -Basic query Spatialite GUI -query with spatial function SQL Server Non-Spatial Queries SQL Server MGMT Studio – Midpoint on Linestring USE database IF OBJECT_ID('tempdb..#NDIC_HORZ_LIST') IS NOT NULL DROP TABLE #NDIC_HORZ_LIST SET NOCOUNT OFF -- Create temp table to hold the OBJECTID and apply filter on wells without enough points SELECT lineID = identity (int,1,1), OBJECTID INTO #NDIC_HORZ_LIST FROM database.dbo.API12_PATHS CREATE CLUSTERED INDEX idx_NDIC_HORZ_LIST_lineid ON #NDIC_HORZ_LIST(lineID) CREATE INDEX idx_NDIC_HORZ_LIST_objectid ON #NDIC_HORZ_LIST(OBJECTID) DECLARE DECLARE DECLARE DECLARE DECLARE DECLARE DECLARE @midPoint geometry @point1X numeric(25,20) @point1Y numeric(25,20) @point2X numeric(25,20) @point2Y numeric(25,20) @xDiff numeric(25,20) @yDiff numeric(25,20) DECLARE @workingLineLength1 numeric(25,20) = 0 DECLARE @workingLineLength2 numeric(25,20) = 0 DECLARE @lineLength numeric(25,20) Multiple While Loop Operations SLOWER DECLARE @i int DECLARE @lineID int DECLARE @lineOID INT DECLARE @line geometry DECLARE @workLine geometry DECLARE @lastSegment geometry DECLARE @lineFromString NVARCHAR(MAX) SET @lineID = 1 -- Outer loop to iterate over lines in table, using the counts from the temp table WHILE @lineID <= (SELECT COUNT(*) FROM #NDIC_HORZ_LIST) BEGIN -- Assign OBJECTID FROM Temp table to variable SET @lineOID = (SELECT OBJECTID FROM #NDIC_HORZ_LIST WHERE lineID = @lineID) -- Assign SHAPE From table to geometry variable SET @line = (SELECT SHAPE FROM database.dbo.API12_PATHS WHERE OBJECTID = @lineOID) SET @lineLength = @line.STLength() / 2 SET @lineFromString = 'LINESTRING(' SET @i = 1 -- Loop through points in line until the working length is longer than half the line length WHILE @workingLineLength2 < @lineLength BEGIN -- For first point add start point from line IF @i = 1 BEGIN SET @lineFromString = @lineFromString + CAST(@line.STStartPoint().STX AS VARCHAR(10)) + ' ' + CAST(@line.STStartPoint().STY AS VARCHAR(10)) + ')' END ELSE BEGIN -- Strip the trailing ) from the line string text SET @lineFromString = LEFT(@lineFromString, LEN(@lineFromString) - 1) SET @lineFromString = @lineFromString + ',' + CAST(@line.STPointN(@i).STX AS VARCHAR(10)) + ' ' + CAST(@line.STPointN(@i).STY AS VARCHAR(10)) + ')' SET @workLine = geometry::STGeomFromText(@lineFromString, 4267) SET @lastSegment = geometry::STGeomFromText('LINESTRING(' + CAST(@line.STPointN(@i - 1).STX AS VARCHAR(10)) + ' ' + CAST(@line.STPointN(@i - 1).STY AS VARCHAR(10)) + ',' + CAST(@line.STPointN(@i).STX AS VARCHAR(10)) + ' ' + CAST(@line.STPointN(@i).STY AS VARCHAR(10)) + ')', 4267) SET @workingLineLength2 = @workLine.STLength() IF @workingLineLength2 > @lineLength BEGIN SET @point1X = @line.STPointN(@i - 1).STX SET @point1Y = @line.STPointN(@i - 1).STY SET @point2X = @line.STPointN(@i).STX SET @point2Y = @line.STPointN(@i).STY SET @xDiff = (@point2X - @point1X) * ((@lineLength - @workingLineLength1) / @lastSegment.STLength()) SET @yDiff = (@point2Y - @point1Y) * ((@lineLength - @workingLineLength1) / @lastSegment.STLength()) SET @midPoint = geometry::STGeomFromText('POINT(' + CAST(@point1X + @xDiff AS VARCHAR(25)) + ' ' + CAST(@point1Y + @yDiff AS VARCHAR(25)) + ')',4267) INSERT INTO database.dbo.API10_SHL(OBJECTID,SHAPE) SELECT ROW_NUMBER() OVER(ORDER BY t2.OBJECTID), @midPoint FROM database.dbo.API12_PATHS AS t2 END SET @workingLineLength1 = @workingLineLength2 END SET @i = @i + 1 END SET @lineID = @lineID + 1 END Spatialite GUI -query with spatial function Spatialite GUI -attach to another sqlite database SQL Query GUI Spatialite GUI -Query using join to attached database Spatialite Spatial Functions GeomFromExifGpsBlob MakePoint MakePointZ MakePointM MakePointZM MakeLine TriangularGrid HexagonalGrid BuildMbr BuildCircleMbr Extent ToGARS SingleSidedBuffer SridFromAuthCRS SharedPaths ShiftCoords Line_Interpolate_Point ShiftCoordinates Line_Interpolate_Equidistant_Points ST_Translate Line_Locate_Point ST_Shift_Longitude Line_Substring NormalizeLonLat ClosestPoint ScaleCoords ShortestLine ScaleCoordinates Snap RotateCoords Collect RotateCoordinates Collect ReflectCoords LineMerge ReflectCoordinates MinM MaxM GeomFromText ST_WKTToSQL PointFromText LineFromText LineStringFromText PolyFromText PolygonFromText MPointFromText MultiPointFromText MLineFromText MultiLineStringFromText MPolyFromText PointFromWKB IsSimple NumPoints LineFromWKB IsValid PointN LineStringFromWKB Boundary Centroid PolyFromWKB Envelope Area PolygonFromWKB Expand ExteriorRing MPointFromWKB NPoints NumInteriorRing MultiPointFromWKB NRings NumInteriorRings MLineFromWKB Reverse InteriorRingN MultiLineStringFromWKB ForceLHR NumGeometries MPolyFromWKB SanitizeGeometry GeometryN MultiPolygonFromWKB CompressGeometry MbrEqual GeomCollFromWKB UncompressGeometry MbrDisjoint GeometryCollectionFromWK CastToPoint MbrTouches B BdPolyFromWKB CastToLinestring MbrWithin BdMPolyFromWKB CastToPolygon MbrOverlaps AsText CastToMultiPoint MbrIntersects AsWKT CastToMultiLinestring EnvelopesIntersects AsBinary CastToMultiPolygon MbrContains CastToGeometyCollecti AsSVG Equals on AsKml CastToMulti Disjoint GeomFromKml CastToSingle Touches AsGml CastToXY Within GeomFromGML CastToXYZ Overlaps AsGeoJSON CastToXYM Crosses GeomFromGeoJSON CastToXYZM Intersects AsEWKB X Contains GeomFromEWKB Y Covers AsEWKT Z CoveredBy GeomFromEWKT M Relate AsFGF StartPoint Distance GeomFromFGF EndPoint PtDistWithin Dimension Length Intersection CoordDimension Perimeter Difference MultiPolygonFromText NDims Geodesic Length GUnion SnapToGrid GeomCollFromText Is3D Great Circle Length GUnion GeoHash IsClosed SymDifference AsX3D FilterMbrWithin IsRing Buffer MaxDistance FilterMbrContains GARSMbr MbrMinX MbrMinY MbrMaxX MbrMaxY ST_MinZ MaxZ GeometryCollectionFromTe IsMeasured xt BdPolyFromText GeometryType BuildArea SwapCoords Polygonize UnaryUnion DissolveSegments DissolvePoints LinesFromRings SwapCoordinates InitSpatialMetaData InsertEpsgSrid AddGeometryColumn RecoverGeometryColumn LinesCutAtNodes DiscardGeometryColumn RingsCutAtNodes CollectionExtract LocateAlongMeasure LocateBetweenMeasures DelaunayTriangulation VoronojDiagram ConcaveHull MakeValid MakeValidDiscarded Segmentize Split SplitLeft SplitRight Azimuth RegisterVirtualGeometry DropVirtualGeometry CreateSpatialIndex CreateMbrCache DisableSpatialIndex CheckSpatialIndex RecoverSpatialIndex UpdateLayerStatistics CreateTopologyTables CheckSpatialMetaData AutoFDOStart AutoFDOStop InitFDOSpatialMetaData AddFDOGeometryColumn RecoverFDOGeometryColum n DiscardFDOGeometryColum n Using Spatialite in ArcMap • Read-only access was added at 10.2 • Can use geoprocessing tools with layers but with limitations • Using layers for geoprocessing input and output to different format seems to work pretty well. • Can write results to sqlite database, but pretty buggy at 10.2.1 • Recommend using as read-only access at current version • Cannot be published to ArcGIS Server • Cannot be edited through ArcMap DEMO • Spatialite functions • SQL in Spatialite GUI • View layers in ArcMap Spatialite GUI - Interpolated point along line - Use as midpoint ArcMap - Midpoints Spatialite GUI - Line offset - Geometry transformation inline function ArcMap - Line offset Spatialite GUI Single Sided Buffer Spatialite GUI Buffer ArcMap Single Sided Buffer ArcMap Single Sided Buffer vs Buffer Spatialite GUI - Convex Hull vs Concave Hull ArcMap - Convex Hull vs Concave Hull Convex Hull Concave Hull Using Spatialite in QGIS • Read/Write Access • Direct Editing of features • DBManager – Execute queries on SQLite database inside QGIS DEMO • Spatialite editing in QGIS • SQL in QGIS DB Manager Spatialite Editing -Connecting to Spatialite database Spatialite Editing -Creating new table SQL Query Editor Spatialite Editing -Add Geometry Column Spatialite Editing -Add new table to map Spatialite Editing -Editing new layer Spatialite Editing -Query new feature in Spatialite Spatialite Editing -View new feature in ArcMap QGIS Query Layer Single Sided Buffer QGIS Single Sided Buffer THE END QGIS Query Layer - DBManager spatial query and add to map QGIS Line offset QGIS – DBManager -Sql window, create new layer from sql query QGIS – DBManager -Sql window, create new layer from sql query -Subset of data based on ST_Intersects Resources SQLite: http://www.sqlite.org/ -File based relational database Spatialite: http://www.gaia-gis.it/gaia-sins/ -SQLite extension for gis functionality Geopackage: http://www.geopackage.org -OGC standard for exchange format GDAL: http://www.gdal.org/ -Set of libraries for ETL operations with multiple GIS formats QGIS: http://www.qgis.org/ -Open Source GIS application OSGeo4W: http://trac.osgeo.org/osgeo4w/ -Installer for suite of open source GIS software and tools GIS Spatialite GUI - Interpolated points along line - Geometry transformation inline function ArcMap - Interpolated points along line Spatialite GUI Delaunay Triangulation ArcMap Delaunay Triangulation