Upload
truongminh
View
221
Download
4
Embed Size (px)
Citation preview
Spatial Data: Cooler Than You’d Think Script
USE Breweries SELECT Geolocation as WKB, Geolocation.ToString() AS WKT, Geolocation.AsGml() AS GML from Breweries
-- Simple Example DECLARE @g Geometry SET @g = Geometry::STGeomFromText('LINESTRING(0 0,5 5)',0) SELECT @gSET @g = Geometry::Parse('LINESTRING(5 0,10 5)') SELECT @gSET @g = 'LINESTRING(10 0,15 5)'SELECT @gSET @g = 'POINT(2 2 4 45.5)' SELECT @gSELECT @g.STBuffer(.1)SELECT @g.STX,@g.STY,@g.Z,@g.M
-- Swiggly lineSELECT Geometry::STGeomFromText('LINESTRING (0 0,4 1, 0 2, 4 3, 0 4)',0)
-- More example with swiggly
DECLARE @g geometry DECLARE @p geometrySET @g = 'LINESTRING(0 0,4 1, 0 2, 4 3, 0 4)'SET @p = 'POINT(4 4)'select @gselect @pSELECT @g.STEnvelope() -- .ToString() SELECT @g.STBuffer(1) -- .ToString()SELECT @p.STBuffer(1)
-- Working with different types
DECLARE @g Geometry DECLARE @p Geometry
SET @g='POLYGON((2 2,2 6,6 6,6 2,2 2))'
SET @p='LINESTRING(0 0,8 8)'
SELECT @gSELECT @pSELECT @p.STDifference(@g)SELECT @p.STIntersection(@g)SELECT @g.STUnion(@p)
-- One for geography DECLARE @g geography DECLARE @p geography SET @g='POINT(122.3333 47.6167)' SET @p='POINT(13.4167 52.5)' select @g.STDistance(@p)
--New in SQL Server 2012 --Lenni Lobel blog example -- Create a "straight" circular line SELECT geometry::Parse('CIRCULARSTRING(0 8, 4 0, 8 -8)').STBuffer(.1) UNION ALL -- Curve it SELECT geometry::Parse('CIRCULARSTRING(0 8, 4 4, 8 -8)').STBuffer(.1) UNION ALL -- Curve it some more SELECT geometry::Parse('CIRCULARSTRING(0 8, 4 6, 8 -8)').STBuffer(.1) UNION ALL -- Curve it in the other direction SELECT geometry::Parse('CIRCULARSTRING(0 8, 4 -5, 8 -8)').STBuffer(.1)
DECLARE @g1 geometry = 'COMPOUNDCURVE EMPTY';DECLARE @g2 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 0, 0 1, -1 0), (-1 0, 2 0))';DECLARE @g3 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 1, 1 1, 1 1), (1 1, 3 5, 5 4))';select @g1.STBuffer(.1)select @g2.STBuffer(.1)select @g3.STBuffer(.1)SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();
--CURVEPOLYGON exterior ringDECLARE @g geometry;SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');select @g
--CURVEPOLYGON inner and exterior ringDECLARE @i geometry;SET @i = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 4, 4 0, 8 4, 4 8, 0 4), CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');
select @i
--BufferWithCurves--Lenni Lobel blog example DECLARE @squiggle geometry = 'CIRCULARSTRING(0 0,4 1, 0 2, 4 3, 0 4)'SELECT @squiggle.BufferWithCurves(.1)SELECT @squiggle.STBuffer(.1)
SELECT AsWKT = @squiggle.ToString(), Bytes = DATALENGTH(@squiggle), Points = @squiggle.STNumPoints() UNION ALL SELECT @squiggle.STBuffer(10).ToString(), DATALENGTH(@squiggle.STBuffer(10)), @squiggle.STBuffer(10).STNumPoints() UNION ALL SELECT @squiggle.BufferWithCurves(10).ToString(), DATALENGTH(@squiggle.BufferWithCurves(10)), @squiggle.BufferWithCurves(10).STNumPoints()
--ShortestLineTo--Lenni Lobel blog example DECLARE @Shape1 geometry = 'POLYGON ((-20 -30, -3 -26, 14 -28, 20 -40, -20 -30))'DECLARE @Shape2 geometry = 'POLYGON ((-18 -20, 0 -10, 4 -12, 10 -20, 2 -22, -18 -20))' SELECT @Shape1UNION ALLSELECT @Shape2UNION ALLSELECT @Shape1.ShortestLineTo(@Shape2).STBuffer(.25)SELECT @Shape1.ShortestLineTo(@Shape2).ToString();
USE ShapefileExampleselect * from TNShapeFile
--****************************demo queriesUse Breweriesselect * from BreweriesDemo
ALTER TABLE dbo.BreweriesDemo ADD [Geolocation] Geography GO
UPDATE [dbo].[BreweriesDemo]SET [Geolocation] = geography::STGeomFromText ('POINT (' + CAST ([Longitude] AS VARCHAR (20)) + ' ' + CAST ([Latitude] AS VARCHAR (20)) + ')', 4326)
--*****************************SRID reference for STDistance
declare @spatrefid as int = 4326 select unit_of_measure from sys.spatial_reference_systems where spatial_reference_id = @spatrefid
select * from sys.spatial_reference_systems