我应该使用SqlGeometry还是SqlGeography?

时间:2012-06-14 21:40:13

标签: sql-server geocoding geospatial

我们在这个问题上存在一些内部冲突,似乎无法得出一个圆满的结论。

我们只存储纬度和经度,可能还有简单的多边形。我们所需要的只是计算两点之间的距离(并且可能看一个点是否在多边形内),并且整个数据非常接近以使平面估计可接受。

由于我们的要求非常宽松,开发团队的一半建议使用SqlGeometry类型,这显然更简单。但是,我很难接受这个,因为我们正在存储地理数据,这似乎是将它们存储在SqlGeography中是正确的做法。此外,我没有找到任何实质性证据表明SqlGeometry数据类型比SqlGeography类型更容易使用。

是否有人建议哪种类型更适合这种相对简单的情况?

3 个答案:

答案 0 :(得分:7)

这不是比较特征,准确性或简单性的问题 - 两种空间数据类型用于处理不同类型的数据。

作为类比,假设您为包含每行唯一标识符的列选择最佳数据类型。如果该UID仅包含整数值,则使用 int ,而如果它是6个字符的字母数字值,则使用 char(6)。如果它有可变长度的unicode值,你可以使用 nvarchar ,对吗?

空间数据采用相同的逻辑 - 您可以根据该列包含的值选择适当的数据类型;如果您正在使用地理(即纬度/经度)坐标,请使用 SqlGeography 数据类型。就这么简单。

可以使用SqlGeometry存储纬度/经度值,但它就像使用 nvarchar(max)来存储整数......我保证你将会导致进一步的问题(例如,当您所有的区域计算以度平方为单位进行测量时)

答案 1 :(得分:5)

SqlGeography类型的可用方法少于SqlGeometry(特别是在Sql 2008中)。

SqlGeography reference

SqlGeometry reference

例如,假设您想要在Sql2008中获取多边形的质心。您在几何中有一个本机方法,但在地理方面则没有。

此外,它还有以下限制:

  • 你不能拥有超过一个半球的地理位置
  • 创建多边形时环序有问题

此外,大多数可用的API和库(我所知道的)比地理位置更好地处理几何。

那就是说,如果距离计算必须精确,你的距离很远,并且在世界各地都有坐标,那么地理位置可能更合适。否则,根据您对问题的描述,您可以使用几何类型。

关于你的问题:“工作更容易吗?”。这取决于。无论如何,根据经验,对于简单的场景,我通常会选择SqlGeometry。

无论如何,恕我直言,你不应该太担心这个决定。使用其他类型创建新列相对容易,并在必要时迁移数据。

答案 2 :(得分:1)

四年后,很明显我们应该将数据存储在SqlGeometry而不是SqlGeography

为什么?

我们从立法区地图导入信息,他们的数据存储在SqlGeometry。在确定特定纬度/经度是否在某个立法区边界内时,当该点接近两个边界时,我们会得到不一致的结果。

这要求我们做额外的工作来确定"关闭"到边界,并手动验证它们是否被分配到适当的区域。不理想。

故事的道德:如果您依赖任何数据,请考虑将其存储在哪种类型以帮助指导您的决策。