<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Isaac @ MSDN</title><subtitle type="html" /><id>http://blogs.msdn.com/isaac/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/isaac/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/isaac/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2008-10-09T16:49:27Z</updated><entry><title>The Sphere is Finite</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/isaac/archive/2009/07/09/the-sphere-is-finite.aspx" /><id>http://blogs.msdn.com/isaac/archive/2009/07/09/the-sphere-is-finite.aspx</id><published>2009-07-09T17:18:20Z</published><updated>2009-07-09T17:18:20Z</updated><content type="html">&lt;p&gt;Hi Folks,&lt;/p&gt;  &lt;p&gt;The title of this post states the obvious: the area of a sphere is finite.&amp;#160; We even have a nice formula for it, 4πr&lt;sup&gt;2&lt;/sup&gt;.&amp;#160; The same is true for an ellipsoid, which is just a sat-upon sphere, although computing the area gets more &lt;a href="http://mathworld.wolfram.com/Ellipsoid.html"&gt;complicated&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;But the plane is infinite.&amp;#160; If we combine this with the fact that the OGC (implicitly) assumes that all geometry objects have a finite area, then any OGC-valid geometry has exactly one reasonable interpretation.&amp;#160; If I ask you to fill in this polygon:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheSpherehasaFiniteArea_BBED/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheSpherehasaFiniteArea_BBED/image_thumb.png" width="262" height="263" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You have only one reasonable choice:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheSpherehasaFiniteArea_BBED/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheSpherehasaFiniteArea_BBED/image_thumb_1.png" width="263" height="264" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Not:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheSpherehasaFiniteArea_BBED/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheSpherehasaFiniteArea_BBED/image_thumb_3.png" width="264" height="265" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You can’t reasonably give me the latter one, since it would have an infinite area.&lt;/p&gt;  &lt;p&gt;But since the sphere already has a finite area, a ring like this on the sphere just cuts it into two finite areas.&amp;#160; So if I ask you to fill in this box:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheSpherehasaFiniteArea_BBED/image_10.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheSpherehasaFiniteArea_BBED/image_thumb_4.png" width="374" height="367" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You have a problem, since you don’t know for sure what I mean: do I want you to fill the portion containing the United States, or the part containing the rest of the world?&amp;#160; The request is underspecified.&lt;/p&gt;  &lt;p&gt;We fix this by using orientation, which I’ll discuss next time.&lt;/p&gt;  &lt;p&gt;Cheers,   &lt;br /&gt;-Isaac&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9827198" width="1" height="1"&gt;</content><author><name>isaac</name><uri>http://blogs.msdn.com/members/isaac.aspx</uri></author></entry><entry><title>New Stuff in SQL Spatial Tools</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/isaac/archive/2009/06/02/new-stuff-in-sql-spatial-tools.aspx" /><id>http://blogs.msdn.com/isaac/archive/2009/06/02/new-stuff-in-sql-spatial-tools.aspx</id><published>2009-06-02T20:40:19Z</published><updated>2009-06-02T20:40:19Z</updated><content type="html">&lt;p&gt;Hi Folks,&lt;/p&gt;  &lt;p&gt;Marko Tintor from our Serbia team just dropped some new functionality into the &lt;a href="http://sqlspatialtools.codeplex.com/"&gt;SQL Server Spatial Tools&lt;/a&gt; project on CodePlex:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A method for testing whether a geography instance is valid. &lt;/li&gt;    &lt;li&gt;Better: a method for creating a valid geography from invalid input.&amp;#160; How this works deserves a post on of its own, but it basically uses the technique I suggested in &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/sqlspatial/thread/d0964a39-e402-4dd5-bf78-3701eb68268e"&gt;this forum thread&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;Methods for creating convex hulls in geography. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Enjoy!    &lt;br /&gt;-Isaac&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9686784" width="1" height="1"&gt;</content><author><name>isaac</name><uri>http://blogs.msdn.com/members/isaac.aspx</uri></author></entry><entry><title>The Plane, the Sphere, and the Ellipsoid</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/isaac/archive/2009/06/01/the-plane-the-sphere-and-the-ellipsoid.aspx" /><id>http://blogs.msdn.com/isaac/archive/2009/06/01/the-plane-the-sphere-and-the-ellipsoid.aspx</id><published>2009-06-01T21:00:00Z</published><updated>2009-06-01T21:00:00Z</updated><content type="html">&lt;p&gt;Hi Folks,&lt;/p&gt;  &lt;p&gt;We all know that the sphere isn’t the plane, and that an ellipsoid is different as well, but I don’t know if everyone has given so much thought to the practical effects of these differences.&lt;/p&gt;  &lt;p&gt;And so I thought it might be a nice idea to catalog some of the interesting things that change when we move from a flat to round model—and it also makes a nice new series for the blog.&amp;nbsp; My planned agenda is:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://blogs.msdn.com/isaac/archive/2008/05/03/edges-on-the-globe.aspx" mce_href="http://blogs.msdn.com/isaac/archive/2008/05/03/edges-on-the-globe.aspx"&gt;Edges on the Ellipsoid aren’t Obvious&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/isaac/archive/2009/07/09/the-sphere-is-finite.aspx" mce_href="http://blogs.msdn.com/isaac/archive/2009/07/09/the-sphere-is-finite.aspx"&gt;The Sphere is Finite&lt;/a&gt;… &lt;/li&gt;    &lt;li&gt;… So Orientation Matters on the Sphere… &lt;/li&gt;    &lt;li&gt;…And yet, Maybe not so Much &lt;/li&gt;    &lt;li&gt;Some Sensible Concepts Are Nonsense on the Sphere &lt;/li&gt;    &lt;li&gt;Bounding Boxes on the Sphere are Strange &lt;/li&gt;    &lt;li&gt;Funny Things Happen to Convex Polygons &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I’ll keep this list up to date with links as they bake.&amp;nbsp; &lt;/p&gt;  &lt;p&gt;As you can see, I get off easy on the first post: I wrote it some time ago.&amp;nbsp; I’ve also started to &lt;a href="http://blogs.msdn.com/isaac/archive/2007/10/29/geography-and-ring-orientation.aspx" mce_href="http://blogs.msdn.com/isaac/archive/2007/10/29/geography-and-ring-orientation.aspx"&gt;touch on&lt;/a&gt; the next few topics, but I think there’s more to say.&amp;nbsp; I’ll be scrounging some material from my PDC talk last year, but there should be some new goodies as well.&lt;/p&gt;  &lt;p&gt;Cheers,    &lt;br&gt;-Isaac&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9682191" width="1" height="1"&gt;</content><author><name>isaac</name><uri>http://blogs.msdn.com/members/isaac.aspx</uri></author></entry><entry><title>SQL Server Spatial Indexing</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/isaac/archive/2009/05/28/sql-server-spatial-indexing.aspx" /><id>http://blogs.msdn.com/isaac/archive/2009/05/28/sql-server-spatial-indexing.aspx</id><published>2009-05-28T14:58:49Z</published><updated>2009-05-28T14:58:49Z</updated><content type="html">&lt;p&gt;Hi Folks,&lt;/p&gt;  &lt;p&gt;This post contains no new information; it’s just a rollup of links to spatial indexing posts I’ve made.&amp;#160; If you want to know more about spatial indexing, these are the ones to read.&lt;/p&gt;  &lt;p&gt;In order:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://blogs.msdn.com/isaac/archive/2007/11/24/spatial-indexing-part-1-why-a-spatial-index.aspx"&gt;Why a Spatial Index?&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/isaac/archive/2007/11/27/spatial-indexing-part-2-a-simple-spatial-indexing-scheme.aspx"&gt;A Simple Spatial Indexing Scheme&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/isaac/archive/2007/12/01/spatial-indexing-part-3-faster-primary-filtering.aspx"&gt;Faster Primary Filtering&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/isaac/archive/2008/02/05/picking-up-on-indexing-moving-beyond-the-simple-grid.aspx"&gt;Picking up on Indexing: Moving Beyond the Simple Grid&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/isaac/archive/2008/03/01/basic-multi-level-grids.aspx"&gt;Basic Multi-Level Grids&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/isaac/archive/2008/04/08/more-on-the-multi-level-grid.aspx"&gt;More on the Multi-Level Grid&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/isaac/archive/2008/08/29/is-my-spatial-index-being-used.aspx"&gt;Is my spatial index being used?&lt;/a&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Hmm… it looks like I never got around to the specific of the geography index.&amp;#160; It’s in the queue now.&lt;/p&gt;  &lt;p&gt;Cheers,   &lt;br /&gt;-Isaac&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9647392" width="1" height="1"&gt;</content><author><name>isaac</name><uri>http://blogs.msdn.com/members/isaac.aspx</uri></author></entry><entry><title>London Spatial Event</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/isaac/archive/2009/04/09/london-spatial-event.aspx" /><id>http://blogs.msdn.com/isaac/archive/2009/04/09/london-spatial-event.aspx</id><published>2009-04-09T16:09:28Z</published><updated>2009-04-09T16:09:28Z</updated><content type="html">&lt;p&gt;&lt;a href="http://www.sqlblogcasts.com/blogs/simons/"&gt;Simon Sabin&lt;/a&gt; asked me to pass along information about a &lt;em&gt;free&lt;/em&gt; spatial event that he and &lt;a href="http://johanneskebeck.spaces.live.com/"&gt;Johannes Kebeck&lt;/a&gt; are holding in London on the 16th.&amp;#160; It looks like they’ll be covering a bunch of hot SQL Server Spatial topics: how to get your data in to SQL, how to get your data out and visualize it, and how to make best use of spatial indexes.&lt;/p&gt;  &lt;p&gt;Actually, they’re holding it twice: once in the &lt;a href="http://sqlserverfaq.com/events/154/Using-Spatial-Data-in-SQL-Server-and-Virtual-Earth-Afternoon.aspx"&gt;afternoon&lt;/a&gt;, and again in the &lt;a href="http://sqlserverfaq.com/events/155/Using-Spatial-Data-in-SQL-Server-and-Virtual-Earth-Evening-Event.aspx"&gt;evening&lt;/a&gt;.&amp;#160; Follow those links to sign up.&lt;/p&gt;  &lt;p&gt;It looks like it should be a good meeting.&lt;/p&gt;  &lt;p&gt;Cheers,   &lt;br /&gt;-Isaac&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9540564" width="1" height="1"&gt;</content><author><name>isaac</name><uri>http://blogs.msdn.com/members/isaac.aspx</uri></author></entry><entry><title>The Spatial Library without the Server: Bug and Workaround</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/isaac/archive/2009/02/24/the-spatial-library-without-the-server-bug-and-workaround.aspx" /><id>http://blogs.msdn.com/isaac/archive/2009/02/24/the-spatial-library-without-the-server-bug-and-workaround.aspx</id><published>2009-02-24T01:40:20Z</published><updated>2009-02-24T01:40:20Z</updated><content type="html">&lt;p&gt;Hi Folks,&lt;/p&gt;  &lt;p&gt;&lt;a href="http://jasonfollas.com/blog/archive/2009/02/21/knowledge-4.aspx"&gt;Jason Follas&lt;/a&gt; recently ran across a &lt;a href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=355402&amp;amp;wa=wsignin1.0"&gt;lingering issue&lt;/a&gt; when using our spatial library without the server.&amp;#160; I mistakenly thought the fix had been shipped, but for now it remains.&lt;/p&gt;  &lt;p&gt;The background is that the spatial library consists of a managed part and a native part.&amp;#160; Roughly, the core geometry library resides in the native code, and everything else is in the managed layer.&amp;#160; The native code requires the C++ runtime libraries.&amp;#160; This is installed with SQL Server, so everything works fine if you install SQL.&amp;#160; &lt;/p&gt;  &lt;p&gt;The redistributable version we ship as part of the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=228de03f-3b5a-428a-923f-58a033d316e1&amp;amp;DisplayLang=en"&gt;feature pack&lt;/a&gt;&amp;#160;&lt;em&gt;should &lt;/em&gt;redistribute the runtime as well, but it doesn’t.&amp;#160; That’s the bug.&amp;#160; So, if you install the library on a machine without the runtime, then it will fail.&lt;/p&gt;  &lt;p&gt;The workaround is simple: install &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&amp;amp;displaylang=en"&gt;the runtime&lt;/a&gt; manually.&amp;#160; Annoying, but effective.&amp;#160; You’ll also be fine if you install another package—like the SQL Native Client—that includes the runtime, but unless you also want that component, I’d stick with the stand-alone install.&lt;/p&gt;  &lt;p&gt;SP1 for SQL Server 2008 is coming up, but unfortunately, we’ve missed the cutoff to get this in.&amp;#160; We’ll try to get this into the next service pack, but that will take some time.&amp;#160; In the meantime, you’ll have to use this workaround.&amp;#160; I’ll try to get an official KB article published on this as well.&lt;/p&gt;  &lt;p&gt;So, apologies for the inconvenience.&amp;#160; And thanks to Jason for raising the issue.&lt;/p&gt;  &lt;p&gt;Cheers,   &lt;br /&gt;-Isaac&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9442022" width="1" height="1"&gt;</content><author><name>isaac</name><uri>http://blogs.msdn.com/members/isaac.aspx</uri></author></entry><entry><title>The Geography Hemisphere Limitation</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/isaac/archive/2009/02/06/the-geography-hemisphere-limitation.aspx" /><id>http://blogs.msdn.com/isaac/archive/2009/02/06/the-geography-hemisphere-limitation.aspx</id><published>2009-02-06T19:08:46Z</published><updated>2009-02-06T19:08:46Z</updated><content type="html">&lt;p&gt;Hi Folks,&lt;/p&gt;  &lt;p&gt;It occurs to me that I haven’t posted anything about the hemisphere limitation for the SQL Server geography type.&amp;#160; This limitation is a little confusing, and could probably use some clarification.&lt;/p&gt;  &lt;p&gt;It also occurs to me that I haven’t posted anything in a while—let’s rectify both of these.&lt;/p&gt;  &lt;p&gt;We usually express SQL Server’s limitation by saying that no object can exceed a hemisphere.&amp;#160; But which hemisphere?&amp;#160; Does this mean that objects cannot cross the equator?&amp;#160; The international date line?&amp;#160; The truth: neither.&amp;#160; We can, in fact, generate objects that cross the equator:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Consolas"&gt;POLYGON ((-145 -45, -55 -45, -55 45, -145 45, -145 -45))&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheGeographyHemisphereLimitation_7200/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheGeographyHemisphereLimitation_7200/image_thumb.png" width="520" height="262" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Or the date line:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Consolas"&gt;POLYGON ((135 0, -135 0, -135 90, 135 90, 135 0))&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheGeographyHemisphereLimitation_7200/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheGeographyHemisphereLimitation_7200/image_thumb_1.png" width="520" height="260" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Or the poles:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Consolas"&gt;POLYGON ((0 45, 90 45, 180 45, 270 45, 0 45))&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheGeographyHemisphereLimitation_7200/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheGeographyHemisphereLimitation_7200/image_thumb_2.png" width="520" height="257" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This illustrates that it is not objects in certain positions that are disallowed.&amp;#160; Rather, &lt;em&gt;large &lt;/em&gt;objects are disallowed: if an object spans more than half the globe, SQL Server will complain.&amp;#160; So while a polygon that sits slightly inside of a hemisphere is fine:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Consolas"&gt;POLYGON ((0 1, 90 1, 180 1, 270 1, 0 1))&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheGeographyHemisphereLimitation_7200/image_8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheGeographyHemisphereLimitation_7200/image_thumb_3.png" width="520" height="260" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;One that is slightly larger causes problems:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Consolas"&gt;POLYGON ((0 -1, 90 -1, 180 -1, 270 -1, 0 -1))&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#ff0000"&gt;Msg 6522, Level 16, State 1, Line 1        &lt;br /&gt;A .NET Framework error occurred during execution of user-defined routine or aggregate &amp;quot;geography&amp;quot;:         &lt;br /&gt;Microsoft.SqlServer.Types.GLArgumentException: 24205: The specified input does not represent a valid geography instance because it exceeds a single hemisphere. Each geography instance must fit inside a single hemisphere. A common reason for this error is that a polygon has the wrong ring orientation.         &lt;br /&gt;Microsoft.SqlServer.Types.GLArgumentException:         &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.SqlServer.Types.GLNativeMethods.ThrowExceptionForHr(GL_HResult errorCode)         &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.SqlServer.Types.GLNativeMethods.GeodeticIsValid(GeoData g)         &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.SqlServer.Types.SqlGeography.IsValidExpensive()         &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.SqlServer.Types.SqlGeography.ConstructGeographyFromUserInput(GeoData g, Int32 srid)         &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType type, SqlChars taggedText, Int32 srid)         &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.SqlServer.Types.SqlGeography.STGeomFromText(SqlChars geometryTaggedText, Int32 srid)         &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.SqlServer.Types.SqlGeography.Parse(SqlString s)         &lt;br /&gt;.&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;We can dig a little deeper.&amp;#160; When SQL Server sees a geography instance, it computes a &lt;em&gt;bounding cap &lt;/em&gt;for it.&amp;#160; This is very much like a bounding box on the plane, but is defined by a center point and an angle.&amp;#160; We can actually find the bounding cap for an object using the EnvelopeCenter() and EnvelopeAngle() methods on geography.&amp;#160; Using these, we can plot the cap.&amp;#160; For example:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Consolas"&gt;POLYGON ((-50 -10, 50 -10, 50 10, -50 10, -50 -10))&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheGeographyHemisphereLimitation_7200/image_10.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheGeographyHemisphereLimitation_7200/image_thumb_4.png" width="520" height="257" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;If the cap angle exceeds 90 degrees, then the object exceeds a hemisphere.&amp;#160; The cap computed above has an angle of 50.7 degrees.&lt;/p&gt;  &lt;p&gt;But there is some subtlety in how SQL Server determines this cap.&amp;#160; The angle is relatively simple: it is the maximum angle from the center to any of the points in the figure, yielding a minimal cap &lt;em&gt;with that center&lt;/em&gt;.&amp;#160; The center, however, is determined by summing the vectors from the center of the globe to each vertex in the figure, essentially averaging the vertices.&amp;#160; This means that if the points in our figure are lopsided—e.g., if add more points on the eastern edge—we will compute a cap that no longer looks very minimal:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Consolas"&gt;POLYGON ((-50 -10, 50 -10, 50 -5, 50 0, 50 5, 50 10, -50 10, -50 -10))&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheGeographyHemisphereLimitation_7200/image_12.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/isaac/WindowsLiveWriter/TheGeographyHemisphereLimitation_7200/image_thumb_5.png" width="520" height="273" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now the cap center is skewed, so the angle has to increase—to 77.4 degrees—to contain the object.&amp;#160; If we add more points on the eastern edge we get into trouble:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Consolas"&gt;POLYGON ((-50 -10, 50 -10, 50 -8, 50 -6, 50 -5 50 -4, 50 -2, 50 0, 50 2, 50 4, 50 5, 50 6, 50 8, 50 10, -50 10, -50 -10))&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#ff0000"&gt;Msg 6522, Level 16, State 1, Line 1        &lt;br /&gt;A .NET Framework error occurred during execution of user-defined routine or aggregate &amp;quot;geography&amp;quot;:         &lt;br /&gt;Microsoft.SqlServer.Types.GLArgumentException: 24205: The specified input does not represent a valid geography instance because it exceeds a single hemisphere. Each geography instance must fit inside a single hemisphere. A common reason for this error is that a polygon has the wrong ring orientation.         &lt;br /&gt;Microsoft.SqlServer.Types.GLArgumentException:         &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.SqlServer.Types.GLNativeMethods.ThrowExceptionForHr(GL_HResult errorCode)         &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.SqlServer.Types.GLNativeMethods.GeodeticIsValid(GeoData g)         &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.SqlServer.Types.SqlGeography.IsValidExpensive()         &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.SqlServer.Types.SqlGeography.ConstructGeographyFromUserInput(GeoData g, Int32 srid)         &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType type, SqlChars taggedText, Int32 srid)         &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.SqlServer.Types.SqlGeography.STGeomFromText(SqlChars geometryTaggedText, Int32 srid)         &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.SqlServer.Types.SqlGeography.Parse(SqlString s)         &lt;br /&gt;.&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So although our object hasn’t changed—the extra vertices we added were chosen so they don’t change the shape—SQL Server now thinks we’ve exceeded a hemisphere.&lt;/p&gt;  &lt;p&gt;Let me answer two more obvious questions.&amp;#160; First: why do we compute caps this way instead of computing a true minimal bounding cap?&amp;#160; It turns out that finding a minimal cap is difficult computationally, and because this operation happens a lot, we need something cheap.&lt;/p&gt;  &lt;p&gt;Second: why does SQL Server have the hemisphere limitation at all?&amp;#160; A complete answer will require another post.&amp;#160; Suffice to say, it’s an implementation artifact that the SQL Server team absolutely abhors.&amp;#160; That SQL Server isn’t the only system with such a limitation doesn’t make it any less annoying, and removing the limit is high on everyone’s priorities.&lt;/p&gt;  &lt;p&gt;Cheers,    &lt;br /&gt;-Isaac&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9402737" width="1" height="1"&gt;</content><author><name>isaac</name><uri>http://blogs.msdn.com/members/isaac.aspx</uri></author></entry><entry><title>Good Spatial Blog Resources</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/isaac/archive/2008/12/11/good-spatial-blog-resources.aspx" /><id>http://blogs.msdn.com/isaac/archive/2008/12/11/good-spatial-blog-resources.aspx</id><published>2008-12-11T10:20:00Z</published><updated>2008-12-11T10:20:00Z</updated><content type="html">&lt;p&gt;Hi Folks,&lt;/p&gt;  &lt;p&gt;While I continue to procrastinate, here are some excellent spatial resources to peruse.&lt;/p&gt;  &lt;p&gt;First, David Lean, a Microsoft evangelist, has very comprehensive list of spatial posts over on his &lt;a href="http://blogs.msdn.com/davidlean/archive/tags/SQL+Server+Spatial/default.aspx"&gt;Dave does Data&lt;/a&gt; blog.&amp;#160; He covers a wide range of spatial methods, the builder/sink API, as well as some pointers on creating spatial applications.&lt;/p&gt;  &lt;p&gt;Second, John O’Brien, a Microsoft MVP, has a couple articles (&lt;a href="http://www.sql-server-performance.com/articles/dev/Powerful_Geographical_Visualisations_SQL_2008_Spatial_Part1_p1.aspx"&gt;here&lt;/a&gt; and &lt;a href="http://www.sql-server-performance.com/articles/dev/Powerful_Geographical_Visualisations_SQL_2008_Spatial_Part2_p1.aspx"&gt;here&lt;/a&gt;) showing how to do some cool data visualization right in Management Studio.&lt;/p&gt;  &lt;p&gt;Finally, &lt;a href="http://johanneskebeck.spaces.live.com/"&gt;Johannes Kebeck&lt;/a&gt; continues with a couple recent posts on creating maps in Virtual Earth based on data coming from SQL Server.&lt;/p&gt;  &lt;p&gt;Enjoy!    &lt;br /&gt;-Isaac&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9197699" width="1" height="1"&gt;</content><author><name>isaac</name><uri>http://blogs.msdn.com/members/isaac.aspx</uri></author></entry><entry><title>Puzzle Solution</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/isaac/archive/2008/12/08/puzzle-solution.aspx" /><id>http://blogs.msdn.com/isaac/archive/2008/12/08/puzzle-solution.aspx</id><published>2008-12-08T18:33:21Z</published><updated>2008-12-08T18:33:21Z</updated><content type="html">&lt;p&gt;&lt;a href="http://blogs.msdn.com/isaac/archive/2008/12/05/pdc-and-a-nice-geographic-puzzle.aspx"&gt;Last time&lt;/a&gt;, I posted a question sent to me by Rob Mount.&amp;#160; So what solutions exist other than the north pole?&lt;/p&gt;  &lt;p&gt;You did well: jnelso99 got part of the way there; tanoshimi finished it off.&amp;#160; We can find a set of circles around the south pole with lengths of 1/&lt;em&gt;N&lt;/em&gt; miles: 1 mile, 1/2 mile, 1/3 mile, etc.&amp;#160; Any point one mile north of any of these circles will work: you travel south one mile to one of the circles, circle the earth &lt;em&gt;N &lt;/em&gt;times, and then head back north to where you started.&lt;/p&gt;  &lt;p&gt;Where exactly are these circles?&amp;#160; Well, let’s be a bit mathematical about it.&amp;#160; Let &lt;em&gt;R&lt;/em&gt; be the radius of the earth, and let &lt;em&gt;x &lt;/em&gt;be the distance of each leg of our path.&amp;#160; Working in radians, let &lt;em&gt;p0&lt;/em&gt; = (&lt;em&gt;lat&lt;/em&gt;, &lt;em&gt;long&lt;/em&gt;) be our starting point.&amp;#160; (Radians just make the math so much nicer.)&lt;/p&gt;  &lt;p&gt;First we walk&lt;em&gt; &lt;/em&gt;south &lt;em&gt;x &lt;/em&gt;units.&amp;#160; This only changes the latitude, and so we find ourselves at a new point:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;p1&lt;/em&gt; = (&lt;em&gt;lat&lt;/em&gt; – &lt;em&gt;x&lt;/em&gt;/&lt;em&gt;R&lt;/em&gt;, &lt;em&gt;long&lt;/em&gt;)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Next we walk &lt;em&gt;x&lt;/em&gt; units east, which only impacts the longitude.&amp;#160; How &lt;em&gt;much&lt;/em&gt; this affects the longitude depends, however, on our current latitude:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;p2&lt;/em&gt; = (&lt;em&gt;lat&lt;/em&gt; – &lt;em&gt;x&lt;/em&gt;/&lt;em&gt;R&lt;/em&gt;, &lt;em&gt;long&lt;/em&gt; + &lt;em&gt;x&lt;/em&gt;/&lt;em&gt;cos&lt;/em&gt;(&lt;em&gt;lat&lt;/em&gt; – &lt;em&gt;x&lt;/em&gt;/&lt;em&gt;R&lt;/em&gt;))&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Finally we walk x units north.&amp;#160; This brings the latitude back to where we started:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;pf&lt;/em&gt; = (&lt;em&gt;lat&lt;/em&gt;, &lt;em&gt;long&lt;/em&gt; + &lt;em&gt;x&lt;/em&gt;/(&lt;em&gt;R&lt;/em&gt; * &lt;em&gt;cos&lt;/em&gt;(&lt;em&gt;lat&lt;/em&gt; – &lt;em&gt;x&lt;/em&gt;/&lt;em&gt;R&lt;/em&gt;)))&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Okay, so what do we make of this?&amp;#160; We want &lt;em&gt;p0&lt;/em&gt; to equal &lt;em&gt;pf&lt;/em&gt;.&amp;#160; The latitude is easy, since the latitudes of &lt;em&gt;p0&lt;/em&gt; and &lt;em&gt;pf&lt;/em&gt; are the same.&amp;#160; Further, we note that if &lt;em&gt;lat&lt;/em&gt; is positive or negative &lt;em&gt;pi&lt;/em&gt;/2 then we’re at a pole and the value of &lt;em&gt;long&lt;/em&gt; is irrelevant.&amp;#160; Positive &lt;em&gt;pi&lt;/em&gt;/2 gives us the north pole solution; –&lt;em&gt;pi&lt;/em&gt;/2 ends up being nonsense, since you can’t go south from the south pole.&lt;/p&gt;  &lt;p&gt;But if &lt;em&gt;lat&lt;/em&gt; is not &lt;em&gt;pi&lt;/em&gt;/2, then &lt;em&gt;long&lt;/em&gt; matters.&amp;#160; In particular, our starting longitude has to equal our ending, but it can wrap around, so:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;long&lt;/em&gt; + 2 * &lt;em&gt;pi&lt;/em&gt; *&lt;em&gt; N&lt;/em&gt; = &lt;em&gt;long&lt;/em&gt; + &lt;em&gt;x&lt;/em&gt; / (&lt;em&gt;R&lt;/em&gt; * &lt;em&gt;cos&lt;/em&gt;(&lt;em&gt;lat&lt;/em&gt; – &lt;em&gt;x&lt;/em&gt;/&lt;em&gt;R&lt;/em&gt;))&lt;/p&gt;    &lt;p&gt;2 * &lt;em&gt;pi&lt;/em&gt; *&lt;em&gt; N&lt;/em&gt; = &lt;em&gt;x&lt;/em&gt; / (&lt;em&gt;R * cos&lt;/em&gt;(&lt;em&gt;lat&lt;/em&gt; – &lt;em&gt;x&lt;/em&gt;/&lt;em&gt;R))&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Here &lt;em&gt;N &lt;/em&gt;is any integer; the 2 * &lt;em&gt;pi &lt;/em&gt;* &lt;em&gt;N&lt;/em&gt; factor accounts for the fact that we can circle the globe.&amp;#160; Solving for lat we find:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;cos(lat – x/R) = x / &lt;/em&gt;( &lt;em&gt;2 * pi * N * R &lt;/em&gt;)&lt;/p&gt;    &lt;p&gt;&lt;em&gt;lat – x/R = acos( &lt;em&gt;x / &lt;/em&gt;( &lt;em&gt;2 * pi * N * R&lt;/em&gt;) )&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;lat = acos( &lt;em&gt;x / &lt;/em&gt;( &lt;em&gt;2 * pi * N * R&lt;/em&gt;) ) + x/R&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The &lt;em&gt;acos &lt;/em&gt;term is undefined if &lt;em&gt;N&lt;/em&gt; = 0, and if &lt;em&gt;N&lt;/em&gt; &amp;lt; 1 then the value lies outside of the range [–&lt;em&gt;pi&lt;/em&gt;/2, &lt;em&gt;pi&lt;/em&gt;/2].&amp;#160; When &lt;em&gt;N&lt;/em&gt; is greater than 0, then the results of the &lt;em&gt;acos&lt;/em&gt; term are in our range, but they could be positive or negative; it turns out that the values we want are negative.&lt;/p&gt;  &lt;p&gt;So what does this mean?&amp;#160; We have derived a set of latitude values that look like solutions, and the longitudes associated with these solutions are unconstrained.&amp;#160; In other words, we have a set of circles around the south pole corresponding to each &lt;em&gt;N &lt;/em&gt;in {1, 2, …}.&amp;#160; These are exactly the circles we’ve already described, but now we can compute exactly where they are.&amp;#160; For&lt;em&gt;&amp;#160; R = &lt;/em&gt;3963 miles and &lt;em&gt;x &lt;/em&gt;= 1:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;N=1: lat = -acos( 1&lt;em&gt; / &lt;/em&gt;(24900.263) ) + 0.000252 = -1.5705041 = -89.983260 degrees&lt;/p&gt;    &lt;p&gt;N=2: lat = -acos( 1&lt;em&gt; / &lt;/em&gt;(49800.527) ) + 0.000252 = -1.5705242 = -89.984410 degrees&lt;/p&gt;    &lt;p&gt;N=3: lat = -acos( 1&lt;em&gt; / &lt;/em&gt;(74700.790) ) + 0.000252 = -1.5705309 = -89.984794 degrees&lt;/p&gt;    &lt;p&gt;…&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And when &lt;em&gt;N&lt;/em&gt;=1, this circle is indeed about 1.16 miles north of the south pole, just as jnelso99 noted.&lt;/p&gt;  &lt;p&gt;Cheers,    &lt;br /&gt;-Isaac&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9185204" width="1" height="1"&gt;</content><author><name>isaac</name><uri>http://blogs.msdn.com/members/isaac.aspx</uri></author></entry><entry><title>PDC and a Nice Geographic Puzzle</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/isaac/archive/2008/12/05/pdc-and-a-nice-geographic-puzzle.aspx" /><id>http://blogs.msdn.com/isaac/archive/2008/12/05/pdc-and-a-nice-geographic-puzzle.aspx</id><published>2008-12-05T19:03:09Z</published><updated>2008-12-05T19:03:09Z</updated><content type="html">&lt;p&gt;Hi Folks,&lt;/p&gt;  &lt;p&gt;At PDC I gave a talk largely inspired by topics raised here and in the spatial forums.&amp;#160; But “inspired by” doesn’t equate to “a duplicate of”, and to turn things around, I’ve been meaning to write a few posts here inspired by my PDC talk.&amp;#160; Stay tuned.&lt;/p&gt;  &lt;p&gt;In the meantime, Rob Mount from Intergraph sent me a note that started:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;As I review your PDC presentation I’m reminded of a puzzle I think you’ll enjoy.&amp;#160; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I did indeed, and I hope a lot of you will enjoy it as well.&amp;#160; Rob started out with a puzzle I expect most of us have heard before:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;/p&gt;    &lt;p&gt;When I was growing up one of my uncles was fond of challenging the children in the family with puzzles.&amp;#160; One of my favorites, as a very young child, was this one: A hunter walks a mile south, a mile east and a mile north and finds himself back at the starting point.&amp;#160; A bear walks by.&amp;#160; What color is the bear?&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This is well-known enough that I don’t think the answer will be much of a spoiler:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;He, of course, thought the hunter started at the North Pole.&amp;#160; The bear was a polar bear and hence white.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;A perfectly valid answer, of course.&amp;#160; But Rob continues:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Years later I finally got my revenge by stumping him with this problem:&amp;#160; I reminded him of the hunter and the polar bear and pointed out that there are actually several other points on the earth that meet the geographic constraint he stated – if you walk a mile south, a mile east and a mile north you find yourself back where you started.&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;    &lt;p&gt;Assuming a spherical earth, how many such points exist and where are they?&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I won’t spoil this one so quickly.&amp;#160; Go ahead and post your answers in the comments; I’ll post the solution in a few days.&lt;/p&gt;  &lt;p&gt;Cheers,    &lt;br /&gt;-Isaac&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9180502" width="1" height="1"&gt;</content><author><name>isaac</name><uri>http://blogs.msdn.com/members/isaac.aspx</uri></author></entry><entry><title>Frequently Asked Question: How do I load shapefiles?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/isaac/archive/2008/11/04/frequently-asked-question-how-do-i-load-shapefiles.aspx" /><id>http://blogs.msdn.com/isaac/archive/2008/11/04/frequently-asked-question-how-do-i-load-shapefiles.aspx</id><published>2008-11-04T21:29:34Z</published><updated>2008-11-04T21:29:34Z</updated><content type="html">&lt;p&gt;This has come up &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2895872&amp;amp;SiteID=1"&gt;a&lt;/a&gt; &lt;a href="http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=4051644&amp;amp;SiteID=1"&gt;few&lt;/a&gt; &lt;a href="http://blogs.msdn.com/isaac/archive/2007/05/16/sql-server-spatial-support-an-introduction.aspx#9040337"&gt;times&lt;/a&gt; now.&amp;#160; Multiple questions deserve at least one answer, right?&lt;/p&gt;  &lt;p&gt;First, Microsoft has not produced a shapefile loader (or exporter).&amp;#160; If this is important to you, here’s the &lt;a href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=357045"&gt;Connect item&lt;/a&gt; to hit.&amp;#160; (And yes: we do listen to Connect!)&lt;/p&gt;  &lt;p&gt;So, what are you to do?&amp;#160; There are a few options:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;If you are a user of one of our &lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/spatial-partners.aspx"&gt;partner GIS vendors&lt;/a&gt;---&lt;a href="http://www.microsoft.com/isv/autodesk"&gt;Autodesk&lt;/a&gt;, &lt;a href="http://www.microsoft.com/isv/esri/"&gt;ESRI&lt;/a&gt;, &lt;a href="http://www.intergraph.com/"&gt;Intergraph&lt;/a&gt;, &lt;a href="http://www.manifold.net/info/sql_server_support.shtml"&gt;Manifold&lt;/a&gt;, or &lt;a href="http://www.mipro.com/"&gt;Pitney Bowes (MapInfo)&lt;/a&gt;---they probably have support for loading shapefiles already.&amp;#160; You’ll have to ask them, though: I’m not an expert in their products.       &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;If not, and if you aren’t interested in a real GIS, then you should check out &lt;a href="http://www.safe.com/microsoft"&gt;Safe Software&lt;/a&gt;: they build spatial ETL software that will take shapefiles (as well as about ~200 other formats) perform transformations on the data, and load into SQL Server.       &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;If you’re looking for a free solution, then there are a few popping up in the wild.&amp;#160; Morten Nielsen has had &lt;a href="http://sharpgis.net/page/SQL-Server-2008-Spatial-Tools.aspx"&gt;his tool&lt;/a&gt; available for some time now, which has both a command line and GUI interfaces.&amp;#160; Scott Ellington has created a &lt;a href="http://www.salmonsalvo.net/blog/?p=105"&gt;command line tool&lt;/a&gt; as well, but I haven’t had a chance to play with it yet.       &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;You could build your own.&amp;#160; I suggest using the sink/builder API---you can find plenty of examples in our &lt;a href="http://codeplex.com/SqlSpatialtools"&gt;Codeplex project&lt;/a&gt;.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Hopefully one of these solutions will work for you.&lt;/p&gt;  &lt;p&gt;Cheers,    &lt;br /&gt;-Isaac&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9041549" width="1" height="1"&gt;</content><author><name>isaac</name><uri>http://blogs.msdn.com/members/isaac.aspx</uri></author></entry><entry><title>Off to PDC</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/isaac/archive/2008/10/24/off-to-pdc.aspx" /><id>http://blogs.msdn.com/isaac/archive/2008/10/24/off-to-pdc.aspx</id><published>2008-10-24T20:51:00Z</published><updated>2008-10-24T20:51:00Z</updated><content type="html">&lt;p&gt;Despite my relative youth, I can be a bit of a fuddy-duddy.&amp;nbsp; Fighting my natural impulses, I’ve decided to give Twitter a try---at least while I’m at PDC.&amp;nbsp; So, if you’re interested in tracking me down, surf the tubes over to &lt;a href="http://twitter.com/isaackunen" mce_href="http://twitter.com/isaackunen"&gt;my very own Truman Show&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Or drop me an old-fashioned email.&lt;/p&gt;  &lt;p&gt;See you at the show!   &lt;br&gt;-Isaac&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9015237" width="1" height="1"&gt;</content><author><name>isaac</name><uri>http://blogs.msdn.com/members/isaac.aspx</uri></author><category term="PDC2008" scheme="http://blogs.msdn.com/isaac/archive/tags/PDC2008/default.aspx" /></entry><entry><title>Nearest Neighbors</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/isaac/archive/2008/10/23/nearest-neighbors.aspx" /><id>http://blogs.msdn.com/isaac/archive/2008/10/23/nearest-neighbors.aspx</id><published>2008-10-22T23:38:00Z</published><updated>2008-10-22T23:38:00Z</updated><content type="html">&lt;p&gt;Hi Folks,&lt;/p&gt;  &lt;p&gt;Spatial users often want to find the object nearest a given point.&amp;nbsp; This operation, usually referred to as &lt;a href="http://en.wikipedia.org/wiki/Nearest_neighbor_search" mce_href="http://en.wikipedia.org/wiki/Nearest_neighbor_search"&gt;nearest neighbor search&lt;/a&gt;, is remarkably common in many areas of computer science.&amp;nbsp; In general, we may wish to find not only the nearest, but the &lt;a href="http://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm" mce_href="http://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm"&gt;&lt;i&gt;k&lt;/i&gt;-nearest neighbors&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;How can we accomplish this with SQL Server?&amp;nbsp; Here we’ll look at finding the single nearest neighbor; the extension to &lt;i&gt;k&lt;/i&gt;-nearest neighbors is relatively straight forward.&lt;/p&gt;  &lt;p&gt;First, let's examine the naive method for accomplishing this: simply order the table by distance and restrict the results.&amp;nbsp; For all of these examples, we’ll assume a table &lt;i&gt;T&lt;/i&gt; with a spatial column &lt;i&gt;g&lt;/i&gt;, as well as a parameter @x containing the search point:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;span class="kwrd"&gt;TOP&lt;/span&gt;(1) *&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt; T &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; g.STDistance(@x) ASC&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;












