วิธีเก็บเส้นและรูปหลายเหลี่ยมในเอกสาร JSON


24

ดูการเคลื่อนไหวNoSQL ที่เพิ่มขึ้นและพิจารณาว่าฐานข้อมูลอย่างMongoDBนำเสนอมุมมองใหม่ในการจัดเก็บข้อมูลที่ยืดหยุ่นสำหรับ GIS วิธีที่ดีที่สุดในการจัดเก็บบรรทัดและรูปหลายเหลี่ยมในเอกสาร JSON เพื่อใช้ประโยชน์จากดัชนี 2dและฟังก์ชันเชิงพื้นที่คืออะไร


6
ขณะนี้ MongoDB ไม่รองรับการจัดทำดัชนีในสิ่งอื่นนอกเหนือจากจุดและฟังก์ชันเชิงพื้นที่ของมันถูก จำกัด ไว้ที่การค้นหาภายในขอบเขต
scw

คำตอบ:


16

GeoJSONนี่เป็นรายละเอียด

นี่คือตัวอย่างของเส้นและรูปหลายเหลี่ยม:

{ "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

สิ่งหนึ่งที่ควรทราบคือการสนับสนุน MongoDB สำหรับประเภทข้อมูลเชิงพื้นที่นั้นไม่ดีอย่างน่ากลัวสำหรับการค้นหาเชิงพื้นที่ใด ๆ ที่ร้ายแรงและสิ่งนี้ใช้ได้กับทุกกระดานเมื่อใช้ NoSQL เมื่อฉันตรวจสอบ ฉันไม่ชอบ GeoCouch ค่อนข้างน้อย แต่ก็ยังมีวิธีไปด้วย

GeoJSON เป็นรูปแบบที่ยอดเยี่ยม แต่เพื่อใช้ประโยชน์จากดัชนีเชิงพื้นที่ที่ จำกัด (เฉพาะจุด) ใน Mongo คุณจะต้องมีคอลเล็กชั่นที่มีการจัดทำดัชนีเชิงพื้นที่โดยไม่มีอะไรเลยนอกจากบันทึกสำหรับคะแนนแต่ละจุดของรูปหลายเหลี่ยม เร็กคอร์ดเชิงพื้นที่ที่อาศัยอยู่ในคอลเล็กชันอื่นจากนั้นใช้เคียวรีบ็อกซ์ขอบเขตเพื่อรับ ID เร็กคอร์ดจากหนึ่งและเลือกจากอื่น ๆ จำลองการเข้าร่วมได้อย่างมีประสิทธิภาพ

คุณสามารถไปแฮ็คและทำมุมของกล่องขอบเพื่อเป็นจุดสำหรับบันทึกของคุณ แต่จากนั้นการค้นหากล่องอาจจะล้มเหลวและทั้งหมดนี้มันส่งผลให้รูปแบบการออกแบบที่ไม่มีประสิทธิภาพและผลักดันความรับผิดชอบทุกประเภท

เป็นการดำเนินการอ้างอิงคุณอาจต้องการอ้างถึงรหัสนี้ซึ่งถูกนำเสนอในการประชุมสุดยอดนักพัฒนา Esri ในปีนี้

ฉันไม่ได้มีความสุขเลยด้วยการสนับสนุนเชิงพื้นที่ในฐานข้อมูล NoSQL ต่างๆ พวกเขาไปไกลพอสำหรับการค้นหา cloud dumb point ซึ่งเหมาะสมแล้วเมื่อพิจารณาว่าแอพส่วนใหญ่ที่ใช้แอพนี้กำลังวาง pushpins ลงบนแผนที่ Google บนเบราว์เซอร์ที่ไหนสักแห่ง PostGIS ยังคงเป็นสิ่งที่ดีที่สุดสำหรับโอเพ่นซอร์สในการจัดการข้อมูลเชิงพื้นที่สำหรับอนาคตอันใกล้


9

นี้เป็นเพียงไม่เป็นความจริง,

"เพื่อใช้ประโยชน์จากดัชนีเชิงพื้นที่ใน Mongo คุณจะต้องมีการจัดทำดัชนีเชิงพื้นที่โดยไม่เก็บอะไรเลยนอกจากบันทึกสำหรับแต่ละจุดของรูปหลายเหลี่ยมด้วยค่าเพิ่มเติมสำหรับรหัสระเบียนของเร็กคอร์ดเชิงพื้นที่ของคุณที่อาศัยอยู่ในคอลเล็กชันอื่น เคียวรีบ็อกซ์ขอบเขตเพื่อรับ ID เร็กคอร์ดจากหนึ่ง [คอลเลกชัน] และเลือก [บันทึกข้อมูล] จากอีก [คอลเลกชัน] โดยจำลองการเข้าร่วมได้อย่างมีประสิทธิภาพ "

ฉันมีข้อมูลจุด USGS ที่เก็บอยู่ในคอลเลกชัน Mongo เดียวพร้อมระเบียนที่มีลักษณะเช่นนี้:

> 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" }

ฉันสามารถที่จะทำการสืบค้นกล่องข้อมูลที่ส่งคืนระเบียนทั้งหมด (โดยไม่จำเป็นต้องมีการรวบรวมอื่น) ได้ดี

ค้นหา:

> 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);

