คราวนี้ มาดูการประยุกต์ใช้ 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 ทันที
หวังว่าจะเป็นประโยชน์ครับ
เยี่ยมคับ