Làm cách nào để lưu trữ các dòng và đa giác trong các tài liệu JSON?


24

Nhìn vào sự chuyển động ngày càng tăng của NoQuery và xem xét rằng các cơ sở dữ liệu như MongoDB cung cấp một viễn cảnh mới trong việc lưu trữ dữ liệu linh hoạt cho GIS. Cách tốt nhất để lưu trữ các dòng và đa giác trong các tài liệu JSON để tận dụng các chỉ mục 2d và các hàm không gian là gì?


6
MongoDB hiện không hỗ trợ lập chỉ mục trên bất kỳ thứ gì ngoài các điểm và các chức năng không gian của nó bị giới hạn trong việc tìm kiếm trong giới hạn.
scw

Câu trả lời:


16

GeoJSON ở đây là các thông số kỹ thuật .

Đây là một ví dụ về một dòng và một đa giác:

{ "type": "FeatureCollection",
  "features": [
    { "type": "Feature",
      "geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
      "properties": {"prop0": "value0"}
      },
    { "type": "Feature",
      "geometry": {
        "type": "LineString",
        "coordinates": [
          [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
          ]
        },
      "properties": {
        "prop0": "value0",
        "prop1": 0.0
        }
      },
    { "type": "Feature",
       "geometry": {
         "type": "Polygon",
         "coordinates": [
           [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
             [100.0, 1.0], [100.0, 0.0] ]
           ]
       },
       "properties": {
         "prop0": "value0",
         "prop1": {"this": "that"}
         }
       }
     ]
   }

9

Một điều cần lưu ý là sự hỗ trợ của MongoDB cho các kiểu dữ liệu không gian rất tệ cho bất kỳ tra cứu không gian nghiêm trọng nào và điều này áp dụng trên bảng với NoQuery lần trước tôi đã kiểm tra. Tôi không thích GeoCouch ít hơn một chút, nhưng nó vẫn có một cách để đi.

GeoJSON là một định dạng tuyệt vời nhưng để tận dụng các chỉ số không gian hạn chế (CHỈ CÓ) trong Mongo, bạn cần một bộ sưu tập được lập chỉ mục không gian, không có gì ngoài bản ghi cho mỗi điểm của đa giác với giá trị bổ sung cho ID hồ sơ của bạn bản ghi không gian sống trong một bộ sưu tập khác, sau đó sử dụng truy vấn hộp giới hạn để lấy ID bản ghi từ một bản này và chọn từ bản khác, mô phỏng một cách hiệu quả một phép nối.

Bạn có thể tấn công và chỉ thực hiện các góc của khung giới hạn làm điểm cho hồ sơ của mình, nhưng sau đó tìm kiếm hộp giới hạn có thể thất bại và tất cả đều buộc một số mẫu thiết kế khá kém hiệu quả và đẩy tất cả các loại trách nhiệm cho nhà phát triển.

Là một triển khai tham chiếu, bạn có thể muốn tham khảo này đã được trình bày tại Hội nghị thượng đỉnh nhà phát triển Esri năm nay.

Tôi không hài lòng chút nào với sự hỗ trợ không gian trên các cơ sở dữ liệu NoQuery khác nhau. Chúng chỉ đi đủ xa để tra cứu đám mây điểm câm, điều này hợp lý khi xem xét hầu hết các ứng dụng sử dụng điều này chỉ là thả đinh ghim lên bản đồ Google trên trình duyệt ở đâu đó. PostGIS vẫn sẽ là công cụ mã nguồn mở tốt nhất để quản lý thông tin không gian trong tương lai gần.


9

Đơn giản là nó sai,

"để tận dụng các chỉ mục không gian trong Mongo, bạn cần một bộ sưu tập được lập chỉ mục không gian, không có gì ngoài bản ghi cho mỗi điểm của đa giác, với một giá trị bổ sung cho ID hồ sơ của bản ghi không gian của bạn sống trong một bộ sưu tập khác, sau đó sử dụng một truy vấn hộp giới hạn để nhận ID hồ sơ từ một [bộ sưu tập] và chọn [dữ liệu bản ghi] từ [bộ sưu tập] khác, mô phỏng hiệu quả một liên kết. "

Tôi có dữ liệu điểm USGS được lưu trữ trong một bộ sưu tập Mongo với các bản ghi trông như thế này:

> db.names.find({FEATURE_NAME: 'Mount Saint Helens', STATE_ALPHA: 'WA'})       
{ "_id" : ObjectId("4e262106d7a99b7db41a4919"), 
"_ID" : 1525360, 
"FEATURE_NAME" : "Mount Saint Helens", 
"FEATURE_CLASS" : "Summit", 
"STATE_ALPHA" : "WA", 
"STATE_FIPS" : 53, 
"COUNTY_NAME" : "Skamania", 
"COUNTY_FIPS" : "059", 
"COORDS" : [ -122.1944, 46.1912 ], 
"ELEV_IN_FT" : "8356" }

Tôi có thể thực hiện các truy vấn hộp giới hạn trên dữ liệu này trả về toàn bộ bản ghi (mà không cần bộ sưu tập khác) tốt.

Truy vấn:

> box = [[-126.562500,45.089036], [-123.750000,47.040182]]
[ [ -126.5625, 45.089036 ], [ -123.75, 47.040182 ] ]
> db.names.find({"COORDS" : {"$within" : {"$box" : box}}, FEATURE_CLASS: "Summit"}, {FEATURE_NAME: true, COUNTY_NAME: true, STATE_ALPHA: true, ELEV_IN_FEET: true}).limit(5);

Phản ứng:

{ "_id" : ObjectId("4e2620f8d7a99b7db4146cec"), "FEATURE_NAME" : "Harlocker Hill", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Coos" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414a349"), "FEATURE_NAME" : "Neskowin Crest", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414a105"), "FEATURE_NAME" : "Miles Mountain", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db414934a"), "FEATURE_NAME" : "Mount Gauldy", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Tillamook" }
{ "_id" : ObjectId("4e2620f8d7a99b7db4149d06"), "FEATURE_NAME" : "Little Hebo", "STATE_ALPHA" : "OR", "COUNTY_NAME" : "Yamhill" }

