我正在SQL Server 2008中设计一个表,用于存储用户列表和Google Maps坐标(经度和纬度).
我需要两个字段,还是可以用1完成?
用于存储此类数据的最佳(或最常见)数据类型是什么?
公平的警告!在接受使用GEOGRAPHY类型的建议之前,请确保您不打算使用Linq或Entity Framework来访问数据,因为它不受支持(截至2010年11月),您会感到难过!
2017年7月更新
对于那些现在阅读这个答案的人来说,它已经过时,因为它指的是过时的技术堆栈.有关详细信息,请参阅注释
看一下SQL Server 2008中引入的新的Spatial数据类型.它们专为此类任务而设计,使索引和查询更加轻松和高效.
更多信息:
MS TechNet:SQL Server 2008空间数据类型,
MSDN:使用空间数据(数据库引擎).
我不知道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 2008空间类型有一些优点 - 即效率,但你不能盲目地说总是使用那种类型.这真的取决于一些更大的图片问题.
作为一个例子,整合.这种类型在.Net中有一个等效类型 - 但是互操作呢?那么支持或扩展旧版本的.Net呢?将这种类型在服务层中暴露给其他平台怎么样?那么数据的规范化 - 也许你对lat或long作为独立的信息感兴趣.也许你已经编写了复杂的业务逻辑来处理long/lat.
我不是说你不应该使用空间类型 - 在很多情况下你应该这样做.我只是说在走这条路之前你应该问一些更为关键的问题.为了让我最准确地回答你的问题,我需要更多地了解你的具体情况.
单独存储长/纬或空间类型都是可行的解决方案,根据您自己的具体情况,一个可能优于另一个.
我的方式:我存储纬度和经度,然后我有第三列,这是前两列的自动派生地理类型.该表如下所示:
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用途.
您要做的是将纬度和经度存储为新的SQL2008 Spatial类型 - > GEOGRAPHY.
这是一张桌子的屏幕截图,我有.
alt text http://img20.imageshack.us/img20/6839/zipcodetable.png
在此表中,我们有两个存储地理数据的字段.
边界:这是多边形,即邮政编码边界
CentrePoint:这是纬度/经度点,表示此多边形的视觉中点.
您希望将其作为GEOGRAPHY类型保存到数据库的主要原因是,您可以利用它的所有SPATIAL方法 - >例如.聚合点,两点之间的距离等
顺便说一句,我们还使用Google的Maps API来检索纬度/经度数据并将其存储在我们的Sql 2008数据库中 - 因此这种方法确实有效.
SQL Server支持空间相关信息.您可以在http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx上查看更多信息.
另外,您可以将信息存储为两个基本字段,通常浮点数是大多数设备报告的标准数据类型,并且足够精确到一英寸或两英寸 - 足以满足Google地图的要求.