2010-01-09 41 views
10

Tôi đang cố gắng xây dựng một truy vấn, nhưng tôi đang gặp một số khó khăn.SQL Server Địa lý datatype điểm gần nhất trên dòng

Tôi có cơ sở dữ liệu SQL Server 2008 với một bảng bao gồm, trong số các trường khác, trường địa lý mô tả đoạn đường. (Dữ liệu này đã được nhập từ dữ liệu TIGER/Line từ Tổng điều tra Hoa Kỳ.)

Tôi có một điểm cố định khác mô tả vị trí của người dùng. Tôi muốn tìm đoạn đường gần nhất trong cơ sở dữ liệu đến thời điểm đó, nhưng tôi dường như không thể tìm ra cách để thực hiện điều này. Hơn nữa, tôi muốn tìm điểm gần nhất trên phân khúc đó đến điểm vị trí của người dùng. Đây là những gì tôi muốn chọn và trả lại trong truy vấn của mình.

Có ai có kinh nghiệm về chức năng địa lý/hình học có thể giúp tôi không?

Cảm ơn!

+0

Bạn có thể muốn thêm một số loại thông tin lĩnh vực. Ví dụ: bạn có một điểm cố định để mô tả vị trí của người dùng, đây có phải là cặp tọa độ Kinh độ và Latitude không? Tôi có kinh nghiệm với các chức năng địa lý, nhưng cần thêm chi tiết ... – Sparky

+0

Tôi đang cung cấp điều này từ ứng dụng của tôi, vì vậy tôi đang đi qua một cuộc tranh luận. Tôi ổn với khá nhiều loại dữ liệu là cần thiết. –

Trả lời

18

Bạn có thể lưu trữ đối tượng của bạn trong một cột GEOGRAPHY và tạo ra một SPATIAL INDEX trên cột này.

Thật không may, SQL Server thực hiện các chỉ số không gian bằng cách ốp lát bề mặt và lưu trữ các định danh gạch trong một B-Tree chỉ số đơn giản, quá đơn giản tới ORDER BY STDistance sẽ không hoạt động (tốt, nó sẽ làm việc nhưng sẽ không sử dụng chỉ mục).

Thay vào đó, bạn sẽ phải thực hiện một truy vấn tương tự như sau:

DECLARE @mypoint GEOGRAPHY 
SET @mypoint = geography::STGeomFromText('POINT(@mylat, @mylon)', 4326); 

WITH num (distance) AS 
     (
     SELECT 1000 
     UNION ALL 
     SELECT distance + 1000 
     FROM num 
     WHERE distance <= 50000 
     ) 
SELECT TOP 1 m.* 
FROM num 
CROSS APPLY 
     (
     SELECT TOP 1 * 
     FROM mytable 
     WHERE myroad.STDistance(@mypoint) <= distance 
     ORDER BY 
       STDistance(@mypoint) 
     ) m 

Bằng cách này, SQL Server đầu tiên sẽ tìm kiếm những con đường trong 1 km từ quan điểm của bạn, sau đó trong vòng 2 km vv, mỗi lần sử dụng chỉ mục.

Cập nhật:

Nếu bạn có nhiều điểm trong một bảng và muốn tìm điểm gần nhất cho mỗi người trong số họ:

WITH num (distance) AS 
     (
     SELECT 1000 
     UNION ALL 
     SELECT distance + 1000 
     FROM num 
     WHERE distance <= 50000 
     ) 
SELECT mp.mypoint, m.* 
FROM @mypoints mp 
CROSS APPLY 
     (
     SELECT TOP 1 m.* 
     FROM num 
     CROSS APPLY 
       (
       SELECT TOP 1 * 
       FROM mytable 
       WHERE myroad.STDistance(@mypoint) <= distance 
       ORDER BY 
         STDistance(@mypoint) 
       ) m 
     ) m 
+2

Câu trả lời hay nhất tôi nghĩ mình từng gặp trên StackOverflow. Cảm ơn vì đã cho tôi biết không chỉ là 'ORDER BY', đó có lẽ là những gì tôi sẽ kết thúc khi thực hiện. –

+0

@Pure: chỉ cần áp dụng truy vấn của tôi vào '@ mypoints' – Quassnoi

+0

hi. Tôi không chắc chắn nếu @Pure Krome đã tìm ra nó, nhưng tôi không thể có được nó. * Cross Áp dụng truy vấn của tôi vào @ myPoints * ?? Tôi không hiểu: (Bạn có thể vui lòng cập nhật câu trả lời của bạn không?) – RPM1984

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