แปลงเลขอารบิกเป็นเลขไทยใน ArcGIS อาจจะต้องเขียนโค้ดเล็กน้อย แต่ก็ไม่ได้เป็นโค้ดที่ยุ่งยากอะไร เสียเวลาแป๊บเดียว (copy ไปวางเลยก็ได้)
โจทย์สำหรับวันนี้
ในฟิลด์ “LAND_NO” มี data type เป็น numerics หรือตัวเลข เราต้องการสร้างฟิลด์ใหม่ เป็นฟิลด์ “LAND_TH” มีค่าเหมือนฟิลด์ “LAND_NO” แต่ว่าเป็นเลขไทย โดยฟิลด์ “LAND_TH” ตั้ง data type เป็น text
วัตถุประสงค์ก็คือเวลาแสดง label จะให้เห็นเป็นเลขไทย
เรื่องนี้ บางท่านที่ติดตามบล็อกนี้มาตลอด จะรู้ว่า เคยพูดเสมอว่า เวลาทำงานกับคอมพิวเตอร์ ให้หยุดความรักชาติไทยไว้ชั่วขณะ เลขไทย ตัวอักษรไทย เลี่ยงได้ให้เลี่ยง เลี่ยงไม่ได้ให้ใช้เท่าที่จำเป็น
ในเวลานี้ เกิดความจำเป็นว่า เวลาทำแผนที่ ซึ่งมีพื้นฐานมาจากแผนที่ของกรมที่ดิน มีความจำเป็นต้องแสดงเลขที่ดินเป็นเลขไทย เพื่อให้เห็นชัดเจนว่าเลขนี้ คือเลขที่ดิน ของแปลงที่ดินนั้น
ซึ่งบางท่านแก้ปัญหาง่าย ๆ ด้วยการตั้งค่าฟอนต์เป็น TH Sarabun IT๙ ซึ่ง DataRevol ไม่ชอบเจ้าฟอนต์ตัวนี้เลย ด้วยเหตุดังที่เคยเขียนไว้นานแล้ว
แต่เอาเถอะ ใครจะแก้ไขปัญหาเฉพาะหน้ากันอย่างไรก็ตามแต่ โดยส่วนตัวขอใช้วิธีแก้ไขด้วยวิธีธรรมดาสามัญชีวิตนี่แหละ
Calculate Field
ใน ArcGIS Pro จะมีเครื่องมือสามัญประจำบ้านอย่างหนึ่งก็คือ Calculate Field สำหรับใช้คำนวณอะไรต่าง ๆ นานา นอกจากสูตรการคำนวณที่ทำสำเร็จมาให้ใช้กันง่ายดายแล้ว ยังเขียนสูตรเพิ่มเติมเข้าไปเองได้ด้วย ซึ่งจะมีสอง method ให้เลือกคือ arcade กับ python ซึ่งในครั้งนี้ เราจะเลือก python เพราะ DataRevol คุ้นเคยมากกว่า
ขั้นตอน
ใน Table of Content ให้ คลิกขวาที่เลเยอร์ที่ต้องการ และเลือก “Attribute Table”
ใน “Attribute Table” ให้เลือกช่อง “LAND_TH” คลิกขวา เลือก Calculate Field หรืออาจจะจะไปที่ส่วนหัวของด้านบนหัวฟิลด์ของ “Attribute Table” ตรงไหนก็ได้
หรือ ที่เมนูด้านบน ตรงแท็บ “Data” แล้วเลือก Calculate Field ก็ได้
ใน Field Calculator สิ่งที่ต้องใส่ก็คือ
Input Table: คลิกเลือกเลยอร์ที่ต้องการตรงนี้ ตามปกติแล้ว ควรแสดงชื่อของเลเยอร์ที่แอ็กทีฟอยู่ หรือถ้าคลิกขวาเลือกเลเยอร์จาก Table of Content จะขึ้นมาในช่องนี้โดยอัตโนมัติ
Field Name: ชื่อฟิลด์ที่ต้องการ ปกติเราคลิกขวาจากหัวฟิลด์ไหน จะขึ้นฟิลด์นั้นขึ้นมา แต่ถ้าไม่มี อย่างในรูปตัวอย่าง เราพิมพ์ใส่เพิ่ม “LAND_TH” เพื่อสร้างใหม่ได้เลย
Field Type: จะมีเมื่อเราใส่ชื่อฟิลด์ที่ไม่มีในแอตทริบิวต์ปัจจุบัน กำหนดประเภทของข้อมูลได้ตรงนี้
Expree Type: ตรงนี้เลือก Python หรือ Arcade หรือ VB Script ก็ได้ แต่ในตอนนี้จะเลือก python
Expression: นี่คือช่องสำหรับใส่สูตร เพื่อแปลงเลขอารบิกเป็นเลขไทย ซึ่งจะอธิบายต่อไป
แนวคิด
ตัวเลข มีแค่ 0 ถึง 9 เราแค่ต้องเอา ๐ ไปแทน 0 เอา ๑ ไปแทน 1 ทำแบบนี้ไปเรื่อย ๆ
แนวคิดก็ประมาณนี้เอง ง่าย ๆ แบบเดียวกับที่ทำในเวิร์ดหรือเอ็กเซล
สิ่งที่ต้องทำก็แค่ ดึงข้อมูลตัวเลขอารบิก ไปจับกับเลขไทย แล้วนำไปแทนที่ หรือ replace ง่าย ๆ นี่แหละ เนื่องจากตัวเลขมีเพียงแค่ 0-9 เราก็ทำเป็นดิกชันนารีตัวเลข แล้วก็เอาไปแทนที่กันตามลำดับ
ซึ่งต้องบอกก่อนว่า อันนี้ไม่ได้คิดเอง ดูมาจากวิดีโอสอนไพธอนทำแบบนี้มาก่อน คลิปสอนภาษา Python โดยชมรม Clique
ซึ่ง ถึงจะนำมาใช้ตรง ๆ ไม่ได้ แต่ก็นำไปประยุกต์แทนที่สำหรับการใช้งานจริงได้
มาดูกันว่า DataRevol.com ทำออกมาอย่างไร
แปลงเลขอารบิกเป็นไทย ใน ArcGIS
สิ่งแรกที่ทำก็คือ สร้างลิสต์สำหรับเลขอารบิก กับ เลขไทย ขึ้นมาก่อน
arabic_numerals = [‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’]
thai_numerals = [‘๐’, ‘๑’, ‘๒’, ‘๓’, ‘๔’, ‘๕’, ‘๖’, ‘๗’, ‘๘’, ‘๙’]
โปรดสังเกตว่า ในลิตส์นี้ กำหนดเป็น text หรือ ตัวอักษร เพราะว่ามีข้อกำหนดจากโจทย์ว่าฟิลด์ปลายทางที่ต้องการกำหนด datatype ไว้เป็น text
และเนื่องจากฟิลด์ “LAND_NO” เป็น numeric ก็จะแปลงให้เป็น text เสียก่อน
input_string = str(input_value)
ตั้งตัวแปรไว้รับผลลัพธ์
result = ”
หลังจากนั้น ก็จะเป็นการวนลูป
ส่วนนี้ของโค้ดจะวนซ้ำอักขระแต่ละตัวใน input_string
สำหรับอักขระแต่ละตัว (อักขระ) จะตรวจสอบว่ามีอยู่ในรายการเลขอารบิกหรือไม่
หากว่ามีอยู่ในลิสต์ของเลขอารบิก จะดูว่าดัชนีเป็นตำแหน่งใด และใช้ดัชนีนั้นเพื่อดึงตัวเลขไทยที่เกี่ยวข้องจากรายการ thai_numerals แล้วจึงเติมเลขไทยนี้ต่อท้ายผลลัพธ์
หากอักขระไม่ใช่เลขอารบิก อักขระนั้นจะต่อท้ายอักขระตามที่เป็น
แล้วก็ส่งผลลัพธ์กลับมา
ก็เพียงเท่านี้เองสาธุชน
วิธีการ
ในช่อง Code Block ให้ใส่โค้ดนี้
def arabic_to_thai_numerals(input_value):
# สร้างดิกชันนารี เพื่อจับคู่ตัวเลข
arabic_numerals = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
thai_numerals = ['๐', '๑', '๒', '๓', '๔', '๕', '๖', '๗', '๘', '๙']
# เปลี่ยนตัวเลขให้เป็นตัวอักษร
input_string = str(input_value)
# รับผลลัพธ์
result = ''
# วนลูปไปยังค่าตั้งต้น แล้วเปลี่ยนเลขอารบิกเป็นเลขไทย
for char in input_string:
if char in arabic_numerals:
result += thai_numerals[arabic_numerals.index(char)]
else:
result += char
return result
โค้ดที่ให้ด้านบน คือการสร้างฟังก์ชันชื่อ arabic_to_thai_numerals โดยที่มีตัวแปรเดียวที่ต้องใส่ก็คือ input_value
ในที่นี้ เราจะเปลี่ยน input_value เป็นค่าจากต้นทาง นั่นคือฟิลด์ “LAND_NO”
สิ่งที่เราต้องใส่คือ
arabic_to_thai_numerals(!LAND_NO!)
แปลงเลขอารบิกเป็นเลขไทยใน ArcGIS ก็จบด้วยประการฉะนี้
อ่านเพิ่ม: