9 คะแนน โดย GN⁺ 2026-01-19 | 3 ความคิดเห็น | แชร์ทาง WhatsApp
  • เครื่องมือโอเพนซอร์สบนพื้นฐาน 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 ความคิดเห็น

 
xguru 2026-01-20

ผมลองทำเวอร์ชันแถวโซล/ปูซานดูครั้งหนึ่งแล้ว ผลออกมาค่อนข้างดี เลยแนบไว้ในบัญชีทวิตเตอร์ GeekNews ครับ
โซล : https://x.com/GeekNewsHada/status/2013410000031395905
ปูซาน : https://x.com/GeekNewsHada/status/2013412083749265695

 
kunggom 2026-01-20

ในความเห็นฝั่ง Hacker News ก็มีการพูดถึง city-roads ซึ่งเคยถูกโพสต์ที่นี่มาก่อนเช่นกัน

 
GN⁺ 2026-01-19
ความคิดเห็นจาก Hacker News
  • มีโปรเจกต์ที่เกี่ยวข้องกันที่เคยใช้หลายครั้ง
    คือ city-roads (GitHub) ซึ่งรองรับ การส่งออก SVG และลองใช้งานออนไลน์ได้ทันที
    ผู้สร้างอย่าง Anvaka ก็ทำ โปรเจกต์ด้านการทำภาพข้อมูล เจ๋ง ๆ อื่น ๆ ไว้อีกมาก
  • เป็นโปรเจกต์ที่เจ๋งมากจริง ๆ
    แต่การปรับพารามิเตอร์ของถนนค่อนข้างจุกจิกนิดหน่อย
    ไอเดียสำหรับการปรับปรุงคือ แทนที่จะใส่ชื่อเมืองอย่างเดียว ก็ควร รับพิกัด เพื่อให้ตั้งศูนย์กลางที่จุดเฉพาะได้ และควรมีฟีเจอร์ที่ส่งออกหลายสไตล์พร้อมกันเพื่อเลือกด้วยสายตาได้
    ยังไงก็ถือว่าเป็นงานที่ยอดเยี่ยม
  • ภาพของซานฟรานซิสโกดูดี แต่ในบางตัวอย่างเหมือนจะมีปัญหาเรื่อง projection
    มันดูเหมือนการฉายภาพทรงกลมทั้งโลกมากกว่า UTM เลยไม่ค่อยเหมาะกับการเรนเดอร์พื้นที่เฉพาะจุด
    ที่ README ไม่พูดถึง projection เลยก็ดูน่าสงสัยนิดหน่อย
    • นี่เป็น โปรเจกต์งานศิลปะ สำหรับทำโปสเตอร์ที่สนุกและมีความเป็นศิลป์ ดังนั้นวิธีฉายภาพจึงไม่ใช่ประเด็นสำคัญ
      แถมยังเป็นโอเพนซอร์สด้วย ถ้ามีประสบการณ์ทำแผนที่ก็น่าจะลองเสนอการปรับปรุงผ่าน pull request ได้
    • ในภาพสุดท้ายมี เอฟเฟ็กต์ vignette ทำให้มุมภาพค่อย ๆ จางหายไปอย่างเป็นธรรมชาติ
      น่าจะเป็นการดึง OSM tile มาแล้วทำ post-processing กับภาพต่อ
      ผลลัพธ์ออกมาดูดีมาก
  • ลองดูโค้ดคร่าว ๆ แล้ว ด้วย matplotlib น่าจะแก้เพียงเล็กน้อยก็ ส่งออก SVG ได้
    เลยสงสัยว่ามีเหตุผลพิเศษอะไรหรือเปล่าที่ตั้ง PNG เป็นค่าเริ่มต้น
    • ชี้ประเด็นได้ดีมาก แก้ได้ด้วย plt.savefig(output_file, format='svg', facecolor=THEME['bg'])
      มีแผนจะเพิ่มพารามิเตอร์ --format เพื่อรองรับเรื่องนี้
    • ลองส่งออกเมืองใหญ่เป็น PDF/SVG แล้วพบว่า ช้ามาก
      แค่เมืองที่มีประชากร 500,000 คนเมืองเดียวก็กินเวลานานมากแล้ว
  • ถ้าอยากเอาภาพแบบนี้ไป พิมพ์เป็นโปสเตอร์ จริง ๆ ควรใช้วิธีไหนดี
    • El-co Color ในนิวเจอร์ซีย์รับพิมพ์โปสเตอร์ขนาด 20x30 นิ้วในราคาย่อมเยา
      El-co Color Poster Special
    • เมื่อก่อนเคยมีบริการที่เอาแผนที่แบบนี้ไปทำเป็น แผนที่นูนด้วยเครื่องพิมพ์ 3D แล้วใส่กรอบให้ด้วย
    • ฉันใช้ Vistaprint ไม่ได้เปรียบเทียบเยอะมาก แต่คิดว่าราคาและคุณภาพโอเค
    • ถ้าอยากทำเอง ลองใช้ Rasterbator.net เพื่อพิมพ์หลายแผ่นแล้วประกอบเป็น โปสเตอร์ DIY ได้
      แต่ต้องลงแรงพอสมควร
    • ในสหรัฐฯ คุณภาพงานพิมพ์ของ Staples ถือว่าดีทีเดียว
  • รีโพซิทอรีนี้ยอดเยี่ยมจริง ๆ
    README ถือเป็น ตัวอย่างแนวปฏิบัติที่ดีของ OSS ได้เลย และผลงานที่ออกมาก็สวยอย่างน่าทึ่ง
  • ลองดู prettymapp ควบคู่กันไปก็ดี
  • สงสัยว่าจะเกิดอะไรขึ้นเมื่อมีหลายเมืองที่ใช้ชื่อเดียวกัน
    เช่น Salem(OR/MA), Portland(OR/ME), Springfield(IL/MO), Dallas(TX/GA)
    • ถ้าพิมพ์แค่ "Salem" ระบบจะเลือกเมืองหนึ่งขึ้นมาแบบตามใจ
      แต่ถ้าพิมพ์ว่า "Salem, Oregon" หรือ "Salem, MA" ก็จะได้ผลลัพธ์ตามที่ต้องการ และข้อความที่พิมพ์จะถูกใช้เป็น caption ด้วย
    • ในสหรัฐฯ ก็มีเมืองจำนวนมากที่ ตั้งชื่อตามเมืองดังของโลก อย่าง Paris, London, Athens
    • ไม่เคยนึกถึงประเด็นนั้นเลย น่าจะต้องเพิ่ม ฟีเจอร์ให้ใส่ประเทศได้ด้วย
  • อยากรู้ว่าโปรเจกต์นี้ใช้ แนวทางแบบอิงกราฟ หรือเป็นการสร้างภาพทั่วไป
    เคยเห็นผลลัพธ์คล้ายกันใน Picxstudio ซึ่งเป็น แพลตฟอร์มสร้างภาพด้วย AI
  • เคยอยากทำแผนที่ถนนของซิดนีย์เป็น จิ๊กซอว์ เพื่อเล่นไปด้วยและจำโครงสร้างถนนไปด้วย
    น่าจะช่วยลดการพึ่งแอปนำทางและกลับไปเป็นคนขับรถแบบยุคก่อน
    • มีเหตุผลที่ Where 2 ในซิดนีย์พัฒนากลายมาเป็น Google Maps
      เพราะมี ถนนเดินรถทางเดียว เยอะมาก และโครงสร้างท่าเรือกับอุโมงค์ก็ซับซ้อน การจำทางในซิดนีย์จึงเป็นภารกิจตลอดชีวิต