7

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

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

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

有没有人建议哪种类型更适合这种相对简单的场景?

4

3 回答 3

7

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

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

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

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

于 2012-06-15T16:28:24.453 回答
5

SqlGeography 类型的可用方法比 SqlGeometry 少(尤其是在 Sql 2008 中)。

SqlGeography 参考

SqlGeometry 参考

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

此外,它具有以下限制:

  • 你的地理不能超过一个半球
  • 创建多边形时,环顺序很重要

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

也就是说,如果距离计算必须精确,你有很远的距离并且在世界各地都有坐标,那么地理可能会更合适。否则,根据您对问题的描述,几何类型将为您提供很好的服务。

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

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

于 2012-06-15T14:46:31.110 回答
2

四年后,很明显我们应该将数据存储SqlGeometrySqlGeography.

为什么?

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

这需要我们做额外的工作来识别“靠近”边界的位置,并手动验证它们是否被分配到正确的区域。不理想。

故事的寓意:如果您依赖任何数据,请考虑它存储的类型以帮助指导您的决策。

于 2016-08-02T16:16:50.923 回答