2009-02-16 13 views
91

Tôi đang thiết kế một bảng trong SQL Server 2008 sẽ lưu trữ danh sách người dùng và tọa độ của Google Maps (kinh độ & vĩ độ).Cách tốt nhất để lưu trữ tọa độ (kinh độ/vĩ độ, từ Google Maps) trong SQL Server là gì?

Tôi có cần hai trường hoặc có thể thực hiện bằng 1 trường không?

Loại dữ liệu tốt nhất (hoặc phổ biến nhất) để sử dụng để lưu trữ loại dữ liệu này là gì?

Trả lời

11

Máy chủ SQL hỗ trợ thông tin liên quan không gian. Bạn có thể xem thêm tại http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx.

Ngoài ra, bạn có thể lưu trữ thông tin dưới dạng hai trường cơ bản, thường là phao là loại dữ liệu chuẩn được báo cáo bởi hầu hết các thiết bị và đủ chính xác trong vòng một hoặc hai inch - quá đủ cho Google Maps.

-4

Nếu bạn chỉ là đi để thay thế nó thành một URL Tôi cho rằng một lĩnh vực sẽ làm gì - vì vậy bạn có thể tạo thành một URL như

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

nhưng vì nó là hai mẩu dữ liệu tôi sẽ lưu trữ chúng trong riêng lĩnh vực

+0

Trường hợp này của tôi. Tôi cần lưu trữ tọa độ chỉ trong một trường và được phân cách bằng dấu phẩy. Tôi nghĩ rằng người ta có thể sử dụng TEXT như một loại trường. Bạn nghĩ sao? – Amr

-10

cửa hàng vừa là float, và sử dụng các từ khóa duy nhất trên them.i.em

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

Tôi không hiểu. Tại sao hạn chế họ là duy nhất? –

+0

Để đảm bảo rằng chỉ có một tập hợp vĩ độ và kinh độ. Bạn không muốn lưu trữ tọa độ {0,0} hai lần trong bảng của bạn, phải không? – Graviton

+1

Có thể bạn không muốn có một bảng tọa độ riêng biệt như thế này, đặc biệt với sự ràng buộc duy nhất đó là một cơn ác mộng duy trì việc xử lý trường hợp hai địa điểm tham chiếu đến cùng một điểm, chưa kể đến việc dọn dẹp các hàng không được trả lời. – araqnid

28

tôi không biết câu trả lời cho SQL server nhưng ...

Trong MySQL tiết kiệm nó như FLOAT(10, 6)

Đây là đề nghị chính thức từ Google developer documentation.

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

Câu hỏi nêu rõ SQL Server, không phải MySQL. Và bạn chắc chắn sẽ không muốn một cái bàn chỉ với vĩ độ và kinh độ như thế. – araqnid

+2

Câu trả lời đồng ý. Sử dụng loại không gian GEOGRAPHY mới. –

+2

Liên kết cũng đã chuyển, tới http://code.google.com/apis/maps/articles/phpsqlajax.html –

15

Điều bạn muốn làm là lưu trữ Vĩ độ và kinh độ làm loại không gian SQL2008 mới -> GEOGRAPHY.

Đây là ảnh chụp màn hình của bảng mà tôi có.

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

Trong bảng này, chúng ta có hai lĩnh vực mà lưu trữ dữ liệu địa lý.

  • Boundary: đây là đa giác đó là ranh giới zip code
  • CentrePoint: đây là điểm Latitude/Longitude đại diện cho quan điểm giữa hình ảnh của đa giác này.

Lý do chính tại sao bạn muốn lưu nó vào cơ sở dữ liệu dưới dạng loại lược đồ để bạn có thể tận dụng tất cả các phương thức SPATIAL -> ví dụ. Điểm trong Poly, Khoảng cách giữa hai điểm, v.v.

BTW, chúng tôi cũng sử dụng API Maps của Google để truy xuất dữ liệu lat/long và lưu trữ trong Sql 2008 DB của chúng tôi - vì vậy phương pháp này hoạt động.

+1

Và nếu bạn chưa làm việc vào năm 2008, hoặc nếu bạn sử dụng SQLCE thì sao? Nếu không hỗ trợ kiểu địa lý ... – fretje

+3

Nếu SqlCE hoặc <2008 hỗ trợ nhị phân, có thể lưu trữ kết quả là varbinary và sau đó sử dụng thư viện công cụ Spatial dll để thực hiện các phép tính không gian đối với biểu diễn dữ liệu nhị phân này trong .NET của bạn. mã. Không phải là giải pháp tốt nhất, nhưng vẫn là một giải pháp có thể cho * một số vấn đề *. (nuget cho sql không gian .. để lấy dll đó). –

+2

Liên kết hình ảnh bị hỏng –

59

