什么是最好的方式来存储协调(纬度/经度、谷歌地图)在SQL服务器?
-
23-08-2019 - |
题
我设计的一个表中SQL服务器2008年将存储用户的列表和一个谷歌地图坐标(经度和纬度)。
我需要两个领域,或者可以这样做有1?
什么是最佳的(或最常见的)数据使用的类型,用于储存这类数据?
解决方案
看看新的空间数据的类型,介绍了在SQL服务器2008年。他们是专为此种任务,使索引和查询很容易和更有效率。
更多信息:
其他提示
公平的警告!在服用建议使用地理类型,请确保您不使用LINQ或实体框架来访问数据,因为它不支持计划(截至2010年11月)和你会难过!
<强>更新2017年7月强>
有关那些现在阅读这个答案,它是过时的,因为它是指回溯技术栈。看评论的更多细节。
我不知道SQL Server的答案,但... 的
在的的MySQL 强>将其保存为的 FLOAT( 10, 6 )
强>
这是从谷歌的开发者文档官方推荐
CREATE TABLE `coords` (
`lat` FLOAT( 10, 6 ) NOT NULL ,
`lng` FLOAT( 10, 6 ) NOT NULL ,
) ENGINE = MYISAM ;
我讨厌被逆势那些谁说:“这里是一个新的类型,让我们使用它”。新的SQL Server 2008的空间类型有一定的利弊吧 - 也就是效率,但你不能一味地说总是使用该类型。这真的取决于一些大局观的问题。
作为一个例子,集成。这种类型在.NET中equivilent类型 - 但如何互操作?什么支持或延长旧版本的.NET?怎么样在整个服务层暴露这种类型的其他平台?有关数据标准化是什么 - 也许你有兴趣纬度或长期作为信息的独立作品。也许你已经编写复杂的业务逻辑处理长/纬度。
我不是说你不应该使用的空间类型 - 在你应该很多情况下。我只是说你应该问才去沿着这条路走下去一些关键问题。对我来说,最准确地回答你的问题,我需要更多地了解你的具体情况。
存储经度/纬度单独地或以空间型都是可行的解决方案,并且根据自己的情形之一的可能优选的是其他
我做的方式:我存储纬度和经度然后我有一个第三列这是第一两列的自动导出的地理类型。表看起来像这样:
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空间类型->地理。
这里有一个屏幕的一个表,我有。
alt文本http://img20.imageshack.us/img20/6839/zipcodetable.png
在这个表格中,我们有两个领域存储的地理数据。
- 边界:这是对面的邮政编码分界
- 中心点:这是纬度/经度点,表示这些中间点的这一面。
主要原因为什么你要保存的数据库作为一个地理类型是这样你就可以利用所有空间法关闭它->。点在聚,两点之间的距离,等等。
顺便说一句,我们还使用谷歌地图API检索纬度/经度的数据和存储,在我们Sql2008数据库--这样这种方法的工作。
SQL服务器支持的空间相关的信息。你可以看到更多 http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx.
Alternativly你可以存储的信息作为两个基本领域,通常会浮动是标准的数据类型报告的大多数设备是不够准确为在一英寸或二多充足的谷歌地图。
如果您正在使用实体框架5',你可以使用DbGeography
。从MSDN示例:
public class University
{
public int UniversityID { get; set; }
public string Name { get; set; }
public DbGeography Location { get; set; }
}
public partial class UniversityContext : DbContext
{
public DbSet<University> Universities { get; set; }
}
using (var context = new UniversityContext ())
{
context.Universities.Add(new University()
{
Name = "Graphic Design Institute",
Location = DbGeography.FromText("POINT(-122.336106 47.605049)"),
});
context. Universities.Add(new University()
{
Name = "School of Fine Art",
Location = DbGeography.FromText("POINT(-122.335197 47.646711)"),
});
context.SaveChanges();
var myLocation = DbGeography.FromText("POINT(-122.296623 47.640405)");
var university = (from u in context.Universities
orderby u.Location.Distance(myLocation)
select u).FirstOrDefault();
Console.WriteLine(
"The closest University to you is: {0}.",
university.Name);
}
https://msdn.microsoft。 COM / EN-US /库/ hh859721(v = vs.113)的.aspx
东西我然后挣扎我开始使用DbGeography
是coordinateSystemId
。请参见下面的答案为下面的代码优异的说明和来源。
public class GeoHelper
{
public const int SridGoogleMaps = 4326;
public const int SridCustomMap = 3857;
public static DbGeography FromLatLng(double lat, double lng)
{
return DbGeography.PointFromText(
"POINT("
+ lng.ToString() + " "
+ lat.ToString() + ")",
SridGoogleMaps);
}
}
如果你只是把它代入我想一个领域会做一个URL - 这样你就可以形成像
一个URLhttp://maps.google.co.uk/maps?q=12.345678,12.345678&z=6
但是,因为它是两个数据我将它们存储在单独的字段
店铺既作为浮动,并在them.i.em使用唯一关键字
create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);