.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;This solution certainly has simplicity on its side, but consider the work that needs to be done.&amp;nbsp; The &lt;i&gt;entire &lt;/i&gt;table must be scanned, and the distance of each to the search point must be calculated.&amp;nbsp; Ouch.&lt;/p&gt;

&lt;p&gt;We could conceivably improve on this by restricting our search space to to the immediate region around the target point:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @region geography = @x.STBuffer(10000)&lt;/pre&gt;

  &lt;pre&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;span class="kwrd"&gt;TOP&lt;/span&gt;(1) *&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt; T &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;WHERE&lt;/span&gt; g.Filter(@region) = 1&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; g.STDistance(@x) ASC&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;But this solution requires that we know our data very well: if there are no rows in the region, then we will fail to find the nearest neighbor; if there are too many, then we will again be left with a rather inefficient query.&lt;/p&gt;

&lt;p&gt;How do we escape this morass?&amp;nbsp; We can do so by starting with a very small region---so small that we can be certain not to encounter too many results---and then keep enlarging it until we find something.&amp;nbsp; Doing this with a loop is not hard, but Steven Hemingray showed me how to do this with entirely declarative syntax:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;DECLARE&lt;/span&gt; @&lt;span class="kwrd"&gt;start&lt;/span&gt; &lt;span class="kwrd"&gt;FLOAT&lt;/span&gt; = 1000; &lt;/pre&gt;

  &lt;pre&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;WITH&lt;/span&gt; NearestPoints &lt;span class="kwrd"&gt;AS&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;(&lt;/pre&gt;

  &lt;pre class="alt"&gt;   &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;span class="kwrd"&gt;TOP&lt;/span&gt;(1) &lt;span class="kwrd"&gt;WITH TIES&lt;/span&gt; *,  T.g.STDistance(@x) &lt;span class="kwrd"&gt;AS&lt;/span&gt; dist&lt;/pre&gt;

  &lt;pre&gt;   &lt;span class="kwrd"&gt;FROM&lt;/span&gt; Numbers &lt;span class="kwrd"&gt;JOIN&lt;/span&gt; T &lt;span class="kwrd"&gt;WITH&lt;/span&gt;(&lt;span class="kwrd"&gt;INDEX&lt;/span&gt;(spatial_index)) &lt;/pre&gt;

  &lt;pre class="alt"&gt;   &lt;span class="kwrd"&gt;ON&lt;/span&gt; T.g.STDistance(@x) &amp;lt; @&lt;span class="kwrd"&gt;start&lt;/span&gt;*POWER(2,Numbers.n)&lt;/pre&gt;

  &lt;pre&gt;   &lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; n&lt;/pre&gt;

  &lt;pre class="alt"&gt;)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;span class="kwrd"&gt;TOP(&lt;/span&gt;1) * &lt;span class="kwrd"&gt;FROM&lt;/span&gt; NearestPoints&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; n, dist&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;




