2013-03-26 37 views
16

Tôi đã tìm thấy một loạt câu trả lời cho câu hỏi này bằng cách sử dụng mysql, nhưng tôi không thể chuyển đổi bất kỳ thứ gì thành truy vấn ms sql 2008 có thể sử dụng. Tôi có một cột kinh độ và vĩ độ cho mỗi hàng trong cơ sở dữ liệu. Tôi sẽ có vĩ độ và kinh độ cho người dùng ở đâu. Tôi muốn có thể tìm thấy tất cả các hàng đó nằm trong x dặm từ của người dùng vĩ độ/kinh độ. Ngoài ra khi cố gắng sử dụng các truy vấn khác tôi tìm thấy trên SO tôi tiếp tục nhận được lỗi - 'pow' is not a recognized built-in function name. đó là lạ, bởi vì tôi khá chắc chắn rằng tôi đã sử dụng pow trước trong sql 2008. Bất kỳ trợ giúp với điều này sẽ được đánh giá rất nhiều. Cho đến nay đây là gần nhất có thể đến với.tìm kiếm bán kính theo vĩ độ/kinh độ

select * from tbl_MyTable 
WHERE (
POW((69.1 * (Longitude - @longitude) * cos(@latitude/57.3)) , 2) + POW((69.1 * (Latitude - @latitude)) , 2) 
) < (5 *5); 

Trả lời

28

Kể từ khi bạn đang ở trên SQL 2008, xem xét sử dụng các khả năng không gian địa lý tự nhiên. Bạn có thể làm những điều ưa thích như:

  • Tạo cột được tính toán liên tục của loại địa lý đại diện cho điểm của bạn.
  • Tạo chỉ mục không gian trên cột được tính. Điều này sẽ làm cho mọi việc như yourPoint.STDistance(@otherPoint) <= @distance hiệu quả

Giống như vậy:

alter table [yourTable] add [p] as geography::Point(Latitude, Longitude, 4326) persisted; 
create spatial index [yourSpatialIndex] on [yourTable] ([p]) 

declare @Longitude float = <somevalue>, @Latitude float = <somevalue>; 
declare @point = geography::Point(@Latitude, @Longitude, 4326); 
declare @dist = <distance in meters>; 

select * from [yourTable] where @point.STDistance([p]) <= @distance; 
+0

bạn có liên kết để thiết lập điều đó không? Tôi nghĩ rằng đó là một cái gì đó mới trong ms sql 2012 –

+1

Xem chỉnh sửa. Hãy cho tôi biết nếu bạn có câu hỏi khác. –

+0

tuyệt vời, cảm ơn người đàn ông, đây là một cách tốt hơn câu trả lời, tôi không muốn lấy đi từ câu trả lời chấp nhận của derek kể từ khi về mặt kỹ thuật đã trả lời câu hỏi của tôi và đầu tiên là –

5

Tôi nghĩ rằng bạn muốn ĐIỆN không pow

http://msdn.microsoft.com/en-us/library/ms174276.aspx

+1

wow - đó là ngu ngốc, nhờ –

+0

này đã sửa chữa nó, nhưng Ben đã viết ra một cách toàn diện được lập chỉ mục nhanh hơn để thực hiện truy vấn này –

+0

Tất cả đều tốt, theo lời của một vị tướng cờ tướng vô danh: "Khi tôi tìm thấy một động thái tốt, tôi tìm kiếm một động thái tốt hơn". –

Các vấn đề liên quan