- 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 Star và 164 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
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
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.Ý kiến trên Hacker News
đó 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
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
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ờ
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
Có vẻ như họ lấy tile từ OSM rồi hậu xử lý ảnh
Kết quả trông khá đẹp
Không rõ có lý do đặc biệt nào khiến PNG được chọn làm mặc định không
plt.savefig(output_file, format='svg', facecolor=THEME['bg'])Tôi sẽ thêm tham số
--formatđể phản ánh điều đóChỉ một thành phố cỡ 500.000 dân thôi cũng mất cực kỳ lâu
El-co Color Poster Special
chỉ là hơi tốn công
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
ví dụ như Salem (OR/MA), Portland (OR/ME), Springfield (IL/MO), Dallas (TX/GA)
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
Tôi từng thấy kết quả tương tự ở Picxstudio, đó là một nền tảng tạo ảnh AI
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
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