Mongo cũng cung cấp khả năng thực hiện các tìm kiếm hàng xóm gần nhất, cũng như chỉ ra các tìm kiếm đa giác. Điều này cũng được ghi nhận tại mongodb.org


Xin lỗi nhưng tôi bối rối, MongoDB có thể hoặc không thể tạo chỉ mục không gian trên các bộ sưu tập tính năng đa tuyến và đa giác?
Derek Swingley

2
Nó không thể tạo ra một chỉ mục không gian trên các tính năng đường và đa giác tại thời điểm này. Tuy nhiên, nó có thể thực hiện tìm kiếm điểm trong đa giác trên một bảng có các điểm trong đó, nếu bạn cung cấp hình dạng đa giác như một phần của truy vấn. mongodb.org/display/DOCS/ khăn
lagerratcoat

1
OK, do đó, tuyên bố: "GeoJSON là một định dạng tuyệt vời nhưng để tận dụng các chỉ số không gian hạn chế (POINT-CHỈ) trong Mongo" thực sự đúng vì Mongo chỉ có thể lập chỉ mục không gian.
Derek Swingley

Tôi cấp cho bạn rằng một phần của câu đó là chính xác, "chỉ mục không gian giới hạn (CHỈ CÓ)". Vì vậy, 5 trong số 71 từ, hoặc 7%. Điều đó khiến 93% không chính xác. Tôi đứng đằng sau tuyên bố của tôi.
lagerratcoat

1
Bạn có thể chỉnh sửa câu trả lời của bạn để làm rõ? Như là, nó khó hiểu và gây hiểu lầm. Về phần khác của tuyên bố, về cơ bản đó chỉ là một gợi ý để thực hiện một chỉ mục không gian cho dữ liệu phi điểm? Nó có thể không lý tưởng hoặc tối ưu, nhưng đó chỉ là một gợi ý. Xây dựng lý do tại sao bạn nghĩ rằng phần lớn của tuyên bố đó là sai cũng sẽ giúp.
Derek Swingley
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.