2012-06-21 57 views
9

Tôi gặp vấn đề sau với MongoDB. Tôi có một số dữ liệu địa lý từ đất nước của tôi và tôi phải lưu trữ chúng vào mongodb để thiết lập một dịch vụ tính năng Web đơn giản. Dịch vụ này chủ yếu sẽ làm các truy vấn hộp giới hạn sử dụng toán tử $within. Dữ liệu ở định dạng GeoJSON. Vì vậy, tôi nhập khẩu lần đầu tiên tại các làng và thành phố được biểu diễn dưới dạng điểm ([1,2]) ở định dạng này. Không vấn đề gì. Bước sông và đường tiếp theo là LineStrings và theo GeoJSON đại diện theo cách này [[1,2],[3,4]]. Nhưng khi nhập khẩu các huyện (mà là trong thực tế đa giác và theo đặc tả GeoJSON 3 mờ arrrays) tôi đã nhận lỗi geo values have to be numbers khi tạo chỉ mục.Lưu trữ các đa giác GeoJSON trong MongoDB

db.collection.ensureIndex({"geometry.coordinates" : "2d"}); 

Tất cả dữ liệu hợp lệ GeoJSON và nằm trong tọa độ 2d đơn giản trong EPSG: chiếu 4326.

Có ai có ý tưởng không?

Trả lời

1

Tính năng không gian địa lý của MongoDB hiện chỉ hỗ trợ lưu trữ điểm, không phải hình dạng hoặc đường kẻ. Tuy nhiên, bạn có thể truy vấn các điểm bằng cách sử dụng vòng tròn, hình chữ nhật hoặc đa giác.

2

Tôi cũng phải tự làm điều này để thiết lập tính năng GeoFence. Những gì tôi đã làm là lưu trữ dữ liệu "đa giác" dưới dạng một loạt tọa độ và một trung tâm. Ví dụ:

{ 
    "_id" : ObjectId("4f189d132ae5e92272000000"), 
    "name" : "Alaska", 
    "points" : [ 
     { "coords" : [ 
      -141.0205, 
      70.0187 ] 
     }, 

     ... 

     { "coords" : [ 
      -141.0205, 
      70.0187 ] 
     } 
    ], 
    "center" : { 
     "coords" : [ 
      -153.6370465116279, 
      61.42329302325581 ] 
    } 
} 

Trong đơn đăng ký của tôi (trăn) Tôi đang sử dụng shapely library. Những gì tôi làm đầu tiên là tìm một danh sách các đối tượng có một trung tâm gần nhất với quan điểm của tôi. Sau đó, ở phía máy khách (python), tôi sử dụng một cách linh hoạt chuyển đổi từng mảng tọa độ lớn thành một đa giác, và sau đó kiểm tra các vùng để tìm những vùng nào chứa điểm của tôi.

Vì vậy, bạn có thể lưu trữ dữ liệu đa giác trong MongoDB dưới dạng dữ liệu và sử dụng một số chỉ mục 2d được tính trước khác như một trung tâm.

13

Với MongoDB 2.4 sử dụng "2dsphere" chỉ số cho điểm GeoJSON, LineStrings và Đa giác.

Ví dụ, bạn có thể tạo chỉ mục này:

db.mycoll.ensureIndex({ loc : "2dsphere" }) 

Và lưu trữ LineString này:

{ loc : { type : "LineString" , coordinates : [ [ 1 , 2 ] , [ 3 , 4 ] ] } } 

Xem http://docs.mongodb.org/manual/applications/2dsphere/.

+0

2,6 sẽ hỗ trợ MultiPoint, MultiLineString, MultiPolygon và GeometryCollection http://docs.mongodb.org/manual/release-notes/2.6/ –

+0

này lời khuyên làm việc cho tôi và tiết kiệm thêm logic ứng dụng! –

2

này cung cấp cho một thử từ vỏ Mongo:

// Polygon in GeoJson format 
var poly = {}; 
poly.name = 'GeoJson polygon'; 
poly.geo = {}; 
poly.geo.type = 'Polygon'; 
poly.geo.coordinates = [ 
    [ [ -80.0, 30.0 ], [ -40.0, 30.0 ], [ -40.0, 60.0 ], [-80.0, 60.0 ], [ -80.0, 30.0 ] ] 
]; 
db.foo.insert(poly); 
db.foo.ensureIndex({geo: "2dsphere" }); 
+0

Tôi mới bắt đầu làm việc với Đa giác trong MongoDB nhưng tôi thấy hình dạng của cấu trúc đa giác lạ ... Nếu một hình dạng là một tập hợp các điểm, tại sao mảng của các điểm đó nằm trong một mảng khác? Không nên 'poly.geo.coordinates = [[-80.0, 30.0], [-40.0, 30.0], ...]' là đủ? – Loupax

+1

@Loupax Tọa độ của một đa giác là một mảng các mảng tọa độ LinearRing. Phần tử đầu tiên trong mảng đại diện cho vòng ngoài. Bất kỳ yếu tố tiếp theo nào đại diện cho các vòng bên trong (hoặc lỗ). (Http://geojson.org/geojson-spec.html#id4) – Farhadi

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