9 điểm bởi GN⁺ 2026-01-19 | 3 bình luận | Chia sẻ qua WhatsApp
  • Công cụ mã nguồn mở dựa trên Python cho phép tạo poster nghệ thuật tối giản từ bản đồ thành phố trên toàn thế giới
  • Tận dụng dữ liệu OpenStreetMap (OSMnx) để trực quan hóa các yếu tố địa hình như đường sá, thủy hệ, công viên và render bằng matplotlib
  • Cung cấp 17 phong cách chủ đề (ví dụ: neon_cyberpunk, blueprint, japanese_ink...) và có thể thêm chủ đề tùy chỉnh bằng tệp JSON
  • Từ dòng lệnh, có thể chỉ định tên thành phố, tên quốc gia, bán kính và chủ đề để tự động tạo và lưu poster
  • Công cụ kết hợp thiết kế và trực quan hóa dữ liệu, giúp nhà phát triển và nhà thiết kế khám phá cấu trúc đô thị theo cách nghệ thuật

Tổng quan dự án

  • MapToPoster là một script Python tạo poster thiết kế tối giản dựa trên bản đồ của thành phố do người dùng chỉ định
    • Poster được tạo sẽ tự động lưu vào thư mục posters/
    • Được phát hành theo giấy phép MIT nên có thể tự do chỉnh sửa và phân phối
  • Kho mã hiện có khoảng 2.7k Star164 Fork

Tính năng chính

  • Tạo poster qua giao diện dòng lệnh (CLI) bằng cách nhập tên thành phố (--city), tên quốc gia (--country), chủ đề (--theme), khoảng cách (--distance)
  • Có thể xem danh sách tất cả chủ đề khả dụng bằng tùy chọn --list-themes
  • Thiết lập bán kính phù hợp theo quy mô thành phố dựa trên giá trị khoảng cách (distance)
    • 4.000–6.000m: thành phố nhỏ
    • 8.000–12.000m: thành phố vừa
    • 15.000–20.000m: đô thị lớn

Cấu hình chủ đề

  • Thư mục themes/ bao gồm 17 tệp JSON chủ đề
    • Ví dụ: noir, blueprint, neon_cyberpunk, warm_beige, forest, terracotta...
  • Mỗi chủ đề định nghĩa các thuộc tính màu như màu nền, màu đường, mặt nước, công viên...
  • Người dùng có thể tự thêm chủ đề mới bằng định dạng JSON
    • Ví dụ: "bg": "#FFFFFF", "road_primary": "#1A1A1A"...

Ví dụ sử dụng

  • Có thể tạo poster với nhiều tổ hợp thành phố và chủ đề khác nhau
    • 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
  • Các poster ví dụ bao gồm những thành phố như San Francisco, Venice, Marrakech, Singapore

Cấu trúc nội bộ và kiến trúc

  • Các thành phần chính gồm CLI Parser, Geocoding (Nominatim), Data Fetching (OSMnx), Rendering (matplotlib)
  • Thứ tự render (z-order): nền → mặt nước → công viên → đường → gradient → văn bản
  • Các hàm chính
    • get_coordinates(): tra cứu vĩ độ/kinh độ theo tên thành phố
    • create_poster(): toàn bộ pipeline render
    • get_edge_colors_by_type(): chỉ định màu theo loại đường
    • get_edge_widths_by_type(): thiết lập độ dày theo mức độ quan trọng của đường
    • load_theme(): nạp chủ đề JSON

Mở rộng và tùy biến

  • Muốn thêm lớp bản đồ mới (ví dụ: đường sắt), có thể nạp dữ liệu OSMnx và render trong create_poster()
  • Khi thêm thuộc tính chủ đề mới, cần định nghĩa ở cả JSON lẫn mã nguồn (load_theme())
  • Quy tắc bố trí chữ
    • Tên thành phố: y=0.14
    • Tên quốc gia: y=0.10
    • Tọa độ: y=0.07
    • Ghi nguồn: y=0.02

Mẹo tối ưu hiệu năng

  • Nếu giá trị dist từ 20km trở lên, tốc độ tải xuống sẽ chậm hơn và mức dùng bộ nhớ tăng lên
  • Có thể tránh giới hạn yêu cầu của Nominatim bằng cache tọa độ
  • Thiết lập network_type='drive' giúp tăng tốc độ render
  • Có thể giảm dpi xuống 150 để xem trước nhanh hơn

Ngăn xếp công nghệ và giấy phép

  • Viết hoàn toàn bằng Python 100%
  • Thư viện chính: OSMnx, matplotlib, argparse
  • Phát hành theo MIT License, cho phép sử dụng thương mại và chỉnh sửa

Tóm tắt

  • MapToPoster là một công cụ nghệ thuật hóa bản đồ thành phố bằng mã nguồn, kết hợp trực quan hóa dữ liệu và thiết kế trong một dự án mã nguồn mở
  • Đây là công cụ hữu ích để nhà phát triển, nhà thiết kế và chuyên gia trực quan hóa dữ liệu khám phá cấu trúc đô thị dưới dạng nghệ thuật

3 bình luận

 
xguru 2026-01-20

