2008-11-30 6 views
7

Ngày nay hầu hết các Nhà hàng và các doanh nghiệp khác có chức năng "Find Locations" trên trang web của họ liệt kê các địa điểm gần nhất cho một địa chỉ/Zip đã cho. Điều này được thực hiện như thế nào? Việc kết hợp mã zip với DB là một cách đơn giản để không làm việc nhưng có thể không phải lúc nào cũng hoạt động, ví dụ có thể có một chi nhánh gần với vị trí đã cho nhưng có thể ở một mã zip khác. Một cách tiếp cận mà tôi nghĩ đến là chuyển đổi mã zip/địa chỉ đã cho thành các tọa độ bản đồ và liệt kê bất kỳ nhánh nào rơi vào bán kính được xác định trước. Tôi hoan nghênh suy nghĩ của bạn về cách thức này sẽ được triển khai. Nếu có thể cung cấp chi tiết triển khai chi tiết hơn như bất kỳ dịch vụ web nào được sử dụng, v.v.Làm cách nào để "Tìm Địa điểm gần nhất" hoạt động?

Trả lời

6

Rất nhiều các khuôn khổ không gian địa lý sẽ giúp bạn ra ngoài với điều này. Trong thế giới không gian địa lý, một mã zip chỉ là một "đa giác", mà chỉ là một khu vực trên bản đồ xác định ranh giới rõ ràng (không phải là một đa giác theo nghĩa toán học). Ví dụ, trong SQL 2008 không gian, bạn có thể tạo một đa giác mới dựa trên đa giác ban đầu của bạn. Vì vậy, bạn có thể tự động tạo đa giác là mã zip của bạn được mở rộng theo một khoảng cách nhất định tại mọi điểm. Nó có hình dạng sôi nổi của mã zip vào tài khoản. Với một địa chỉ, Thật dễ dàng, bởi vì bạn chỉ cần tạo một đa giác, là một vòng tròn xung quanh một điểm. Sau đó, bạn có thể thực hiện các truy vấn cung cấp cho bạn tất cả các điểm trong đa giác mới mà bạn đã tạo trong cả hai phương pháp.

Rất nhiều trang web này về cơ bản chỉ thực hiện việc này. Chúng cung cấp cho bạn tất cả các điểm trong phạm vi đa giác mở rộng 5 dặm, và sau đó có thể là đa giác mở rộng 10 dặm, v.v. Họ không thực sự tính toán khoảng cách. Hầu hết những thứ ma trên web không phức tạp chút nào.

Bạn có thể xem một số ví dụ cơ bản here để có được ý tưởng chung về những gì tôi đang nói đến.

0

Cũng giống như bạn đã nói. Chuyển đổi địa chỉ/ZIP thành tọa độ 2D thế giới và so sánh nó với các vị trí đã biết khác. Chọn gần nhất. :) Tôi nghĩ rằng một số DB (Oracle, MSSQL 2008) thậm chí cung cấp một số chức năng có thể giúp đỡ, nhưng tôi chưa bao giờ sử dụng chúng.

0

Tôi nghĩ nó khá phổ biến. Họ lấy địa chỉ hoặc mã zip và biến nó thành một "bản đồ phối hợp" (khác nhau tùy thuộc vào việc thực hiện, có thể là một lat/long) và sau đó sử dụng "bản đồ tọa độ" của những thứ trong cơ sở dữ liệu nó rất dễ dàng để tính toán một khoảng cách.

Lưu ý rằng một số triển khai kém chuyển đổi mã zip vào tọa độ đại diện cho trung tâm của vùng zipcode, đôi khi mang lại kết quả không tốt.

0

Suy nghĩ của bạn về cách thực hiện nó là cách tôi có thể làm điều đó. Bạn có thể mã hóa địa lý đồng được phân tách cho zip và sau đó thực hiện các phép tính dựa trên đó. Tôi biết SQL Server 2008 có một số chức năng mới đặc biệt để giúp thực hiện các truy vấn dựa trên các tọa độ đơn vị/vĩ độ địa lý.

4

Có sẵn cơ sở dữ liệu vị trí/mã zip chuẩn. Here is one version in Access format bao gồm lat/long của mã zip cũng như thông tin khác. Sau đó, bạn có thể sử dụng tiện ích mở rộng của PostgreSQL GIS để thực hiện tìm kiếm trên các vị trí chẳng hạn.

(giả sử tất nhiên mà bạn trích xuất các db truy cập và chèn vào một cơ sở dữ liệu thân thiện hơn như PostgreSQL)

1

Trước tiên, bạn mã hóa địa chỉ, dịch sang (thường) vĩ độ và kinh độ. Sau đó, bạn thực hiện truy vấn lân cận gần nhất trên cơ sở dữ liệu của bạn cho các điểm quan tâm.

Hầu hết các chỉ mục không gian không trực tiếp hỗ trợ các truy vấn lân cận gần nhất, do đó, cách tiếp cận thông thường ở đây là truy vấn trên một hộp giới hạn có kích thước hợp lý với điểm mã hóa địa lý ở giữa, sau đó sắp xếp kết quả trong bộ nhớ để chọn gần nhất.

0

Có các thuật toán hình học thực tế và/hoặc cơ sở dữ liệu hỗ trợ các truy vấn vị trí gần nhất O (...) gần nhất trên dữ liệu điểm, đường và/hoặc vùng.

Xem this book như một ví dụ về thông tin trên một số trong số họ, như: sơ đồ Voronoi, quadtrees vv

Tuy nhiên tôi nghĩ rằng câu trả lời khác ở đây là đúng trong nhiều trường hợp mà bạn tìm thấy trong phần mềm hiện nay:

  1. geocode (một điểm duy nhất trong) khu vực tìm kiếm
  2. bounding truy vấn hộp để có được một sân chơi bóng chày đầu tiên
  3. trong bộ nhớ sắp xếp/chọn
0

Tôi có bảng mà tôi sẽ biên dịch một bảng cơ sở dữ liệu mỗi 6 tháng, nó chứa 3 cột, tôi sử dụng nó cho một vài khách hàng ở Úc, nó chứa khoảng 40k hàng, rất nhẹ để chạy truy vấn. này là khá nhanh, nếu chỉ tìm cách để có được một cái gì đó lên khỏi mặt đất cho một khách hàng

  1. Postal Code từ
  2. Postal Code Để
  3. cách

    CHỌN Store_ID, Store_AccountName, Store_PostalCode, Store_Address, Store_Suburb, Store_Phone, Store_State, Cửa hàng Code_Distance FROM, (SELECT Code_To Như Code_To, Code_Distance FROM Code WHERE Code_From = @PostalCode UNION ALL SELECT Code_From Như Code_To, Code_Distance FROM Code WHERE Code_To = @PostalCode UNION AL L CHỌN @PostalCode Như Code_To, 0 Như Code_Distance) Như Mã ĐÂU Store_PostalCode = Code_To VÀ Code_Distance < = @Distance ORDER BY Code_Distance

Có thể có rất nhiều tối ưu hóa mà bạn có thể làm để tăng tốc độ truy vấn này !.