.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;This requires some explanation.&amp;nbsp; First, the &lt;i&gt;@start&lt;/i&gt; parameter gives the initial region to search.&amp;nbsp; I’ve chosen one kilometer, but this can be adjusted downward if your data is very dense.&amp;nbsp; Second, you’ll notice that we make use of a &lt;i&gt;Numbers&lt;/i&gt; table, which just contains the numbers 1 through &lt;i&gt;n&lt;/i&gt;.&amp;nbsp; This&amp;nbsp; just contains a long list of integers, which is is useful in many situations.&lt;/p&gt;

&lt;p&gt;The inner query examines a set of exponentially-expanding regions.&amp;nbsp; The &lt;i&gt;ORDER BY&lt;/i&gt; clause along with the &lt;i&gt;TOP(1)&lt;/i&gt; allows the query to stop as soon as it finds the smallest non-empty region.&amp;nbsp; The &lt;i&gt;WITH TIES &lt;/i&gt;statement makes sure that &lt;i&gt;all&lt;/i&gt; of the objects in that region will be in the result set.&lt;/p&gt;

&lt;p&gt;Once the inner query returns a list of potential results, the outer query examines them to find which is actually nearest.&amp;nbsp; With this approach, we can select a start area small enough to keep the cost low in dense data, but also be guaranteed to find a distant nearest neighbor.&lt;/p&gt;

