ELK #5 การประยุกต์ใช้ ELK ในงานด้าน GIS

คราวนี้ มาดูการประยุกต์ใช้ ELK ในงานด้าน GIS

ต่อจาก ELK #01 > ELK #02 > ELK #03 > ELK #04 ซึ่งเป็นการติดตั้งทั้งหมด คราวนี้มาดูการประยุกต์ใช้งานกันบ้าง

โจทย์มีอยู่ว่า มีการไปเก็บข้อมูลในภาคสนาม แล้วมีการบันทึก พิกัดด้วย GPS เป็น Latitude กับ Longitude พร้อมกับค่าบางอย่าง ทั้งหมดถูกเก็บไว้ในฐานข้อมูล MySQL

การนำข้อมูลเข้า ELK ก็เลย Export ข้อมูลจาก MySQL มาเป็น CSV File ประกอบด้วย

id,LATITUDE,LONGITUDE,something

ตัวอย่างข้อมูล มีดังนี้

id,LATITUDE,LONGITUDE,something
1,6.97585,100.448963,100
2,6.975627,100.450841,19
3,6.973472,100.449196,65
4,6.973468,100.449104,53
5,6.973455,100.449135,33
6,6.973252,100.44888,13
7,6.985862,100.45292,85
8,6.993386,100.416214,90
9,7.005465,100.447984,1

นำข้อมูลเข้า ELK ผ่านทาง Logstash

ใน  ELK #2 ได้อธิบายขั้นตอนการติดตั้ง Logstash ไว้แล้วนั้น ต่อไปเป็นการนำข้อมูลชนิด CSV เข้าไปใส่ใน Elasticsearch

Logstash จะอ่าน “กระบวนการทำงาน” หรือเรียกว่า Pipeline จากไฟล์ Configuration ซึ่งประกอบด้วย 3 ส่วนหลักๆ คือ Input, Filter และ Output

input {
   stdin { }
}

ในส่วน input นี้ จะเป็นการอ่าน STDIN หรือ ทาง Terminal

filter {
 csv {
   separator => ","
   columns => [
     "id","latitude","longitude","something"
   ]
 }
 if [id] == "id" {
   drop { }
 } else {
   # continue processing data
   mutate {
     remove_field => [ "message" ]
   }
   mutate {
     convert => { "something" => "integer" }
     convert => { "longitude" => "float" }
     convert => { "latitude" => "float" }
   }
   mutate {
     rename => {
       "longitude" => "[geoip][location][lon]"
       "latitude" => "[geoip][location][lat]"
     }
   }
 }
}

ในส่วนของ filter นี้ เริ่มจาก เลือกใช้ Filter Plugin ชื่อ “csv” เพื่อจัดการไฟล์ CSV โดยกำหนด “separator” เป็น “,” แล้วกำหนดว่ามีชื่อ Column เป็น “id”,”latitude”,”longitude”,”something”

จากนั้น ก็ตรวจสอบว่า ถ้าข้อมูลที่อ่านเข้ามา ใน Column “id” มีค่าเป็น “id” (ซึ่งก็คือบรรทัดหัวตารางของไฟล์ csv นั่นเอง) ก้ให้ “drop” ไป

แต่หากไม่ใช่ ก็ให้ทำดังนี้ (mutate คือการแก้ไข)

  • remove field ชื่อ message (ซึ่งจะปรากฏเป็น Default อยู่ ก็เลยเอาออกเพราะไม่จำเป็น)
  • convert หรือ เปลี่ยน “ชนิด”  ของแต่ละ field เป็นไปตามที่ต้องการ ได้แก่ ให้ something เป็น Integer, latitude และ longitude เป็น float
  • rename จาก latitude เป็น [geoip][location][lat] และ longitude เป็น [geoip][location][lon] ซึ่งตรงนี้สำคัญ เพราะ geoip.location Field ข้อมูลชนิก “geo_point” ซึ่งจำเป็นต่อการนำไปใช้งานเกำหนดตำแหน่งพิกัดบนแผนที่ (เป็น Field ที่สร้างจาก Template พื้นฐานของ Logstash ซึ่งจะไม่กล่าวถึงในบทความนี้)
