9 điểm bởi GN⁺ 2024-04-22 | 1 bình luận | Chia sẻ qua WhatsApp

Giới thiệu tinyworldmap

  • tinyworldmap là bản đồ thế giới dành cho ứng dụng web ưu tiên ngoại tuyến và băng thông thấp
  • Được thiết kế để dùng cùng Leaflet và hỗ trợ mọi mức thu phóng
  • Phiên bản đầy đủ nhất chỉ khoảng 300kB khi nén bằng gzip
  • Kết xuất phía máy khách đã được profiling và kiểm thử rộng rãi trên các điện thoại cấu hình thấp từ 10 năm trước, không có độ trễ đáng замет
  • Mặc định hiển thị 10.000 thành phố đông dân nhất đã được thêm vào OpenStreetMap
  • Tại thời điểm viết, bao gồm mọi thành phố và thị trấn có dân số trên 48.000 người

Cách dùng tinyworldmap

Dùng làm bản đồ cơ sở

  • Để dùng tinyworldmap làm bản đồ cơ sở trong Leaflet, thêm nội dung sau vào thẻ head:

  • Script này chứa toàn bộ dữ liệu cần thiết để hiển thị bản đồ
  • Thay vì thêm tile layer vào bản đồ Leaflet, hãy dùng:
new L.GridLayer.TinyWorld().addTo(map)
  • Hàm khởi tạo TinyWorld nhận nhiều tùy chọn: backgroundColor, textFillColor, borderStrokeColor, borderFillColor, borderWidth, textStrokeColor (để tách chữ khỏi phần còn lại), textStrokeWidth, cityFont (ví dụ: "12px Arial"), countryFont, dotColor
  • Nếu chỉ định dotColor, mỗi thành phố sẽ được hiển thị dưới dạng một chấm. Điều này cải thiện khả năng sử dụng khi dùng phiên bản tinyworldmap rút gọn không có biên giới

Dùng làm bản đồ fallback

  • Trong ứng dụng web ưu tiên ngoại tuyến, việc cache bản đồ dựa trên ảnh ở mọi mức thu phóng là không khả thi (số lượng tile quá lớn và dung lượng lên tới hàng terabyte)
  • Kho lưu trữ này cung cấp service worker để bật khả năng ngoại tuyến cho ứng dụng web
  • Khi service worker được cài đặt, bản đồ fallback sẽ được tải trước. Mọi trang đã truy cập sẽ được cache, trừ bản đồ cơ sở
  • Khi vẫn có thể kết nối tới máy chủ, dữ liệu đã cache sẽ không được sử dụng
  • Nếu người dùng ở trạng thái ngoại tuyến, website sẽ được phục vụ từ cache và service worker sẽ chặn các yêu cầu tới máy chủ tile OSM, sau đó dùng tinyworldmap để tạo tile thay thế cục bộ
  • Trước khi đăng ký service worker, trước tiên cần chỉnh sửa tất cả các phần được đánh dấu là 'IMPORTANT' trong service worker
  • Sau khi đăng ký, cần ghi rõ cả OpenStreetMap và tinyworldmap trong thuộc tính của tile layer như sau:
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
  maxZoom: 19,
  attribution: '© [OpenStreetMap](https://www.openstreetmap.org/copyright), [tinyworldmap](https://www.tinyworldmap.com)'
}).addTo(map);
  • Để xem ví dụ về ứng dụng production dùng tinyworldmap làm fallback, hãy truy cập Hitchmap. Tải website bằng trình duyệt hỗ trợ service worker, chờ một lúc, sau đó tắt Internet và tải lại; ứng dụng web sẽ vẫn hoạt động bình thường bằng bản đồ fallback. Việc cài đặt service worker có thể mất một chút thời gian

Bản đồ thế giới nhỏ hơn nữa

  • Bản đồ đầy đủ có dung lượng 300K khi nén gzip / 694K khi giải nén. Với một số trường hợp sử dụng, kích thước này vẫn có thể còn quá lớn

Không có đường biên giới

  • tiny-world-noborders-10000.js(on) chứa toàn bộ dữ liệu của phiên bản đầy đủ, ngoại trừ biên giới và đường bờ biển
  • Phiên bản nén gzip giảm 100k, phiên bản giải nén giảm 200k
  • Phiên bản không có biên giới không chỉ nhỏ hơn mà còn có ưu điểm là toàn bộ dữ liệu đi kèm đều chính xác
  • Biên giới trong phiên bản đầy đủ không chính xác ở mức thu phóng cao, nên khi chồng các shape khớp với biên giới và đường bờ biển, hiển thị có thể trông kỳ lạ. Trong những trường hợp đó, phiên bản không biên giới sẽ phù hợp hơn
  • Kiểu mặc định như sau

Không có thành phố

  • Có thể dùng hai phiên bản không có nhãn thành phố: tiny-world-nocities.js(on) (giữ nhãn quốc gia) và tiny-world-borders.js(on) (bỏ nhãn quốc gia)
  • Nhãn thành phố chiếm 410K khi không nén và 172K khi nén

Ít thành phố hơn

  • Cuối cùng, mỗi tệp có nhãn thành phố cũng có các phiên bản gồm 2.000 và 4.000 thành phố
  • Chỉ cần thay 10000 trong tên tệp bằng 2000 hoặc 4000
