2009-02-16 83 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

相關問題