- เครื่องมือโอเพนซอร์สบนพื้นฐาน Python ที่สามารถสร้าง โปสเตอร์ศิลปะแนวมินิมอลจากแผนที่เมือง ทั่วโลกได้
- ใช้ข้อมูลจาก OpenStreetMap (OSMnx) เพื่อแสดงองค์ประกอบภูมิประเทศ เช่น ถนน ทางน้ำ และสวนสาธารณะ แล้วเรนเดอร์ด้วย matplotlib
- มี ธีมสไตล์ ให้เลือก 17 แบบ (เช่น neon_cyberpunk, blueprint, japanese_ink เป็นต้น) และสามารถเพิ่ม ธีมที่กำหนดเอง ผ่านไฟล์ JSON ได้
- ระบุชื่อเมือง ชื่อประเทศ รัศมี และธีมผ่านบรรทัดคำสั่ง เพื่อ สร้างและบันทึกโปสเตอร์อัตโนมัติ
- เป็นเครื่องมือที่ ผสานงานออกแบบเข้ากับการแสดงผลข้อมูล เพื่อให้นักพัฒนาและนักออกแบบสามารถสำรวจโครงสร้างเมืองในเชิงศิลปะได้
ภาพรวมโปรเจกต์
- MapToPoster เป็นสคริปต์ Python ที่สร้าง โปสเตอร์ดีไซน์มินิมอล จากแผนที่ของเมืองที่ผู้ใช้ระบุ
- โปสเตอร์ที่สร้างจะถูกบันทึกอัตโนมัติในไดเรกทอรี
posters/
- เผยแพร่ภายใต้สัญญาอนุญาต MIT จึงสามารถแก้ไขและแจกจ่ายต่อได้อย่างอิสระ
- รีโพซิทอรีมีประมาณ 2.7k Star และ 164 Fork
ฟีเจอร์หลัก
- สร้างโปสเตอร์ผ่านอินเทอร์เฟซบรรทัดคำสั่ง (CLI) โดยป้อนชื่อเมือง (
--city), ชื่อประเทศ (--country), ธีม (--theme), และระยะ (--distance)
- ตรวจสอบรายการธีมที่มีให้ใช้ทั้งหมดได้ด้วยตัวเลือก
--list-themes
- ตั้งค่ารัศมีที่เหมาะสมตามขนาดของเมืองจากค่า distance
- 4,000–6,000m: เมืองขนาดเล็ก
- 8,000–12,000m: เมืองขนาดกลาง
- 15,000–20,000m: เมืองขนาดใหญ่
การจัดธีม
- ในไดเรกทอรี
themes/ มีไฟล์ธีม JSON อยู่ 17 ไฟล์
- ตัวอย่าง: noir, blueprint, neon_cyberpunk, warm_beige, forest, terracotta เป็นต้น
- แต่ละธีมกำหนดคุณสมบัติสีของพื้นหลัง ถนน ผืนน้ำ สวนสาธารณะ ฯลฯ
- ผู้ใช้สามารถ เพิ่มธีมใหม่ได้เองโดยตรง ในรูปแบบ JSON
- ตัวอย่าง:
"bg": "#FFFFFF", "road_primary": "#1A1A1A" เป็นต้น
ตัวอย่างการใช้งาน
- สามารถสร้างโปสเตอร์ด้วยการจับคู่เมืองและธีมได้หลากหลาย
python create_map_poster.py -c "Tokyo" -C "Japan" -t japanese_ink -d 15000
python create_map_poster.py -c "Barcelona" -C "Spain" -t warm_beige -d 8000
python create_map_poster.py -c "Dubai" -C "UAE" -t midnight_blue -d 15000
- ตัวอย่างโปสเตอร์มีเมืองอย่าง San Francisco, Venice, Marrakech, Singapore เป็นต้น
โครงสร้างภายในและสถาปัตยกรรม
- องค์ประกอบหลักได้แก่ CLI Parser, Geocoding (Nominatim), Data Fetching (OSMnx), Rendering (matplotlib)
- ลำดับการเรนเดอร์ (z-order) คือ พื้นหลัง → ผืนน้ำ → สวนสาธารณะ → ถนน → ไล่เฉดสี → ข้อความ
- ฟังก์ชันหลัก
get_coordinates(): ค้นหาค่าละติจูด·ลองจิจูดจากชื่อเมือง
create_poster(): ไปป์ไลน์การเรนเดอร์ทั้งหมด
get_edge_colors_by_type(): กำหนดสีตามประเภทถนน
get_edge_widths_by_type(): กำหนดความหนาตามความสำคัญของถนน
load_theme(): โหลดธีม JSON
การขยายและการปรับแต่ง
- หากต้องการเพิ่ม เลเยอร์แผนที่ใหม่ (เช่น รถไฟ) สามารถดึงข้อมูล OSMnx และเรนเดอร์เพิ่มภายใน
create_poster() ได้
- หากเพิ่ม คุณสมบัติธีมใหม่ ต้องกำหนดทั้งใน JSON และในโค้ด (
load_theme())
- กฎการจัดวางตัวอักษร
- ชื่อเมือง: y=0.14
- ชื่อประเทศ: y=0.10
- พิกัด: y=0.07
- แหล่งที่มา: y=0.02
เคล็ดลับการปรับประสิทธิภาพ
- หากค่า
dist มากกว่า 20km ความเร็วในการดาวน์โหลดจะลดลงและใช้หน่วยความจำเพิ่มขึ้น
- ใช้ coordinate caching เพื่อหลีกเลี่ยงข้อจำกัดจำนวนคำขอของ Nominatim
- ตั้งค่า
network_type='drive' เพื่อเพิ่มความเร็วในการเรนเดอร์
- สำหรับพรีวิวแบบเร็ว สามารถลด
dpi ลงเป็น 150 ได้
เทคโนโลยีที่ใช้และสัญญาอนุญาต
- เขียนด้วย Python 100%
- ไลบรารีหลัก: OSMnx, matplotlib, argparse
- เผยแพร่ภายใต้ MIT License รองรับการใช้งานเชิงพาณิชย์และการดัดแปลง
สรุป
- MapToPoster คือ เครื่องมือสร้างงานศิลป์จากแผนที่เมืองด้วยโค้ด ที่ผสานการแสดงผลข้อมูลเข้ากับงานออกแบบในรูปแบบโอเพนซอร์ส
- เป็นเครื่องมือที่มีประโยชน์สำหรับนักพัฒนา นักออกแบบ และผู้เชี่ยวชาญด้าน data visualization ในการ สำรวจโครงสร้างเมืองในรูปแบบศิลปะ
3 ความคิดเห็น
ผมลองทำเวอร์ชันแถวโซล/ปูซานดูครั้งหนึ่งแล้ว ผลออกมาค่อนข้างดี เลยแนบไว้ในบัญชีทวิตเตอร์ GeekNews ครับ
โซล : https://x.com/GeekNewsHada/status/2013410000031395905
ปูซาน : https://x.com/GeekNewsHada/status/2013412083749265695
ในความเห็นฝั่ง Hacker News ก็มีการพูดถึง city-roads ซึ่งเคยถูกโพสต์ที่นี่มาก่อนเช่นกัน
ความคิดเห็นจาก Hacker News
คือ city-roads (GitHub) ซึ่งรองรับ การส่งออก SVG และลองใช้งานออนไลน์ได้ทันที
ผู้สร้างอย่าง Anvaka ก็ทำ โปรเจกต์ด้านการทำภาพข้อมูล เจ๋ง ๆ อื่น ๆ ไว้อีกมาก
แต่การปรับพารามิเตอร์ของถนนค่อนข้างจุกจิกนิดหน่อย
ไอเดียสำหรับการปรับปรุงคือ แทนที่จะใส่ชื่อเมืองอย่างเดียว ก็ควร รับพิกัด เพื่อให้ตั้งศูนย์กลางที่จุดเฉพาะได้ และควรมีฟีเจอร์ที่ส่งออกหลายสไตล์พร้อมกันเพื่อเลือกด้วยสายตาได้
ยังไงก็ถือว่าเป็นงานที่ยอดเยี่ยม
มันดูเหมือนการฉายภาพทรงกลมทั้งโลกมากกว่า UTM เลยไม่ค่อยเหมาะกับการเรนเดอร์พื้นที่เฉพาะจุด
ที่ README ไม่พูดถึง projection เลยก็ดูน่าสงสัยนิดหน่อย
แถมยังเป็นโอเพนซอร์สด้วย ถ้ามีประสบการณ์ทำแผนที่ก็น่าจะลองเสนอการปรับปรุงผ่าน pull request ได้
น่าจะเป็นการดึง OSM tile มาแล้วทำ post-processing กับภาพต่อ
ผลลัพธ์ออกมาดูดีมาก
เลยสงสัยว่ามีเหตุผลพิเศษอะไรหรือเปล่าที่ตั้ง PNG เป็นค่าเริ่มต้น
plt.savefig(output_file, format='svg', facecolor=THEME['bg'])มีแผนจะเพิ่มพารามิเตอร์
--formatเพื่อรองรับเรื่องนี้แค่เมืองที่มีประชากร 500,000 คนเมืองเดียวก็กินเวลานานมากแล้ว
El-co Color Poster Special
แต่ต้องลงแรงพอสมควร
README ถือเป็น ตัวอย่างแนวปฏิบัติที่ดีของ OSS ได้เลย และผลงานที่ออกมาก็สวยอย่างน่าทึ่ง
เช่น Salem(OR/MA), Portland(OR/ME), Springfield(IL/MO), Dallas(TX/GA)
แต่ถ้าพิมพ์ว่า "Salem, Oregon" หรือ "Salem, MA" ก็จะได้ผลลัพธ์ตามที่ต้องการ และข้อความที่พิมพ์จะถูกใช้เป็น caption ด้วย
เคยเห็นผลลัพธ์คล้ายกันใน Picxstudio ซึ่งเป็น แพลตฟอร์มสร้างภาพด้วย AI
น่าจะช่วยลดการพึ่งแอปนำทางและกลับไปเป็นคนขับรถแบบยุคก่อน
เพราะมี ถนนเดินรถทางเดียว เยอะมาก และโครงสร้างท่าเรือกับอุโมงค์ก็ซับซ้อน การจำทางในซิดนีย์จึงเป็นภารกิจตลอดชีวิต