Mình đã thử làm một bản cho khu vực Seoul/Busan, thấy khá ổn nên đã đính kèm trên tài khoản Twitter của GeekNews.
Seoul : https://x.com/GeekNewsHada/status/2013410000031395905
Busan : https://x.com/GeekNewsHada/status/2013412083749265695

 
kunggom 2026-01-20

Bên phía Hacker News cũng có nhắc đến city-roads, trước đây nó cũng từng được đăng ở đây.

 
GN⁺ 2026-01-19
Ý kiến trên Hacker News
  • Có một dự án liên quan mà tôi đã dùng vài lần
    đó là city-roads (GitHub), hỗ trợ xuất SVG và cũng có thể thử trực tiếp ngay trên web
    Tác giả Anvaka cũng làm rất nhiều dự án trực quan hóa dữ liệu hay khác
  • Đây thực sự là một dự án rất tuyệt
    chỉ là việc điều chỉnh tham số khoảng cách đường hơi khó một chút
    Một vài ý tưởng cải thiện là cho phép nhập tọa độ thay vì tên thành phố để có thể đặt tâm vào một điểm cụ thể, và xuất nhiều phong cách cùng lúc để chọn bằng mắt
    Dù sao thì đây vẫn là một công trình xuất sắc
  • Hình San Francisco rất đẹp, nhưng ở một vài mẫu có vẻ có vấn đề với phép chiếu bản đồ
    Trông giống phép chiếu cầu toàn cục hơn là UTM, nên không phù hợp để render khu vực cục bộ
    Việc README không nhắc đến projection khiến tôi hơi nghi ngờ
    • Đây là một dự án nghệ thuật để tạo poster vui nhộn và có tính thẩm mỹ, nên phép chiếu không quá quan trọng
      Hơn nữa nó còn là mã nguồn mở, nên bạn có thể tận dụng kinh nghiệm làm bản đồ của mình để đề xuất cải tiến qua pull request
    • Ở ảnh cuối cùng có hiệu ứng vignette khiến các góc mờ dần một cách tự nhiên
      Có vẻ như họ lấy tile từ OSM rồi hậu xử lý ảnh
      Kết quả trông khá đẹp
  • Tôi lướt qua mã một chút, và nhờ matplotlib nên có vẻ chỉ cần sửa nhẹ là có thể xuất SVG
    Không rõ có lý do đặc biệt nào khiến PNG được chọn làm mặc định không
    • Ý hay đấy. Có thể giải quyết bằng plt.savefig(output_file, format='svg', facecolor=THEME['bg'])
      Tôi sẽ thêm tham số --format để phản ánh điều đó
    • Tôi đã thử xuất một thành phố lớn sang PDF/SVG và tốc độ rất chậm
      Chỉ một thành phố cỡ 500.000 dân thôi cũng mất cực kỳ lâu
  • Tôi tò mò không biết cách nào là tốt nhất để in những hình này thành poster ngoài đời
    • El-co Color ở New Jersey in poster 20x30 inch với giá rẻ
      El-co Color Poster Special
    • Trước đây cũng từng có dịch vụ biến kiểu bản đồ này thành bản đồ nổi in 3D rồi đóng khung
    • Tôi dùng Vistaprint. Chưa so sánh quá nhiều nơi, nhưng giá và chất lượng đều ổn
    • Nếu muốn tự làm, bạn có thể dùng Rasterbator.net để ghép nhiều tờ thành poster DIY
      chỉ là hơi tốn công
    • Ở Mỹ thì chất lượng in của Staples khá tốt
  • Kho lưu trữ này thực sự rất xuất sắc
    README có thể xem như hình mẫu thực hành OSS, còn kết quả thì đẹp đến kinh ngạc
  • Cũng nên xem thử prettymapp
  • Tôi tò mò không biết khi có nhiều thành phố trùng tên thì chuyện gì xảy ra
    ví dụ như Salem (OR/MA), Portland (OR/ME), Springfield (IL/MO), Dallas (TX/GA)
    • Nếu chỉ nhập "Salem" thì nó sẽ chọn ngẫu nhiên một thành phố
      Nếu nhập như "Salem, Oregon" hoặc "Salem, MA" thì sẽ ra đúng kết quả mong muốn, và phần văn bản bạn nhập sẽ được dùng làm caption
    • Ở Mỹ cũng có nhiều thành phố lấy tên từ các thành phố nổi tiếng thế giới như Paris, London, Athens
    • Tôi chưa từng nghĩ đến chuyện đó. Có lẽ cần thêm tính năng nhập cả quốc gia
  • Tôi tò mò không biết dự án này dùng cách tiếp cận dựa trên đồ thị hay chỉ là kiểu tạo ảnh thông thường
    Tôi từng thấy kết quả tương tự ở Picxstudio, đó là một nền tảng tạo ảnh AI
  • Tôi từng muốn biến bản đồ đường phố Sydney thành trò ghép hình jigsaw để vừa chơi vừa học cấu trúc đường sá
    Làm vậy có lẽ sẽ bớt phụ thuộc vào app điều hướng và lái xe kiểu cũ hơn
    • Có lý do mà Where 2 ở Sydney phát triển thành Google Maps
      Sydney có quá nhiều đường một chiều, cộng thêm cấu trúc cảng và đường hầm phức tạp, nên học thuộc đường ở Sydney là nhiệm vụ cả đời