Have you ever wanted to track the position of the International Space Station using SQL Geography Datatypes? Have you ever wanted to write a mobile app that helps your sales reps track down the closest customer in a trade show?
The SQL Server Geography datatype can help you accomplish these business objectives with some case studies from Jared Nielsen of the FUZION Agency
2. GEOGRAPHY vs GEOMETRY
Geography
Plots ellipsoidal
“Round Earth”
data using
latitude, longitude
and altitude*
coordinates
Geometry
Plots polygonal,
geometric and
linear data using X,
Y and Z*
coordinates
* not implemented well
5. World Geodetic System
Global standards body that defines the
coordinate systems for Earth
The latest revision is WGS 84 - referred to
as EPSG:4326
www.NGA.mil
6. EPSG: 4326
This geodetic standard is specified in
many geography datatype queries:
UPDATE SQLDevelopers
SET GeoPosition = geography::
Point(29.5786422, -95.2049992, 4326)
8. Well Known Text - WKT
www.NGA.mil
Type Example Convert to Spatial
Point Point(x,y) .STPointFromText()
MultiPoint MultiPoint( (x,y), (x,y) ) .STMPointFromText()
LineString LineString( x y, x y, x y) .STLineFromText()
MultiLineString MultiLineString( (x y, x y) (x y, x y) ) .STMLineFromText()
Polygon Polygon ( (x1 y1, x2 y2, x3 y3, x1 y1) ) .STPolyFromText()
MultiPolygon You get the idea… Keep using those
parenthesis…
.STMPolyFromText()
9. How LONG is your LAT?
Sometimes you should use LON/LAT (WKT)
Other times you need to use LAT/LON (SQL)
LAT LON
San Jacinto College = 29.578, -95.204
SET GeoPosition = geography::
STGeomFromText('POINT(-95.204 29.578)', 4326)
SET GeoPosition = geography::
Point(29.578, -95.204 , 4326)
10. Get Some Data
Positions for the International Space Station:
http://sscweb.gsfc.nasa.gov/cgi-bin/Locator.cgi
Global Country Maps:
http://www.vdstech.com/world-data.aspx
Zip Codes, School Districts, Demographics:
http://www.data.gov
Railroads, Rivers, Cities, Volcanoes:
http://webgis.wr.usgs.gov/globalgis/datasets.htm
11. ESRI Shapefile Converters
Convert ESRI Shapefiles to SQL Geography:
http://www.sharpgis.net/page/Shape2SQL
Queries SQL Geography to a Map:
http://www.sharpgis.net/page/SqlSpatial-Query-Tool
ESRI Metadata Translation:
http://resources.esri.com/help/9.3/ArcGISEngine/java
/gp_toolref/conversion_tools/esri_metadata_translator
_conversion_.htm
13. Making a Table
CREATE TABLE dbo.ISSPosition(
Longitude decimal(18, 15) NULL,
Latitude decimal(18, 15) NULL,
Sampled datetime NULL,
LocalTime nvarchar(50) NULL,
GeoPosition geography NULL,
GeomShape geometry NULL
)
14. Loading Data
INSERT INTO ISSPosition
(Sampled, Longitude, Latitude, LocalTime)
VALUES
('01/01/2015 00:00:00',-125.4,41,'15:38:18’)
Naturally I loaded more data … one data
point per minute from January 1 to present
It turns out that the Space Station falls fast at
17,136 mph
15. Convert to Geography
UPDATE ISSPosition
SET GeoPosition = geography::
Point([Latitude], [Longitude], 4326)
GO
(note we are using the native SQL Point
method so we keep LAT/LON)
16. Query our Data
select top 180 * from dbo.ISSPosition
Not the most thrilling outcome…
Let’s try the Spatial Results Tab…
18. Space Station Orbit
select top 180 * from dbo.ISSPosition order
by Sampled
Now we are getting somewhere!
19. Comma Delimited Points
DECLARE @ISSOrbitWKT nvarchar(max)
SELECT @ISSOrbitWKT =
STUFF((SELECT TOP 180 ',' +
Convert(nvarchar(25),Longitude) + ' ' +
Convert(nvarchar(25),Latitude)
FROM dbo.ISSPosition
ORDER BY Sampled
FOR XML PATH('')) ,1,1,'')
20. Convert Points to LineStrings
DECLARE @ISSOrbit geography
SET @ISSOrbit =
geography::STLineFromText('LINESTRING('
+@ISSOrbitWKT+')',4326)
22. Space Station Orbit
CREATE TABLE CoolShapes(
Name Nvarchar(100) NOT NULL,
GeoShape geography NULL)
GO
INSERT into CoolShapes (Name, GeoShape)
values (‘ISS Orbital Path’,@ISSOrbit)
I like this shape so much I’m going to keep
a copy of it
25. Load Global Maps
select @ISSOrbit union all select GeoMap
from dbo.world
With a UNION, we simply plot the orbit on
the Global ESRI Shapefile Map
http://www.vdstech.com/world-data.aspx
27. Spatial Methods
www.NGA.mil
Type Example Syntax
Buffer @IISOrbit.STBuffer(75000) .STBuffer(radius)
Intersect @IISOrbit.STIntersection(@China) .STIntersection(object)
Distance @China.STDistance(@Guatemala) .STDistance(object)
Crosses @IISOrbit.Crosses(@China) .STCrosses(object)
Within @SQLDeveloper.STWithin(@SanJac
intoCollege.STBuffer(4000))
.STWithin(object)
Contains @SanJacintoCollege.STContains(
@Jared)
.STContains(object)
28. STIntersection Method
SELECT @ISSOrbit UNION ALL SELECT GeoMap
FROM World WHERE Name='China'
A human knows that the orbit crosses China, but
how do we tell the computers?
http://www.vdstech.com/world-data.aspx
32. Can Your Sales Rep See the
Customer at a Trade Show?
San Jacinto College
33. Make Some Developers
insert into SQLDevelopers (Name, Latitude, Longitude,
Altitude) values ('Jared Nielsen Dark Matter', 29.5786422, -
95.2049992, 15)
insert into SQLDevelopers (Name, Latitude, Longitude,
Altitude) values ('Jared Nielsen', 29.5786422, -95.2049992,
15)
insert into SQLDevelopers (Name, Latitude, Longitude,
Altitude) values ('Nancy Hidy Wilson', 29.578, -95.2049, 14)
insert into SQLDevelopers (Name, Latitude, Longitude,
Altitude) values ('Robert Gremillion', 29.5552929,-
95.1133171,16)
UPDATE SQLDevelopers
SET GeoPosition = geography::Point([Latitude], [Longitude],
4326)
GO
http://www.vdstech.com/world-data.aspx
34. Enter Tradeshow Location
ALTER TABLE CoolShapes ADD
GeoPosition geography NULL
GO
INSERT INTO CoolShapes (Name,
GeoPosition)
VALUES ('San Jacinto College',
geography::Point(29.5786422, -
95.2049992, 4326))
http://www.vdstech.com/world-data.aspx
35. STIntersection Method
One Developer is Not Attending
http://www.vdstech.com/world-data.aspx
SELECT GeoPosition.STBuffer(100) FROM
CoolShapes WHERE Name='San Jacinto College'
UNION ALL
SELECT GeoPosition.STBuffer(30) FROM
SQLDevelopers
36. STIntersection Method
Who else is here?
http://www.vdstech.com/world-data.aspx
SELECT GeoPosition.STBuffer(100) FROM
CoolShapes WHERE Name='San Jacinto College'
UNION ALL
SELECT GeoPosition.STBuffer(30) FROM
SQLDevelopers WHERE NAME NOT IN ('Robert
Gremillion')
37. More Methods
http://www.vdstech.com/world-data.aspx
DECLARE @Jared geography
DECLARE @Robert geography
DECLARE @Nancy geography
DECLARE @SanJAC Geography
DECLARE @JaredGhost geography
SELECT @Jared = GeoPosition.STBuffer(5) FROM SQLDevelopers WHERE
Name = 'Jared Nielsen'
SELECT @Robert = Geoposition.STBuffer(5) from SQLDevelopers WHERE
Name='Robert Gremillion'
SELECT @Nancy = Geoposition.STBuffer(5) from SQLDevelopers wHERE
Name LIKE 'Nancy%'
SELECT @SanJAC = Geoposition.STBuffer(100) from CoolShapes WHERE
Name = 'San Jacinto College'
SELECT @JaredGhost = Geoposition.STBuffer(2) from SQLDevelopers
WHERE Name = 'Jared Nielsen Dark Matter’
38. More Methods
Can your sales rep see the customer?
http://www.vdstech.com/world-data.aspx
SELECT @Jared.STWithin(@SanJAC) = Boolean True
SELECT @SanJAC.STContains(@Robert) = Boolean False
SELECT @Jared.STDistance(@Nancy) = 61.832 meters
Declare @SalesRepVisualPerimeter geography
SELECT @SalesRepVisualPerimeter = @Jared.STBuffer(10)
Declare @VisualRecognitionPerimeter geography
SELECT @VisualRecognitionPerimeter=
@Nancy.STBuffer(60)