2010-07-13 28 views
7

Tôi đang làm việc trên Grails 1.3.2 với MySql. Tôi cần lưu trữ vĩ độ và kinh độ của một số vị trí nhất định trong cơ sở dữ liệu và sau đó trên cơ sở vị trí hiện tại của người dùng, tôi cần trả lại các mục nằm trong bán kính cụ thể của vị trí đó. Vì vậy, chúng tôi về cơ bản có các yêu cầu sau:Làm thế nào để thực hiện tìm kiếm không gian (Geo-Location) trong Grails?

  1. Tìm kiếm vị trí với trong một bán kính nhất định tọa độ hiện tại của người dùng
  2. Cung cấp một tìm kiếm văn bản đầy đủ. Chúng tôi hiện đang sử dụng khả năng tìm kiếm cho số điện thoại
  3. Thực hiện kết hợp tìm kiếm toàn văn bản trong một bán kính nhất định của các tọa độ hiện tại của người dùng.

Tôi đã xem xét các tùy chọn khác nhau mà chúng tôi có ở đây và muốn biết quan điểm/đề xuất của bạn để triển khai điều này là gì. Các tùy chọn khác nhau mà chúng ta có ở đây là:

  1. Lucene không gian tìm kiếm (http://wiki.apache.org/lucene-java/SpatialSearch) và nhìn vào cách sử dụng nó với tìm kiếm

  2. Grails Solr Plugin (http://www.grails.org/plugin/solr). Nhưng điều này không trả về các đối tượng miền.

  3. Mũi khâu mũi khoan Plugin (http://www.grails.org/plugin/stitches). Không có nhiều tài liệu ngoại trừ trên trang của tác giả (http://www.philliprhodes.com/content/stitches-30-seconds).

  4. Tiện ích mở rộng không gian MySql cùng với chỉ mục văn bản đầy đủ trên tất cả các trường của lớp miền. Nếu chúng ta đi tuyến đường này, thì chúng ta sẽ không sử dụng được.

  5. Postgres/PostGIS hội nhập với hibernate-không gian (http://blog.mollusca.ch/2008/10/4/grails-spatial-data-postgis)

Tôi tin rằng đây là một yêu cầu rất cơ bản trong bất kỳ ứng dụng tích hợp với bản đồ.

Vì vậy, tôi thực sự quan tâm đến việc biết cách thích hợp nhất để triển khai chức năng này.

Cảm ơn

Trả lời

4

(Tôi đã thực hiện một nguyên mẫu sử dụng Long/Lạt để tìm hàng trong vòng bán kính, nhưng bây giờ đã bị bỏ rơi mà có lợi cho hệ thống GridRef sẵn ở Anh)

Là một bước đầu tiên, không sử dụng điều kiện WHERE dựa trên trường được tính toán (ví dụ khoảng cách thực tế dựa trên phối hợp đã cho và điều phối của hàng).

Thay vào đó, hãy thử này:

  1. Hãy tưởng tượng vòng tròn nơi bán kính = max khoảng cách
  2. Vẽ một hộp xung quanh nó bằng cách sử dụng dòng kinh độ cong.
  3. Tìm các mục trong hộp đó.

Trên thực tế điều này có nghĩa:

  1. rèn luyện sức khỏe bao nhiêu độ kinh độ đại diện cho khoảng cách tối đa theo vĩ độ cho
  2. rèn luyện sức khỏe bao nhiêu độ vĩ độ đại diện cho khoảng cách tối đa theo kinh độ nhất định (này số nhân sẽ được cố định khi sử dụng mô hình hình cầu trái đất).
  3. SELECT * FROM nơi dài> $ Westside và dài < $ Eastside VÀ lat < $ Northside và lat> $ Southside

Điều này có nghĩa bạn làm các phép tính rất đơn giản để có được một tập hợp con mơ hồ có diện tích khoảng 30 % lớn hơn vòng kết nối thực tế của bạn. Nếu bạn muốn thêm một tìm kiếm văn bản quá, hoặc SELECT FROM (subquery) hoặc thêm mệnh đề văn bản của bạn SAU so sánh đơn giản ở trên, như tìm kiếm văn bản là tốn kém tính toán.

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