การตอบสนอง:

{ "_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 ยังให้ความสามารถในการทำการค้นหาเพื่อนบ้านที่ใกล้ที่สุดรวมถึงจุดในการค้นหารูปหลายเหลี่ยม นี่เป็นเอกสารที่ดีที่mongodb.org


ขอโทษ แต่ฉันสับสน MongoDB สามารถหรือไม่สามารถสร้างดัชนีเชิงพื้นที่ในบรรทัดและคอลเลกชันคุณสมบัติรูปหลายเหลี่ยม?
Derek Swingley

2
ไม่สามารถสร้างดัชนีเชิงพื้นที่บนเส้นและคุณสมบัติรูปหลายเหลี่ยมได้ในขณะนี้ อย่างไรก็ตามมันสามารถทำการค้นหาจุดในรูปหลายเหลี่ยมบนตารางที่มีจุดในนั้นถ้าคุณให้รูปหลายเหลี่ยมเรขาคณิตเป็นส่วนหนึ่งของแบบสอบถาม mongodb.org/display/DOCS/…
lagerratrobe

1
ตกลงดังนั้นคำสั่ง: "GeoJSON เป็นรูปแบบที่ยอดเยี่ยม แต่เพื่อใช้ประโยชน์จากดัชนีเชิงพื้นที่ที่ จำกัด (เฉพาะจุด) ใน Mongo" เป็นจริงเพราะ Mongo สามารถทำดัชนีเฉพาะจุดได้
Derek Swingley

ฉันขอให้คุณทราบว่าส่วนหนึ่งของประโยคนั้นถูกต้องดัชนีดัชนีเชิงพื้นที่ จำกัด (POINT-ONLY) เท่านั้น ดังนั้น 5 จาก 71 คำหรือ 7% ที่เหลือ 93% ของมันไม่ถูกต้อง ฉันยืนอยู่ข้างหลังคำพูดของฉัน
lagerratrobe

1
คุณสามารถแก้ไขคำตอบเพื่อชี้แจงได้ไหม? ตามที่มันสับสนและทำให้เข้าใจผิด เกี่ยวกับส่วนอื่น ๆ ของแถลงการณ์นั้นไม่ใช่เพียงแค่ข้อเสนอแนะสำหรับการใช้ดัชนีเชิงพื้นที่สำหรับข้อมูลที่ไม่ใช่จุดหรือไม่ มันอาจจะไม่เหมาะหรือดีที่สุด แต่เป็นเพียงข้อเสนอแนะ อธิบายอย่างละเอียดว่าเหตุใดคุณคิดว่าคำพูดส่วนใหญ่นั้นผิดก็จะช่วยได้เช่นกัน
Derek Swingley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.