วันศุกร์ที่ 30 มกราคม พ.ศ. 2569

การใช้ SQLite สำหรับเก็บและจัดการข้อมูล GeoJSON (Part 1)

SQLite: คือ ระบบจัดการฐานข้อมูล (Database Management System) ขนาดเล็กที่เก็บข้อมูลเป็นไฟล์เดียว ไม่ต้องมีเซิร์ฟเวอร์ นิยมใช้ในอุปกรณ์พกพาและระบบฝังตัว (Embedded Systems) เช่น OpenWrt, ในแอ็พลิเคชันที่ทำงานบนสมาร์ทโฟน ฯลฯ
GeoJSON: คือ รูปแบบการจัดเก็บข้อมูลทางภูมิศาสตร์ (Geographic Data) โดยใช้โครงสร้างแบบ JSON เพื่อระบุตำแหน่งบนแผนที่ เช่น จุด (Point), เส้น (Line) หรือพื้นที่ (Polygon) พร้อมข้อมูลคุณลักษณะต่างๆ

เครื่องมือและฟังก์ชันจัดการ JSON ใน SQLite

ฟังก์ชันพื้นฐาน (Essential Functions)
  • json(string): ตรวจสอบความถูกต้องและย่อขนาด JSON string
  • json_extract(json, '$path'): ดึงข้อมูลออกมาตาม Path (เช่น $.title)
  • json_insert / json_replace: ใช้เพิ่มหรือแทนที่ข้อมูลในชุด JSON
  • json_set: ใช้แก้ไขข้อมูล (ถ้ามีอยู่แล้วจะแทนที่ ถ้าไม่มีจะเพิ่มให้ใหม่)
  • json_remove: ใช้ลบ Key หรือสมาชิกใน Array ที่ไม่ต้องการ
  • ไวยากรณ์ลัด (Fast Access Syntax - SQLite 3.38+)
  • ->: ส่งค่ากลับมาเป็น JSON string
  • ->>: ส่งค่ากลับมาเป็น ข้อมูลดิบ (SQL value) เช่น ข้อความหรือตัวเลข
  • ฟังก์ชันสำหรับการรวมกลุ่ม (Aggregate Tools)
  • json_group_array(value): รวมข้อมูลจากหลายๆ แถว (Rows) ให้กลายเป็น JSON Array [...] (ใช้ทำ FeatureCollection)
  • json_group_object(name, value): รวมข้อมูลให้กลายเป็น JSON Object {"key": "value"}
  • ฟังก์ชันแบบตาราง (Table-Valued Functions)
  • json_each(json): แตกข้อมูล JSON ออกมาเป็นแถวเหมือนตาราง (เฉพาะชั้นบนสุด)
  • json_tree(json): แตกข้อมูล JSON ออกมาทุกชั้น (Recursive) เหมาะสำหรับการค้นหาข้อมูลที่ฝังอยู่ลึกๆ
  • บทความชุดนี้จะแสดงการเก็บข้อมูลใน SQLite ที่เหมาะสมกับข้อมูล GeoJSON ในสถานการณ์ต่างๆ 
    ที่วิศวกรสำรวจและนักภูมิสารสนเทศอาจเคยประสบโดยแยกเป็น 2 กรณี
    
    กรณี 1 เก็บข้อมูลแบบปกติทั่วไป (text, number, ...) แล้วใช้คำสั่งเรียกมาประกอบกันเป็น GeoJSON เมื่อต้องการ
    กรณี 2 เก็บข้อมูลเป็นรูปแบบที่คล้าย GeoJSON มากที่สุด แล้วใช้ฟังก์ชันพิเศษช่วยแปลงเป็น GeoJSON
    
    ทั้งสองกรณีจะอยู่ใน blog ถัดไปตามลำดับ
    การใช้ฟังก์ชันจัดการ JSON จะมีแทรกอยู่ในขั้นตอนต่างๆ ของการทำงาน
    
    

    ไม่มีความคิดเห็น:

    แสดงความคิดเห็น