GML到SQL地理 - 24200:指定的输入不代表有效的地理实例

时间:2012-06-26 15:16:46

标签: sql-server-2008 tsql sqlgeography

我目前正在将Google地图集成到我们的某个应用程序中。其中一个要求是将用户定义的区域存储到数据库中。为此,我一直在SQL Server 2008中使用Geography类型。虽然我在大多数情况下都使用它,但我遇到了阻塞问题。

下面我有一些示例代码。我用GML XML字符串填充Geography对象,有些实例有效,有些则没有,我看不出它们没有的逻辑原因。

DECLARE @geoWork GEOGRAPHY
DECLARE @geoNotWork GEOGRAPHY
DECLARE @Work NVARCHAR(MAX)
DECLARE @DoesntWork NVARCHAR(MAX)

SET @Work = '<Polygon xmlns="http://www.opengis.net/gml">' +
             '<exterior>' +
             '<LinearRing>' +
             '<posList>' +
             '61.52269494598361 -6.50390625 50.84757295365389 -36.5625 32.69486597787505 -17.40234375 46.31658418182218 23.90625 61.52269494598361 -6.50390625' +
             '</posList>' +
             '</LinearRing>' +
             '</exterior>' +
             '</Polygon>'
SET @DoesntWork = '<Polygon xmlns="http://www.opengis.net/gml">' +
                  '<exterior>' +
                  '<LinearRing>' +
                  '<posList>' +
                  '51.8591074413996 -0.8425140380859375 51.790355567911845 -0.7051849365234375 51.75381501386028 -0.8191680908203125 51.80564283054998 -0.9180450439453125 51.8591074413996 -0.8425140380859375' +
                  '</posList>' +
                  '</LinearRing>' +
                  '</exterior>' +
                  '</Polygon>'

SET @geoWork = GEOGRAPHY::GeomFromGml(@Work, 4326)
SET @geoNotWork = GEOGRAPHY::GeomFromGml(@DoesntWork, 4326)

SELECT @geoWork.AsGml()
SELECT @geoNotWork.AsGml()

正在工作的多边形定义了一个巨大的区域(跨越几个国家的大小),而没有定义一个大城镇大小的区域。只有这些“较小”的区域才会失败。令人讨厌的是,这个较小的一个不足以满足我的需要。谁能告诉我为什么会这样?

1 个答案:

答案 0 :(得分:2)

在您失败的示例中,您的数据有错误的方向

为了能够跟踪多边形的内部和外部,SQL geography类型要求多边形具有正确的环方向More about this,其中:

  

在椭圆体系中,多边形没有意义,或者没有方向的含糊不清。例如,赤道周围的环是否描述了北半球或南半球?如果我们使用地理数据类型来存储空间实例,我们必须指定环的方向并准确描述实例的位置。椭球系统中多边形的内部由左手定则定义。

如何修复它:

"Fixing" Polygon Ring Orientation in SQL Server 2008 using T-SQL