บทนี้นำเสนอถึงวิธีการจัดเก็บข้อมูลภูมิศาสตร์ใน MongoDB หากต้องการใช้ความสามารถในการ query ของภูมิศาสตร์ของ MongoDB เราต้องเข้าใจวิธีการจัดเก็บข้อมูลภูมิศาสตร์ก่อน

ข้อมูลภูมิศาสตร์ประกอบไปด้วยจุด ขีด และรูปทรงเรขาคณิต

จุดบนแผนที่ถูกกำหนดโดยพิกัดลองจิจูด และละติจูด จุดมากๆ รวมกันจะเป็นขีด และขีดมากๆ สามารถจะเป็นรูปทรงที่หลากหลาย

ในการประยุกต์ใช้: ตำแหน่งของร้าน "ฉันอยู่ที่ไหน?", และ "โรงเรียนอยู่ที่ไหน?" สามารถแทนด้วยพิกัด ในการบรรยายขอบเขตของแคมปัสหรือห้างสรรพสินค้าก็ต้องใช้รูปทรงเรขาคณิต

ออบเจ็ค GeoJSON

MongoDB ใช้ออบเจ็ค GeoJSON ในการแทนข้อมูลภูมิศาสตร์

รูปแบบ GeoJSON ที่พบบ่อย ได้แก่:

  • Point - แทนจุดพิกัด
  • LineString - แทนเส้น
  • Polygon - แทนรูปหลายเหลี่ยม

รูปแบบในการจัดเก็บออบเจ็ค GeoJSON ในฟิลด์ของ MongoDB มีดังนี้:

<field>: { type: <geojson type> , coordinates: <coordinates> }

อธิบาย:

  • - ชื่อฟิลด์
  • type - ประเภท GeoJSON
  • coordinates - อาร์เรย์ของจุดพิกัด รูปแบบจะแตกต่างกันตามประเภท GeoJSON ที่ต่างกัน

ตัวอย่าง:

location: {
      type: "Point",  // ประเภทของข้อมูลภูมิศาสตร์ ในที่นี้คือจุดพิกัด
      coordinates: [-73.856077, 40.848447] // ลองจิจูด, ละติจูด
}

อธิบาย: ฟิลด์ location เก็บข้อมูลภูมิศาสตร์ของประเภทจุดพิกัด

จุดพิกัด (Point)

รูปแบบ:

{ type: "Point", coordinates: [ ลองจิจูด, ละติจูด ] }

ตัวอย่าง:

{ type: "Point", coordinates: [ 40, 5 ] }

เส้น (LineString)

รูปแบบ:

{ type: "LineString", coordinates: [ จุด1, จุด2, ...] }

ตัวอย่าง:

{ type: "LineString", coordinates: [ [ 40, 5 ], [ 41, 6 ] ] }

รูปหลายเหลี่ยม (Polygon)

สามารถประกอบไปด้วยขีดหลายๆ เส้น รูปแบบ:

{
  type: "Polygon",
  coordinates: [ 
		ขีด1,
		ขีด2,
		....
	]
}

หมายเหตุ: จุดเริ่มต้นและจุดสิ้นสุดของแต่ละส่วนของเส้นต้องเป็นเดียวกันเพื่อที่จะสร้างรูปทรงที่ปิดกัน

รูปทรงที่ประกอบด้วยเส้นเดียว

{
  type: "Polygon",
  coordinates: [
  		[ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0  ] ] // จุดพิกัดของเส้น เราควรระวังว่าจุดพิกัดของเริ่มต้นและจุดพิกัดของส่วนสุดท้ายจะต้องเหมือนกัน
	]
}

รูปทรงที่ประกอบด้วยเส้นหลายๆ เส้น

{
  type : "Polygon",
  coordinates : [
     [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ], // เส้นที่ 1
     [ [ 2 , 2 ] , [ 3 , 3 ] , [ 4 , 2 ] , [ 2 , 2 ] ]  // เส้นที่ 2
  ]
}

ดัชนีภูมิศาสตร์

MongoDB รองรับดัชนีภูมิศาสตร์ 2 ประเภทเพื่อเพิ่มความเร็วในการ query ข้อมูล GeoJSON

2dsphere

นี่เป็นประเภทของดัชนีเรขาคณิตทรงกลม ซึ่งหมายความว่าเมื่อคำนวณระยะห่างระหว่างจุดสองจุด 2dsphere พิจารณาโลกเป็นทรงกลม

ตัวอย่างในการสร้างดัชนี 2dsphere:

db.collection.createIndex( { location : "2dsphere" } )

สร้างดัชนีสำหรับฟิลด์ location

2d

2D เป็นประเภทของเรขาคณิตระนาบที่ใช้คำนวณระยะห่างระหว่างจุดสองจุดเสมือนกันอยู่ในระนาบ ตัวอย่างในการสร้างดัชนี 2D:

db.collection.createIndex( { location : "2d" } )

การสร้างดัชนีสำหรับฟิลด์ location

ประเภทคิวรี่ภูมิศาสตร์

คิวรี่ภูมิศาสตร์ทั้งหมดเกี่ยวข้องกับการคำนวณทางเรขาคณิต ด้านล่างนี้คือประเภทคิวรี่ที่รองรับโดย MongoDB:

  • $geoIntersects - ใช้เพื่อจับคู่เอกสารกับรูปร่างเรขาคณิตที่กำหนด
  • $geoWithin - จับคู่เอกสารที่อยู่ภายในพื้นที่เรขาคณิตที่กำหนด
  • $near - ที่ใช้สำหรับคิวรี่เอกสารที่ใกล้ที่สุดกับจุดพิกัดที่กำหนด

หมายเหตุ: สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคิวรี่ภูมิศาสตร์ กรุณาอ้างอิงต่อบทความที่เกี่ยวข้อง