- vừa được xem lúc

Tập 2 – Ngày tôi tạo bản đồ đầu tiên... và bị bão trong lòng quét qua

0 0 3

Người đăng: ViQy

Theo Viblo Asia

Phần 2 của Series Một mình tôi chống lại cả Google Maps (đùa đấy... mà thật đấy)

Mở đầu: Khi không có bão, ta show ảnh bão Kristy trên bản đồ ViQy Maps

“Trái đất không có bão. Nhưng tôi thì có một cơn trong lòng.” Đó là tôi, 3 năm trước – một đứa dev ngơ ngác với Leaflet, nhưng lại đầy tham vọng render bản đồ cho cả quốc gia, mà không hiểu mình vừa ký đơn đăng ký tự sát.

Hồi tưởng lại: DevTools là bạn, hay là thứ khiến bạn bị block 30 phút?

Kể từ sau Tập 1, tôi nhận được vài tín hiệu từ vũ trụ. Cụ thể là... một loạt IP cố gắng mở DevTools để xem thử tôi có "nổ" không:

"115.79.138.149": { "violationCount": 2 },
"116.97.104.146": { "violationCount": 1 },
"123.25.21.145": { "violationCount": 1 },
...

Kết luận lâm sàng: Curiosity kills the cat. Và nếu con mèo dùng DevTools, nó sẽ bị block 30 phút khỏi bản đồ.

Lời khuyên nhẹ nhàng: để lại comment, tôi chia sẻ code dần – khỏi cần làm người đi chợ sớm len lén lượn qua sạp hàng Tết.

Gạch đầu tiên: Tôi tạo bản đồ như thế nào với Leaflet?

Bạn nghĩ bản đồ quốc gia phải bắt đầu từ một hệ thống lớn lao? Không.

Tôi bắt đầu bằng... một file HTML trống, một cú script src="leaflet.js", và câu hỏi:

“Tại sao mình lại làm cái này?”

Nhưng rồi tôi viết:

var map = L.map('map').setView([21.0285, 105.8544], 13); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 19, attribution: '© OpenStreetMap'
}).addTo(map);

Đây là lần đầu tôi thấy Hà Nội xuất hiện trên bản đồ do tay mình render.

Tôi rơm rớm nước mắt.

Không phải vì xúc động.

Mà vì...

  • Mạng không lỗi
  • API không sai
  • Tôi quên đặt height cho cái <div id="map">...

30 phút ngồi nhìn cái khung trắng toát, lòng đầy hoài nghi:

“Mình sai ở đâu? Cuộc đời sai ở đâu?”

Tưởng Leaflet khó nhằn, ai ngờ chính tôi là “đứa con bị bỏ quên của CSS”.

Hello Leaflet, em đến không kèn không trống, dạy tôi bài học đầu đời:

Làm web bản đồ, trước hết phải nhớ... cho cái bản đồ nó hiện ra đã.

Không backend, không build tool, không React, không Webpack – vì tôi biết nếu dùng các hệ thống hiện đại, tôi sẽ mất 3 tháng để convert các thư viện cũ, chưa kể đọc tài liệu của Leaflet đã đủ mệt rồi.

"Nếu đời bạn đã đủ khó, đừng thêm Vite."

Khi L.tileLayer... không còn đủ

Trong quá trình phát triển, tôi thêm dữ liệu thời tiết, thiên tai, bão, cáp biển... Rồi tôi nhận ra: dùng L.tileLayer()một con đường không lối thoát nếu bạn muốn render quá nhiều thứ cùng lúc. Tại sao?

Nó tải ảnh nền theo từng ô.

Các lớp chồng lên nhau nhanh chóng trở thành một cái chăn bông code mà bạn không thể debug nổi.

Nếu bạn nghĩ thêm vài dòng là được thì... xin lỗi, bạn vừa mới đến chương 1.

Chuyển hướng: Dùng leaflet-maplibre-gl như một cú phản đòn

Và thế là tôi chuyển sang dùng:

L.maplibreGL({ style: 'https://quyhoachvietnam.com.vn/ViQy/tiles.json'
}).addTo(map);

Đây là cú pivot lớn nhất kể từ việc tôi bỏ Java để học JavaScript.

MapLibre GL giúp tôi render hàng chục lớp JSON một cách mượt mà như kem tươi trên bánh flan:

  • Thời tiết vệ tinh
  • Định hướng gió
  • Máy bay
  • Tàu biển
  • Bão nhiệt đới
  • Và... (spoiler) mạng lưới chém gió DevTools đang dần hoàn thiện

Tôi viết lại plugin gốc để:

  • Chạy nhiều JSON layer
  • Sync pan/zoom/bearing
  • Quản lý layer như admin group Facebook

Và khi tôi nhận ra... đây không còn là bản đồ quy hoạch nữa

Lúc đầu tôi chỉ muốn giúp người dân tra quy hoạch. Rồi thấy nhiều người hỏi về thời tiết, lại thêm mấy trận lũ ống, lũ quét, cá mập cắn cáp, bão đổ vào Biển Đông.

Thế là tôi nghĩ:

"Tại sao người Việt phải vào Windy, Zoom.Earth… để xem thông tin thiên tai?"

Ý tưởng ViQy Maps – bản đồ All-in-One, của người Việt, nhẹ, mượt, dữ liệu thời gian thực – bắt đầu từ đó.

Tập 2 khép lại với 2 điều:

  1. Tôi vẫn dùng JavaScript thuần, vì tôi thích hiểu từng dòng.
  2. Nếu bạn cũng đang làm một cái gì đó điên rồ một mình – hãy tiếp tục.

🫶 “ViQy Maps không phải bản đồ mạnh nhất. Nhưng là bản đồ tôi tự build từng dòng, debug từng đêm, từ những câu hỏi ngây thơ nhất.”

To be continued...

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 539

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 452

- vừa được xem lúc

Một số phương thức với object trong Javascript

Trong Javascript có hỗ trợ các loại dữ liệu cơ bản là giống với hầu hết những ngôn ngữ lập trình khác. Bài viết này mình sẽ giới thiệu về Object và một số phương thức thường dùng với nó.

0 0 166

- vừa được xem lúc

Tìm hiểu về thư viện axios

Giới thiệu. Axios là gì? Axios là một thư viện HTTP Client dựa trên Promise.

0 0 154

- vừa được xem lúc

Imports và Exports trong JavaScript ES6

. Giới thiệu. ES6 cung cấp cho chúng ta import (nhập), export (xuất) các functions, biến từ module này sang module khác và sử dụng nó trong các file khác.

0 0 118

- vừa được xem lúc

Bài toán đọc số thành chữ (phần 2) - Hoàn chỉnh chương trình dưới 100 dòng code

Tiếp tục bài viết còn dang dở ở phần trước Phân tích bài toán đọc số thành chữ (phần 1) - Phân tích đề và những mảnh ghép đầu tiên. Bạn nào chưa đọc thì có thể xem ở link trên trước nhé.

0 0 259