2009-02-16 46 views

回答

-4

如果你只是把它代入我想一个领域会做一个URL - 这样你就可以形成像

http://maps.google.co.uk/maps?q=12.345678,12.345678&z=6 

一个URL,但因为它是两个数据我将它们存储在单独的田

+0

这是我的情况。我只需要将坐标存储在一个字段中,并用逗号分隔。我认为可以使用TEXT作为字段类型。 你觉得呢? – Amr 2017-03-10 10:06:12

-10

商店既作为浮动,并用独特的关键词上them.i.em

create table coordinates(
coord_uid counter primary key, 
latitude float, 
longitude float, 
constraint la_long unique(latitude, longitude) 
); 
+0

我不明白。为什么限制他们是独一无二的? – 2009-02-28 17:39:17

+0

确保只有一组唯一的经纬度对。你不想在表格中存储坐标{0,0}两次,不是吗? – Graviton 2009-03-01 09:26:31

+1

你可能不希望像这样有一个单独的坐标表,特别是对于唯一性约束,它是一个处理两个位置引用同一点的情况的维护梦魇,更不用说清理未引用的行。 – araqnid 2009-05-20 14:32:26

28

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

MySQL的保存为FLOAT(10, 6)

这是从Google developer documentation官方推荐。

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

你想要做的是将纬度和经度存储为新的SQL2008空间类型 - >地理。

这里有一个表的屏幕截图,这是我有。

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

在这个表中,我们存储数据的地理两个领域。

  • 边界:此是作为邮政编码边界
  • 中心点多边形:这是纬度/经度点表示此多边形的视觉中点。

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

顺便说一句,我们还可以使用谷歌的地图API来获取纬度/经度数据,并存储在我们的SQL 2008数据库 - 所以这种方法确实可行。

59

公平的警告!在服用建议使用地理类型,请确保您不使用LINQ或实体框架来访问数据,因为它不支持(如2010年11月)的规划,你会难过!

更新2017年7月

对于那些现在正在阅读这个答案,它是过时的,因为它是指追溯技术堆栈。查看评论以获取更多详情

21

我讨厌对那些说“这是一种新型,让我们使用它”的人做出反向。新的SQL Server 2008空间类型有一些优点 - 即效率,但是你不能盲目说总是使用这种类型。这真的取决于一些更大的图片问题。

作为一个例子,集成。这种类型在.Net中具有equivilent类型 - 但interop是什么?那么支持或扩展旧版本的.Net怎么样?将服务层中的这种类型暴露给其他平台呢?对数据规范化怎么样 - 也许你对独立的信息感兴趣。也许你已经写了复杂的业务逻辑来处理长/经纬度。

我不是说你不应该使用的空间类型 - 在你应该很多情况下。我只是说,在走下这条道路之前,你应该问一些更重要的问题。对于我最准确地回答你的问题,我需要更多地了解你的具体情况。

存储经度/纬度单独地或以一个空间类型都可行的解决方案,并且一个可能优选的是在其它根据自己的情况。

15

我做的方式:我存储纬度经度,然后我有一个第三列这是第一两列的自动导出的地理类型。该表是这样的:

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目的,还可以检索的纬度和经度值。

0

注意:这是基于最近的SQL服务器上的最近的答案,.NET栈更新

latitute和经度从谷歌地图应该被存储为点(注意资本P)在SQL数据服务器在地理数据类型下。

假设您目前的数据是根据列latlon存储在表Sample为varchar,下面的查询将帮助你转换地理学

alter table Sample add latlong geography 
go 
update Sample set latlong= geography::Point(lat,lon,4326) 
go 

PS:当你做一个选择在这个下一次除了结果和消息选项卡之外,您还将获得如下所示的空间结果选项卡以用于可视化:

SSMS geo results tab

相关问题