2013-04-07 54 views
16

Tôi mới sử dụng các tính năng định vị mongodb.Mongodb: Kiểm tra xem một điểm có nằm trong một đa giác được lưu trữ không

Tôi đã lưu trữ một số đa giác đại diện cho biên giới quốc gia trong cơ sở dữ liệu cùng với tên quốc gia. Bây giờ điều tôi muốn làm là kiểm tra xem quốc gia nào có điểm. Ví dụ: nếu tôi cung cấp vị trí địa lý của riêng tôi, tôi muốn có quốc gia nơi tôi đang ở.

Có cách nào để làm điều đó với mongodb không? Có lẽ với geoWithin?

Cảm ơn bạn

+0

Vui lòng kiểm tra câu trả lời này: http://stackoverflow.com/questions/ 12095965/mongodb-how-can-i-check-if-a-point-được-chứa-trong-một-đa giác và http://stackoverflow.com/questions/10774427/how-to-find-if-a- point-exist-in-which-polygon. Dường như cả hai đều có liên quan và có giải pháp. – brotherofken

+2

Tôi cần giống nhau. @brotherofken: câu hỏi là chính xác ngược lại: Tôi cần phải tìm kiếm mà đa giác (được lưu trữ trên mongodb) có chứa một điểm tham số. Tôi không thể tìm thấy bất kỳ ví dụ nào theo hướng này. –

+0

Tôi cần phải tìm một điểm nằm trong vòng tròn khép kín. Bất kỳ khách hàng tiềm năng nào về cách tôi sẽ đạt được điều đó? –

Trả lời

4

Có, bạn có thể sử dụng $geoWithin cho việc kiểm tra, miễn là bạn xác định những quốc gia như đa giác sử dụng GeoJSON. Để làm điều đó, hãy thử this GitHub repo.

+1

Cảm ơn bạn về đa giác nhưng tôi đã có một bộ chính xác hơn, tôi không nhớ nơi tôi đã nhận nó mặc dù. Bạn có nghĩ rằng tôi sẽ phải lặp qua tất cả các đa giác này để tìm ra điểm nào hay không Mongodb geoWithin giúp tôi tránh được loại backtracking này? – SkinyMonkey

+0

$ geoWithin hoạt động với một đa giác duy nhất. – Sim

+1

geoWithin trả về tất cả các tính năng * trong * đa giác. geoIntersects trả về đối tượng địa lý * giao nhau * với một đối tượng địa lý (một điểm, trong trường hợp này). Vì vậy, trong trường hợp này, geoIntersects cung cấp cho bạn chính xác những gì bạn muốn trong một truy vấn, trong khi bạn phải chạy geoWithin với mọi đa giác mà bạn có. –

5

Bạn phải sử dụng $geoIntersects cho điều đó.

db.features.find({mystoredpolygon:{$geoIntersects:{$geometry:{type:'Point', coordinates:[22,38]}}}}) 
+0

Có, $ geoIntersects hoạt động. Đây là liên kết tham chiếu: [MongoDB $ geoIntersects] (http://docs.mongodb.org/manual/reference/operator/query/geoIntersects/) – Adam

6

Bạn phải lưu trữ dữ liệu vị trí của bạn như schema này:

{"loc": 
    {"coordinates":[ 
     [ 
     [1.0,1.0], 
     [1.0,10.0], 
     [10.0,10.0], 
     [10.0,1.0], 
     [1.0,1.0] 
     ] 
     ], 
    "type":"Polygon" 
    } 
} 

và sau đó gửi $geoIntersects truy vấn

db.polygons.find({"loc":{"$geoIntersects":{"$geometry":{"type":"Point", "coordinates":[x, y]}}}} 
+0

Bất kỳ lý do nào có một mảng trong một mảng cho tọa độ? Điều gì sẽ thêm một tập hợp các tọa độ khác cho chúng ta? ví dụ: [[[1.1], ...], [[2,2] ...]] –

+0

có lẽ một đa giác có thể được đặt bên trong –

+0

Yup khác, tôi đã phát hiện ra một lúc trước rằng các phần tử mảng tiếp theo chỉ định đa giác "cắt bỏ" phần bên ngoài. https://developers.google.com/maps/documentation/javascript/examples/layer-data-simple –

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