output {
 stdout { codec => rubydebug }
 elasticsearch {
   hosts => ["http://your.elastic.host:9200"]
 }
}

ในส่วนของ Output จะกำหนดว่า ข้อมูลที่อ่านจาก csv และผ่าน filter ตามที่กล่าวมาข้างต้น จะส่งไปที่ใน จากการกำหนดนี้ บอกว่า จะส่งออกไป

  • stdout คือ การแสดงผลออกมาทาง terminal โดยมีรูปแบบเป็น rubydebug (รูปแบบหนึ่ง)
  • Elasticsearch ซึ่งอยู่ที่ http://your.elastic.host:9200

จากนั้น Save ไฟล์นี้ แล้วตั้งชื่อว่า gis.conf

แล้วใช้คำสั่ง

cat sample1.csv | /usr/share/logstash/bin/logstash -f gis.conf

การแสดงผลข้อมูลใน Elasticsearch ผ่าน Kibana

จากบทความก่อนหน้า ได้แสดงวิธีการติดตั้ง Kibana และเชื่อมต่อกับ Elasticsearch แล้ว โดยจะเข้าถึง Kibana ได้ทางเว็บไซต์ http://your.kibana.host:5601

ในกระบวนการของ Logstash ข้างต้น จะไปสร้าง Elasticsearch Index ชื่อ “logstash-YYYY-MM-DD”, ใน Kibana ก็จะต้องไป คลิกที่ Setting (รูปเฟือง) จากนั้นคลิกที่ Index Pattern โดยให้ไปอ่าน index ซึ่งมีชื่อเป็น Pattern คือ “logstash-*” จากนั้น คลิกปุ่ม Create

จะได้ผลประมาณนี้

ต่อไป คลิกที่ Discover ก็จะเห็นข้อมูลเข้ามา

แสดงข้อมูลในรูปแบบของ Tile Map

คลิกที่ Visualization > Create a visualization

เลือก Tile Map

เลือก Index ที่ต้องการ ในที่นี้คือ logstash-*

คลิก Geo Coordinates

จากนั้น คลิก Apply แล้วคลิก Fit Data Bound

ก็จะได้เฉพาะ พื้นที่ทีมีข้อมุล

วิธีใส่ Map Server อื่น

ปัญหาของ Defaul Map Service ที่มากับ Kibana คือ Elastic Map Service นั้น จะจำกัดระดับในการ Zoom จึงต้องหา WMS (Web Map Service) อื่นมาใช้แทน ต้องขอบคุณ คุณนพัส กังวานตระกูล สถานวิจัยสารสนเทศภูมิศาสตร์ทรัพยากรธรรมชาติและสิ่งแวดล้อม ศูนย์ภูมิภาคเทคโนโลยีอวกาศและภูมิสารสนเทศ (ภาคใต้)  สำหรับคำแนะนำในการใช้งาน WMS และระบบ GIS ตลอดมาครับ 🙂

โดย เราจะใช้ WMS ของ Longdo Map API : http://api.longdo.com/map/doc/
ข้อมูลการใช้งาน เอามาจาก http://api.longdo.com/map/doc/demo/advance/02-layer.php

วิธีการตั้งค่าใน Kibana

คลิกที่ Option > WMS compliant map server
แล้วกรอกข้อมูล

URL : https://ms.longdo.com/mapproxy/service
Layer: bluemarble_terrain
Version: 1.3.0
Format: image/png
Attribute: Longdo API

จากนั้นคลิก Apply

จากนั้นให้ Save พร้อมตั้งชื่อ

ซึ่ง Longdo Map API สามารถ Zoom ได้ละเอียดพอสมควร

สามารถนำเสนอระบบ GIS ได้บน Website ทันที

หวังว่าจะเป็นประโยชน์ครับ

1 thought on “ELK #5 การประยุกต์ใช้ ELK ในงานด้าน GIS”

Comments are closed.