在SQL Server中存储坐标(来自Google地图的经度/纬度)的最佳方式是什么?
我正在devise一个SQL Server 2008中的表格,它将存储一个用户列表和一个Google地图坐标(经度和纬度)。
我需要两个字段,还是可以用1来完成?
什么是用于存储这种数据的最好(或最常见的)数据types?
查看SQL Server 2008中引入的新的Spatial数据types。它们专为这类任务而devise,使索引和查询更容易,更高效。
更多信息:
-
MS TechNet:SQL Server 2008空间数据types ,
-
MSDN:使用空间数据(数据库引擎) 。
公平的警告! 在使用GEOGRAPHYtypes的build议之前,请确保您没有计划使用Linq或Entity Framework来访问数据,因为它不受支持(截至2010年11月),您会很伤心!
2017年7月更新
对于那些现在阅读这个答案的人来说,它已经过时了,因为它指的是后台技术堆栈。 查看评论了解更多详情。
我不知道SQL Server的答案,但…
在MySQL中保存为FLOAT( 10, 6 )
这是Google开发者文档的官方build议。
CREATE TABLE `coords` ( `lat` FLOAT( 10, 6 ) NOT NULL , `lng` FLOAT( 10, 6 ) NOT NULL , ) ENGINE = MYISAM ;
对于那些说“这是一种新型,让我们使用它”的人,我讨厌做一个逆向投资者。 新的SQL Server 2008空间types有一些优点 – 即效率,但是不能盲目地说总是使用这种types。 这真的取决于一些更大的图片问题。
作为一个例子,整合。 这个types在.Net中有一个equivilenttypes,但是interop呢? 那么支持或扩展旧版本的.Net呢? 把这个服务层暴露给其他平台呢? 数据正常化怎么样?也许你对经济的独立信息感兴趣。 也许你已经写了复杂的业务逻辑来处理长/经度。
我并不是说你不应该使用空间types – 在许多情况下,你应该这样做。 我只是说,在走下这条道路之前,你应该问一些更重要的问题。 对于我最准确地回答你的问题,我需要更多地了解你的具体情况。
分别存储长/经度或空间types都是可行的解决scheme,根据你自己的情况,一个可能比另一个更可取。
你要做的是将经纬度存储为新的SQL2008空间types – > GEOGRAPHY。
这里有一个表格的屏幕截图,我有。
替代文字http://img20.imageshack.us/img20/6839/zipcodetable.png
在这张表中,我们有两个存储地理数据的字段。
- 边界:这是作为邮政编码边界的多边形
- CentrePoint:这是代表该多边形视觉中点的纬度/经度点。
你想把它作为GEOGRAPHYtypes保存到数据库的主要原因是你可以利用所有的SPATIAL方法 – >例如。 点聚,两点之间的距离等
顺便说一下,我们也使用谷歌的地图API来检索纬度/经度数据,并将其存储在我们的Sql 2008数据库 – 所以这种方法确实有效。
我这样做的方式:我存储的经度和纬度 ,然后我有第三列是一个自动派生的地理types的前两列。 表格看起来像这样:
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目的来检索纬度和经度值。
SQL Server支持空间相关信息。 您可以在http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx上看到更多信息; 。
或者,您可以将信息存储为两个基本字段,通常情况下,浮点数是大多数设备报告的标准数据types,足够精确到一两英寸 – 这对于Google地图来说已经足够了。
如果你只是将其replace成一个URL,我想一个字段会做 – 所以你可以形成一个URL
http://maps.google.co.uk/maps?q=12.345678,12.345678&z=6
但因为它是两个数据我将他们在不同的领域
将它们都存储为float,并在它们上使用唯一的关键字.i.em
create table coordinates( coord_uid counter primary key, latitude float, longitude float, constraint la_long unique(latitude, longitude) );