当前位置:  开发笔记 > 编程语言 > 正文

在SQL Server中存储坐标(经度/纬度,来自谷歌地图)的最佳方法是什么?

如何解决《在SQLServer中存储坐标(经度/纬度,来自谷歌地图)的最佳方法是什么?》经验,为你挑选了7个好方法。

我正在SQL Server 2008中设计一个表,用于存储用户列表和Google Maps坐标(经度和纬度).

我需要两个字段,还是可以用1完成?

用于存储此类数据的最佳(或最常见)数据类型是什么?



1> dan90266..:

公平的警告!在接受使用GEOGRAPHY类型的建议之前,请确保您不打算使用Linq或Entity Framework来访问数据,因为它不受支持(截至2010年11月),您会感到难过!

2017年7月更新

对于那些现在阅读这个答案的人来说,它已经过时,因为它指的是过时的技术堆栈.有关详细信息,请参阅注释


警告不再有效.EF现在支持地理类型.

2> Craig Bovis..:

看一下SQL Server 2008中引入的新的Spatial数据类型.它们专为此类任务而设计,使索引和查询更加轻松和高效.

更多信息:

MS TechNet:SQL Server 2008空间数据类型,

MSDN:使用空间数据(数据库引擎).



3> powtac..:

我不知道SQL Server的答案,但......

MySQL中保存为FLOAT( 10, 6 )

这是Google开发人员文档的官方建议.

CREATE TABLE `coords` (
  `lat` FLOAT( 10, 6 ) NOT NULL ,
  `lng` FLOAT( 10, 6 ) NOT NULL ,
) ENGINE = MYISAM ;


问题清楚地说明了SQL Server,而不是MySQL.你肯定不会想要一张只有纬度和经度的桌子.
由于精度问题,我不会使用float.使用小数(9,6).
同意了 - 回答.使用新的GEOGRAPHY空间类型.
该链接也已移至http://code.google.com/apis/maps/articles/phpsqlajax.html

4> 小智..:

我讨厌成为那些说"这里是一种新类型,让我们使用它"的人的反手.新的SQL Server 2008空间类型有一些优点 - 即效率,但你不能盲目地说总是使用那种类型.这真的取决于一些更大的图片问题.

作为一个例子,整合.这种类型在.Net中有一个等效类型 - 但是互操作呢?那么支持或扩展旧版本的.Net呢?将这种类型在服务层中暴露给其他平台怎么样?那么数据的规范化 - 也许你对lat或long作为独立的信息感兴趣.也许你已经编写了复杂的业务逻辑来处理long/lat.

我不是说你不应该使用空间类型 - 在很多情况下你应该这样做.我只是说在走这条路之前你应该问一些更为关键的问题.为了让我最准确地回答你的问题,我需要更多地了解你的具体情况.

单独存储长/纬或空间类型都是可行的解决方案,根据您自己的具体情况,一个可能优于另一个.



5> jaxxbo..:

我的方式:我存储纬度经度,然后我有第三列,这是前两列的自动派生地理类型.该表如下所示:

CREATE TABLE [dbo].[Geopoint]
(
    [GeopointId] BIGINT NOT NULL PRIMARY KEY IDENTITY, 
    [Latitude] float NOT NULL, 
    [Longitude] float NOT NULL, 
    [ts] ROWVERSION NOT NULL, 
    [GeographyPoint]  AS ([geography]::STGeomFromText(((('POINT('+CONVERT([varchar](20),[Longitude]))+' ')+CONVERT([varchar](20),[Latitude]))+')',(4326))) 
)

这使您可以灵活地在geoPoint列上进行空间查询,还可以根据需要检索纬度和经度值,以便显示或提取csv用途.


感谢和+1,您的回答对我有所帮助。但是我认为最好使用[`Point`](https://msdn.microsoft.com/zh-cn/library/bb933811.aspx)而不是`STGeomFromText`。例如:`[geography] :: Point([Latitude],[Longitude],4326)`。

6> Pure.Krome..:

您要做的是将纬度和经度存储为新的SQL2008 Spatial类型 - > GEOGRAPHY.

这是一张桌子的屏幕截图,我有.

alt text http://img20.imageshack.us/img20/6839/zipcodetable.png

在此表中,我们有两个存储地理数据的字段.

边界:这是多边形,即邮政编码边界

CentrePoint:这是纬度/经度点,表示此多边形的视觉中点.

您希望将其作为GEOGRAPHY类型保存到数据库的主要原因是,您可以利用它的所有SPATIAL方法 - >例如.聚合点,两点之间的距离等

顺便说一句,我们还使用Google的Maps API来检索纬度/经度数据并将其存储在我们的Sql 2008数据库中 - 因此这种方法确实有效.


如果SqlCE或<2008支持二进制文件,则可以将结果存储为varbinary,然后使用Spatial工具库dll对.NET代码中的二进制数据表示进行空间计算.不是最好的解决方案,但仍然是*某些*问题的可能解决方案.(nuget for sql spatial ..来抓住那个dll).
图片链接已损坏

7> Rosstified..:

SQL Server支持空间相关信息.您可以在http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx上查看更多信息.

另外,您可以将信息存储为两个基本字段,通常浮点数是大多数设备报告的标准数据类型,并且足够精确到一英寸或两英寸 - 足以满足Google地图的要求.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有