&lt;p&gt;Incidentally, if you don’t already have a numbers table, you can create one quite quickly with some mildly-black magic like this:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;span class="kwrd"&gt;TOP&lt;/span&gt; 100000 &lt;span class="kwrd"&gt;IDENTITY&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;,1,1) &lt;span class="kwrd"&gt;AS&lt;/span&gt; n &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="kwrd"&gt;INTO&lt;/span&gt; numbers &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt; MASTER..spt_values a, MASTER..spt_values b&lt;/pre&gt;

  &lt;pre&gt;&amp;nbsp;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;UNIQUE&lt;/span&gt; &lt;span class="kwrd"&gt;CLUSTERED&lt;/span&gt; &lt;span class="kwrd"&gt;INDEX&lt;/span&gt; idx_1 &lt;span class="kwrd"&gt;ON&lt;/span&gt; numbers(n)&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;




.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;This isn’t a particularly pretty solution, but to proactively answer a question, we didn’t add a method for this primarily because we ran out of time.&amp;nbsp; Look for something more built-in the next go around.&lt;/p&gt;

&lt;p&gt;Cheers, 
  &lt;br&gt;-Isaac&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9011920" width="1" height="1"&gt;</content><author><name>isaac</name><uri>http://blogs.msdn.com/members/isaac.aspx</uri></author></entry><entry><title>A Few Strange Functions</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/isaac/archive/2008/10/16/a-few-strange-functions.aspx" /><id>http://blogs.msdn.com/isaac/archive/2008/10/16/a-few-strange-functions.aspx</id><published>2008-10-16T17:13:45Z</published><updated>2008-10-16T17:13:45Z</updated><content type="html">&lt;p&gt;Hi Folks,&lt;/p&gt;  &lt;p&gt;A &lt;a href="http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3949700&amp;amp;SiteID=1"&gt;post on the spatial forum&lt;/a&gt; last week caught my attention for entirely non-spatial reasons: it made use of two functions---RADIANS() and DEGREES()---that I never knew existed.&lt;/p&gt;  &lt;p&gt;It seems rather strange that out of the innumerable (well, technically &lt;a href="http://en.wikipedia.org/wiki/Enumerable"&gt;enumerable&lt;/a&gt;) list of functions that we could implement, someone felt these were worth the effort.&amp;#160; For example, we save exactly 0 characters by using these functions:&lt;/p&gt;  &lt;div&gt;   &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;     &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;RADIANS(@x)&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;DEGREES(@y)&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Becomes:&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;
    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;@x*PI()/180&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;@y*180/PI()&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Granted, using the functions is clearer and less error prone; but I’m not arguing that they are &lt;em&gt;bad &lt;/em&gt;functions, just surprising.&lt;/p&gt;

