บทนี้นำเสนอถึงวิธีการจัดเก็บข้อมูลภูมิศาสตร์ใน 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 - ที่ใช้สำหรับคิวรี่เอกสารที่ใกล้ที่สุดกับจุดพิกัดที่กำหนด
หมายเหตุ: สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคิวรี่ภูมิศาสตร์ กรุณาอ้างอิงต่อบทความที่เกี่ยวข้อง