Số thành phố được bao gồm Dân số
10,000 > 48,000
4,000 > 137,000
2,000 > 287,000

Thuê tinyworldmap

  • Nếu cần bản đồ tùy chỉnh (ví dụ: chi tiết hơn hoặc bằng ngôn ngữ khác) hoặc cần trợ giúp triển khai tính năng ngoại tuyến trên website, hãy liên hệ business@tinyworldmap.com

Ghi công nguồn

  • Giống như dữ liệu OpenStreetMap, dữ liệu tinyworldmap được cấp phép theo ODBL nên bắt buộc phải hiển thị ghi công
  • Nếu đã làm theo các bước mô tả ở trên, phần chân trang Leaflet phải bao gồm ghi công cho cả OpenStreetMap và tinyworldmap. Nếu chưa có, hãy thêm nội dung sau:
© [OpenStreetMap](https://www.openstreetmap.org/copyright), [tinyworldmap](https://www.tinyworldmap.com)

Ý kiến của GN⁺

  • tinyworldmap cung cấp một bản đồ thế giới nhẹ có thể dùng cho bản đồ ngoại tuyến hoặc thiết bị cấu hình thấp. Đây có vẻ là một giải pháp có thể thay thế cho OpenStreetMap hiện có
  • Ưu điểm là cung cấp các phiên bản nhẹ hơn bằng cách tùy chọn loại bỏ biên giới, thành phố, v.v. Có thể dùng bản đồ tùy chỉnh theo nhu cầu nên phạm vi ứng dụng có vẻ khá rộng
  • Tuy nhiên, để hoạt động ngoại tuyến thì vẫn cần triển khai kỹ thuật như chỉnh sửa service worker, vì vậy nhà phát triển sẽ cần có một mức độ kinh nghiệm nhất định. Sẽ tốt hơn nếu có thêm hướng dẫn chi tiết cho phần này
  • Tại Hàn Quốc, các API bản đồ của cổng thông tin như Naver, Kakao được sử dụng nhiều; nếu có thể tích hợp với các dịch vụ như vậy để hoạt động ngoại tuyến thì có lẽ sẽ có thêm nhiều trường hợp ứng dụng hơn
  • Vì chứa thông tin về các thành phố lớn trên toàn thế giới, nó có thể hữu ích trong các lĩnh vực như du lịch, logistics, v.v. Khả năng hỗ trợ đa ngôn ngữ cũng có thể sẽ là yếu tố then chốt

1 bình luận

 
GN⁺ 2024-04-22
Ý kiến trên Hacker News
  • Tác giả cho rằng nên dồn nhiều dữ liệu hơn vào đường bờ biển và việc phân biệt các đại đô thị lớn, thay vì chi tiết của khu vực ngoại ô Detroit.
  • Có ý kiến chỉ ra rằng chi tiết đường bờ biển còn thiếu, một vài thị trấn ở Anh thì bị chìm xuống biển, trong khi Greenland và miền bắc Canada lại chiếm quá nhiều đỉnh. Có vẻ phép chiếu Mercator đã được phản ánh sẵn, nhưng cũng có ý kiến cho rằng nên hạ mức ưu tiên của những khu vực không có dân cư.
  • Một người dùng đã tạo một bản đồ tương tự theo hướng offline-first, siêu nhỏ gọn, dựa trên vector, tập trung vào quốc tế hóa (i18n) bằng các ngôn ngữ chính thức của Liên Hợp Quốc (trừ tiếng Tây Ban Nha). Tên quốc gia và thành phố sử dụng các tên gọi được Liên Hợp Quốc chính thức công bố.
  • Có ý kiến cho biết họ phát hiện dân số của 10.000 khu định cư hàng đầu trên toàn thế giới giảm xuống tới mức 48.000 người, nhưng vẫn khó đánh giá liệu đây có phải là một con số đáng ngạc nhiên hay không.
  • Ý tưởng nén dữ liệu không gian thành các path rất ấn tượng và được đánh giá là tải cực nhanh trên di động. Tuy nhiên, cũng có đề xuất nên dùng dữ liệu Natural Earth thay vì OSM để loại bỏ giấy phép ODbL, đồng thời kèm theo công cụ chuyển dữ liệu không gian thành path.
  • Cũng có ý kiến cho rằng nên bao gồm và đánh dấu đặc biệt các thủ đô bất kể quy mô dân số, và rằng bản đồ này có vẻ rất phù hợp để trả lời trên các trang về loài rằng có thể tìm thấy loài đó ở đâu trên thế giới một cách gần đúng.
  • Có chỉ ra rằng việc dùng service worker cho phiên bản offline là hơi kỳ lạ, và cần một hướng dẫn ngắn gọn hơn để mọi người có thể cài đặt và sử dụng nhanh chóng. Chỉ cần cung cấp một tệp HTML mã hóa base64 các tile hoặc một tệp ZIP có thể sẽ tốt hơn.
  • Thật thú vị khi những thay đổi gần đây về tên gọi ưu tiên như Czechia và Macedonia đã được phản ánh, nhưng Turkey và Timor-Leste thì vẫn chưa.
  • Progressive loading hơi thiếu ổn định, nên đôi khi khi phóng to hoặc di chuyển nhanh thì tile không hiển thị.