&lt;p&gt;What is surprising &lt;em&gt;and bad&lt;/em&gt;, if you ask me, is that both RADIANS() and DEGREES() have int—&amp;gt;int overloads.&amp;#160; In other words, if you call these functions with an integer, you get an integer result:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;
    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;SELECT RADIANS(180) -- 3, not 3.141592653589793100&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;SELECT DEGREES(3)   -- 171, not 171.887338539246970000&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This behavior is very strange.&amp;#160; I cannot think of a case in which it is useful, yet plenty where it could cause harm.&amp;#160; The behavior is noted in &lt;a href="http://msdn.microsoft.com/en-us/library/ms177516.aspx"&gt;BOL&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Arithmetic functions, such as ABS, CEILING, DEGREES, FLOOR, POWER, RADIANS, and SIGN, return a value having the same data type as the input value.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Of these, only RADIANS() and DEGREES() have natural floating-point return values: all others are naturally integers, and while promoting them to floats may not be necessary, it doesn’t seem problematic.&lt;/p&gt;

&lt;p&gt;Let me know if you can see a benefit of this behavior; I’d love to see these overloads on our deprecation list.&lt;/p&gt;

&lt;p&gt;Cheers, 
  &lt;br /&gt;-Isaac&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9002004" width="1" height="1"&gt;</content><author><name>isaac</name><uri>http://blogs.msdn.com/members/isaac.aspx</uri></author></entry><entry><title>Conference Correction</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/isaac/archive/2008/10/09/conference-correction.aspx" /><id>http://blogs.msdn.com/isaac/archive/2008/10/09/conference-correction.aspx</id><published>2008-10-09T15:49:27Z</published><updated>2008-10-09T15:49:27Z</updated><content type="html">&lt;p&gt;Hi Folks,&lt;/p&gt;  &lt;p&gt;Unfortunately, I need to correct an &lt;a href="http://blogs.msdn.com/isaac/archive/2008/09/17/upcoming-conferences.aspx"&gt;earlier post of mine&lt;/a&gt;.&amp;#160; I will &lt;em&gt;not &lt;/em&gt;be speaking at PASS this year---it looks like there were some mixed signals.&amp;#160; If you’re looking for your spatial fix, Michael Rys will be talking about &lt;a href="http://www.softconference.com/pass/ProgramSessions/program-sessiondetail.asp?SID=135499"&gt;types and indexing&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Still, PASS is on my home turf, so I’ll be around: come see me at the Ask the Experts session, or drop me a line and we can meet up.&lt;/p&gt;  &lt;p&gt;PDC and Autodesk University are still on until they tell me otherwise.&lt;/p&gt;  &lt;p&gt;Cheers,   &lt;br /&gt;-Isaac&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8992957" width="1" height="1"&gt;</content><author><name>isaac</name><uri>http://blogs.msdn.com/members/isaac.aspx</uri></author></entry></feed>