Cảnh báo công bằng! Trước khi lấy lời khuyên để sử dụng loại GEOGRAPHY, hãy đảm bảo bạn không có kế hoạch sử dụng LINQ hoặc Entity Framework để truy cập dữ liệu vì nó không được hỗ trợ (tính đến tháng 11 năm 2010) và bạn sẽ buồn!

Cập nhật Jul 2017

Đối với những người đọc câu trả lời này ngay bây giờ, nó đã lỗi thời vì nó đề cập đến công nghệ ngăn xếp lùi ngày. Xem nhận xét để biết thêm chi tiết.

+1

Vì câu trả lời gốc đã được đăng, tôi tìm thấy bài viết này http://www.jasonfollas.com/blog/archive/2010/02/14/spatial-data-and- –

+53

Cảnh báo không còn giá trị EF hiện hỗ trợ các loại địa lý –

+1

EF không hỗ trợ không hỗ trợ các loại không gian, nó sử dụng loại khác nhau được đặt cho WCF Data Services, do đó không tương thích – abatishchev

21

Tôi ghét phải trái ngược với những người đã nói "đây là loại mới, hãy sử dụng nó". Các kiểu không gian SQL Server 2008 mới có một số ưu điểm cho nó - cụ thể là hiệu quả, tuy nhiên bạn không thể mù quáng nói luôn sử dụng kiểu đó. Nó thực sự phụ thuộc vào một số vấn đề hình ảnh lớn hơn.

Ví dụ: tích hợp. Loại này có loại tương đương trong .Net - nhưng về interop thì sao? Điều gì về việc hỗ trợ hoặc mở rộng các phiên bản cũ hơn của .Net? Điều gì về việc phơi bày loại này trên lớp dịch vụ với các nền tảng khác? Điều gì về bình thường hóa dữ liệu - có thể bạn quan tâm đến lat hoặc dài như những phần thông tin độc lập. Có lẽ bạn đã viết logic kinh doanh phức tạp để xử lý lâu/lat.

Tôi không nói rằng bạn không nên sử dụng loại không gian - trong nhiều trường hợp bạn nên làm. Tôi chỉ nói rằng bạn nên hỏi một số câu hỏi quan trọng hơn trước khi đi xuống con đường đó. Đối với tôi để trả lời câu hỏi của bạn chính xác nhất, tôi sẽ cần phải biết thêm về tình hình cụ thể của bạn.

Lưu trữ dài/lat riêng biệt hoặc trong một loại không gian là cả hai giải pháp khả thi, và người ta có thể thích hợp với người khác tùy thuộc vào hoàn cảnh của riêng bạn.

+0

Việc xử lý dữ liệu không gian và GIS có một lịch sử lâu dài và các biểu diễn nhị phân, văn bản tiêu chuẩn từ những năm 2000 ít nhất.Bạn sẽ kết thúc với tất cả các vấn đề bạn đã đề cập nếu bạn * không * sử dụng các loại không gian và các biểu diễn tiêu chuẩn –

15

Cách tôi làm: Tôi lưu trữ vĩ độkinh độ và sau đó tôi có cột thứ ba là loại địa lý có nguồn gốc tự động của hai cột đầu tiên. bảng trông như thế này:

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))) 
) 

này mang lại cho bạn sự linh hoạt của các truy vấn không gian trên cột geoPoint và bạn cũng có thể lấy các giá trị vĩ độ và kinh độ như bạn cần họ để trưng bày hoặc giải nén cho các mục đích csv.

+0

tuyệt vời cho những gì tôi đang tìm kiếm, bạn có bất cứ điều gì cho các bản nhạc/dòng – aggie

+0

Một cách tiếp cận khác cũng có thể hoạt động , tùy thuộc vào kịch bản của bạn, lưu trữ lâu dài và lat, và sau đó chỉ cần tạo động đối tượng địa lý khi đang chạy. – Zapnologica

+1

Ý tưởng tuyệt vời nhưng lưu ý rằng bạn không thể tạo các chỉ mục không gian trên các cột được tính nếu đó là ý định của ai đó. – hvaughan3

0

LƯU Ý: Đây là một câu trả lời gần đây dựa trên máy chủ SQL gần đây, NET chồng cập nhật

latitute và kinh độ từ google Maps nên được lưu trữ như Point (lưu ý vốn P) dữ liệu trong SQL máy chủ theo loại dữ liệu địa lý.

Giả sử dữ liệu hiện tại của bạn được lưu trữ trong một bảng Sample như varchar dưới cột latlon, dưới đây truy vấn sẽ giúp bạn chuyển đổi sang địa lý

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

PS: Tiếp theo thời gian khi bạn làm một lựa chọn về vấn đề này bảng với dữ liệu địa lý, ngoài tab Kết quả và Tin nhắn, bạn cũng sẽ nhận được tab kết quả Không gian như dưới đây để hiển thị

SSMS geo results tab