Answers:
请看一下SQL Server 2008中引入的新Spatial数据类型。它们是为此类任务而设计的,使索引和查询变得更加轻松和高效。
更多信息:
公平警告!在接受有关使用GEOGRAPHY类型的建议之前,请确保您不打算使用Linq或Entity Framework访问数据,因为该数据不受支持(截至2010年11月),您会为此感到遗憾!
2017年7月更新
对于那些现在阅读此答案的人来说,它已过时,因为它指的是落后的技术堆栈。请参阅评论以获取更多详细信息。
我不知道SQL Server的答案,但是...
在MySQL中另存为FLOAT( 10, 6 )
这是Google开发者文档中的官方建议。
CREATE TABLE `coords` (
`lat` FLOAT( 10, 6 ) NOT NULL ,
`lng` FLOAT( 10, 6 ) NOT NULL ,
) ENGINE = MYISAM ;
lat
和lng
性能georgraphy
甚至优于SQL 2014中的高密度索引。例如:查找所有点都带有矩形。只是我不确定,我知道Google地图现在使用7而不是6位数吗?
这样做的方式:存储纬度和经度,然后有第三列,这是第一列和第二列的自动派生的地理类型。该表如下所示:
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。
Point
代替STGeomFromText
。例如:[geography]::Point([Latitude], [Longitude], 4326)
。
我讨厌对那些说“这是一种新类型,让我们使用它”的人表示反对。新的SQL Server 2008空间类型具有一些优点-即效率,但是您不能盲目地说总是使用该类型。这实际上取决于更大的图片问题。
例如,集成。这种类型在.Net中具有等价类型-但是互操作又如何呢?如何支持或扩展旧版本的.Net?将这种类型跨服务层暴露给其他平台呢?关于数据的规范化-也许您对lat或长期以来的独立信息感兴趣。也许您已经编写了复杂的业务逻辑来处理经/纬度。
我并不是说您不应该使用空间类型-在许多情况下应该使用。我只是说你在走那条路之前应该问一些更关键的问题。为了使我能够最准确地回答您的问题,我需要更多地了解您的具体情况。
分别存储长/经度或以空间类型存储都是可行的解决方案,根据您自己的情况,一个可能优于另一个。
您要做的是将纬度和经度存储为新的SQL2008空间类型-> GEOGRAPHY。
这是我的桌子的屏幕截图。
替代文字http://img20.imageshack.us/img20/6839/zipcodetable.png
在此表中,我们有两个用于存储地理数据的字段。
要将其以GEOGRAPHY类型保存到数据库的主要原因是,这样您就可以利用所有的SPATIAL方法了->例如。多边形中的点,两点之间的距离等
顺便说一句,我们还使用Google的Maps API检索经/纬度数据并将其存储在Sql 2008 DB中-因此此方法确实有效。
SQL Server支持与空间相关的信息。您可以在http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx上看到更多信息。
另外,您也可以将信息存储为两个基本字段,通常浮点数是大多数设备报告的标准数据类型,并且精度在1英寸或2英寸之内,足以满足Google Maps的要求。
注意:这是基于最新的SQL Server,.NET堆栈更新的最新答案。
Google Maps的纬度和经度应作为Point(注释大写P)数据存储在SQL服务器中的地理数据类型下。
假设您当前的数据Sample
以varchar的形式存储在表中的列lat
和lon
下方,则查询将帮助您转换为地理位置
alter table Sample add latlong geography
go
update Sample set latlong= geography::Point(lat,lon,4326)
go
PS:下次当您在此表上使用地理数据进行选择时,除了“结果和消息”选项卡之外,您还将获得“空间结果”选项卡,如下图所示
如果您使用的是Entity Framework 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/zh-CN/library/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);
}
}
将它们存储为float并在其上使用唯一的关键字。i.em
create table coordinates(
coord_uid counter primary key,
latitude float,
longitude float,
constraint la_long unique(latitude, longitude)
);
House A
并将搬到他House B
的家。很快,鲍勃(Bob)将无法保存他的地址(位置),因为爱丽丝(Alice)尚未更新她的地址(或永远不会更新)。