Các vector tile mới của OpenStreetMap
(tech.marksblogg.com)- OpenStreetMap từ lâu đã cung cấp raster tile dựa trên PNG tĩnh, nhưng nay đã bắt đầu lưu trữ vector tile ở định dạng Mapbox Vector Tiles (MVT), mở rộng cách sử dụng bản đồ
- Vector tile cho phép người dùng điều chỉnh style và quy tắc render, đồng thời mở ra khả năng trích xuất thông tin trong tile hoặc triển khai các chức năng như chuyển đổi ngôn ngữ nhãn
- Website OSM chính vẫn dùng raster tile, nhưng các vector tile mới có thể được xem trực tiếp qua demo web riêng, QGIS và Leafmap
- Ví dụ tile z14 gần Burj Khalifa cho thấy tệp MVT 114KB được chuyển thành JSON 1,4MB; lớp POI chứa 474 bản ghi và nhiều khóa lớp cấp cao nhất
- Dùng
tiles2columnscó thể tải các vector tile OSM trong bounding box được chỉ định và chuyển thành GeoPackage hoặc Parquet, giúp dễ dàng dùng dữ liệu OSM đã cập nhật cho phân tích dựa trên tệp
Điểm thay đổi của tile OSM
- OpenStreetMap từ trước đến nay cung cấp bản đồ dưới dạng raster tile PNG tĩnh với quy tắc render và style đã được định sẵn
- Dịch vụ lưu trữ mới cung cấp Mapbox Vector Tiles, tức vector tile định dạng MVT
- Khi dùng vector tile, người dùng cuối có thể kiểm soát cách biểu diễn bản đồ trực tiếp hơn
- Điều chỉnh style và quy tắc render
- Trích xuất thông tin nền tảng có trong từng tile
- Hiển thị hình ảnh bản đồ sắc nét hơn
- Có khả năng chuyển đổi ngôn ngữ nhãn
- Website OSM chính vẫn cung cấp raster tile
- Có thể xem các vector tile mới trên hầu hết điện thoại và máy tính để bàn qua demo web
Công cụ dùng trong thực hành
- Các ví dụ trực quan hóa và phân tích dữ liệu OSM bằng Python cùng nhiều công cụ địa không gian
- Các công cụ cài đặt cơ bản gồm
jq,python3-pip,python3-virtualenv - Trong môi trường ảo Python, cài các package sau
leafmap[maplibre]mapbox_vector_tilemorecantilenotebook
- DuckDB được dùng cùng các extension sau
- Việc render bản đồ dùng QGIS 3.40
- QGIS là ứng dụng desktop chạy trên Windows, macOS và Linux
- Số lần chạy ứng dụng của người dùng trên toàn thế giới ở mức khoảng 15 triệu lần mỗi tháng
Mở vector tile trong QGIS
- Trong QGIS có thể thêm vector tile OSM qua
Layer Menu -> Add Layer -> Add Vector Tile Layer - Ở kết nối mới, dùng giá trị sau cho URL style
- Với URL nguồn, chỉ định endpoint MVT sau
- Stylesheet là tùy chọn; ngay cả khi không có, QGIS vẫn có thể render dữ liệu vector bằng màu ngẫu nhiên
- Trong QGIS đã ghi nhận vấn đề render icon bị lệch
- Các công cụ bản đồ khác render đúng sprite của style này
- Trong QGIS, icon trông như icon màu đen bị mờ
- Vấn đề liên quan nằm ở QGIS #59492
Render bằng Leafmap và Jupyter Notebook
- Tạo thư mục cấu hình Jupyter Notebook, đặt mật khẩu, rồi chạy server trên
127.0.0.1 - Notebook chạy với quyền của người dùng đã khởi chạy và có thể phơi bày thư mục hiện tại cùng các tệp con, nên cách được dùng là chạy trong một thư mục trống
- Trong Leafmap, dùng
leafmap.maplibreglvà chỉ địnhcolorful.jsonlàm URL style để render khu vực quanh Burj Khalifa - Trong render của Leafmap, icon POI hiển thị đúng
Chuyển MVT thành dữ liệu có thể phân tích
- Dùng tile zoom level 14 gần Burj Khalifa làm ví dụ
- Đưa tọa độ xấp xỉ
[55.27, 25.2]vàomorecantile tiles 14để lấy tọa độ tile[10707, 7006, 14] - Với các giá trị đó, tải tile sau
- Tệp MVT 114KB được chuyển thành tệp JSON 1,4MB bằng
mapbox_vector_tile.decodevà hàm chuyển đổi tọa độ - Các khóa cấp cao nhất của tile đã chuyển đổi gồm những lớp sau
addressesbridgesbuildingsferrieslandoceanpier_linespier_polygonsplace_labelspoispublic_transportsitesstreet_labelsstreet_polygonsstreetsstreets_labels_pointswater_polygonswater_polygons_labels
Xem xét lớp POI bằng DuckDB
- Sau khi trích xuất lớp
poisthành tệp JSON riêng, mở và phân tích bằngST_READcủa DuckDB - Các POI có giá trị
cuisineđược truy vấn ra 67 hàng- Ví dụ
amenitygồmrestaurant,fast_food,cafe - Ví dụ
cuisinegồmfrench,greek,american,lebanese,coffee_shop,asian,persian,chicken,pizza
- Ví dụ
- Kết quả
SUMMARIZEcủa DuckDB cho thấy mức độ dữ liệu POI được điền- Tổng số bản ghi POI là 474
- Tỷ lệ null của
name,name_de,name_enlần lượt là 29,96% - Tỷ lệ null của
amenitylà 31,86% - Tỷ lệ null của
cuisinelà 85,86% - Tỷ lệ null của
geomlà 0,00%
- Theo
approx_unique,namecó 258 giá trị,name_decó 264,name_encó 245,amenitycó 27 vàcuisinecó 39 giá trị
Trích xuất bounding box bằng tiles2columns
- osm_split hiện có là công cụ chuyển tệp OSM PBF do GeoFabrik tạo thành các tệp GeoPackage có tên
- Khi có thể xử lý, các tệp PBF của GeoFabrik có thể đã là dữ liệu từ vài ngày trước
- Vector tile OSM mới được cập nhật ngay sau khi dữ liệu nền tảng được chỉnh sửa
- tiles2columns là tiện ích dựa trên Python để tải các tile OSM trong bounding box được chỉ định và chuyển thành tệp GeoPackage hoặc Parquet
- Ví dụ bounding box quanh phía bắc Dubai tải 42 tile và tạo các tệp GeoPackage cỡ vài MB
streets.gpkg: 6,8MBbuildings.gpkg: 6,2MBpois.gpkg: 1,4MBstreet_labels.gpkg: 1,4MBland.gpkg: 744KB
- Các tệp GeoPackage được tạo có thể đưa trực tiếp vào dự án QGIS
- Các tệp được tách theo từng khóa dùng trong tệp OSM MVT, giúp dễ nhận diện, style và phân tích từng lớp một cách độc lập
- Thuộc tính của từng geometry được lưu trong các cột riêng
- Ví dụ truy vấn các POI có tên trong
pois.gpkgtrả về 6.329 hàng, gồm các tên nhưKiku,Fujiya Restaurant,Mövenpick Grand Al Bustan Dubai,McDonald's
2 bình luận
Quỹ OpenStreetMap đã chính thức bắt đầu vận hành các tile bản đồ vector
Ý kiến trên Hacker News
Tôi có cảm giác hơi phức tạp về ô bản đồ vector. Đến giờ tôi vẫn chưa tìm được tổ hợp giữa style và schema của trình tạo tile có thể hiển thị mức chi tiết tương đương tile raster vốn có
Chỉ nhìn ảnh chụp màn hình trong bài cũng thấy khác biệt rất rõ. Ảnh đầu tiên có rất nhiều thông tin: các điểm quan tâm như tượng, cửa hàng, nhà hát, đài quan sát; đường được thể hiện bằng cầu; sự khác biệt màu giữa bãi cỏ và công viên; độ dày nét theo từng loại đường; sân thể thao; tên tòa nhà và khu phố; mũi tên đường một chiều; một phần tòa nhà; cầu thang; cây cối, v.v.
Ảnh thứ hai thì gần như chỉ có một trạm trolley và một tên đường, mà tên đường đó còn được render sai
Tôi đã dùng khá nhiều style của openmaptiles, style mặc định của protomaps, style của mapbox cùng các trình tạo protomaps, openmaptiles, mapbox, nhưng chưa có cái nào vừa dễ đọc vừa nhiều chi tiết như tile raster của OSM
Style vector thì zoom và pan mượt, cũng dễ chỉnh style, nhưng nếu không dùng làm bản đồ nền cho dữ liệu của mình mà muốn xem dữ liệu bản đồ thật sự thì vẫn còn thiếu
Có lẽ cũng do giới hạn tài nguyên tính toán. Để hiển thị mức chi tiết như tile raster của OSM có thể sẽ tiêu tốn quá nhiều tài nguyên ở cả phía client lẫn khâu tạo tile
Tôi mong OpenStreetMap sẽ mô phỏng sát hơn style raster hiện có thay vì cung cấp thêm một bản đồ nền độ tương phản thấp, ít chi tiết; và hy vọng bản phát hành tile vector công khai lần này sẽ giúp tạo ra các bản đồ vector chi tiết hơn
Duy trì một hạ tầng tạo tile raster hiện đại là một công việc khá lớn
Trước đây tôi đã phát triển trong thời gian dài một style rất chi tiết để lập kế hoạch du lịch bằng xe đạp: https://stevebennett.me/2015/01/14/cycletour-org-a-better-ma...
Tôi đã nhiều lần cố tái hiện nó bằng tile vector, nhưng khá khó để đưa đủ chi tiết vào mà không vướng giới hạn kích thước, còn tile Mapbox mặc định thì thiếu rất nhiều thông tin cần thiết
Tuy vậy, tile vector cũng có những cách xử lý mà tile raster không có. Ví dụ có thể bật/tắt các layer khác nhau, trong khi label vẫn nhận biết được bên dưới có gì để duy trì khả năng đọc
Style được chỉnh để gần giống giao diện của tile raster gốc, nhưng bản vector có thêm nhiều tính năng tương tác hơn rất nhiều
Điều thú vị từ góc độ thiết kế style và tile là các đánh đổi về hiệu năng thay đổi hoàn toàn tùy theo tile được render ở đâu và như thế nào. Dĩ nhiên là vậy, nhưng điều đó cũng ảnh hưởng đến những gì có thể làm về mặt thị giác ở phía server và client
Dù vậy, bản đồ OSM dễ dùng hơn nhiều vì hiển thị nhiều điểm quan tâm. Chỉ cần nhìn bản đồ là đã có cảm giác về địa điểm thực tế; công viên trông ra công viên, bệnh viện trông ra bệnh viện
Google Maps có thể trông đẹp hơn dưới góc nhìn của nhà thiết kế đồ họa. Nhưng để định hướng, thường cần đối chiếu hình dạng đường và giao lộ. Trên Google Maps, chỗ nào cũng trông na ná nhau
Chỉ cần thao tác khoảng 2 phút là thấy ngay mất mát về chi tiết. Thật sự rất tiếc, nhưng tôi lạc quan rằng một ngày nào đó sẽ có người giải quyết được
Thật thú vị khi chứng kiến cộng đồng nguồn mở xây dựng chức năng tile bản đồ vector. Khoảng năm 2018, khi làm GIS trên web, bản đồ vector streaming của Google/Apple trông như phép màu, và nếu chi phí chấp nhận được thì tôi chắc chắn đã muốn dùng
Không lâu sau đó, công nghệ cốt lõi đã được đưa ra nguồn mở, thậm chí còn có cả giải pháp hosting miễn phí. Giờ đây có thể dùng các layer vector tuyệt vời miễn phí trong bản đồ Leaflet. Cảm ơn nguồn mở
Tôi không có ý phàn nàn về một dịch vụ bản đồ miễn phí; dịch vụ này rất tuyệt, và tôi cũng hiểu họ tập trung hơn vào việc biên tập và quyền sở hữu dữ liệu. Hạ tầng cung cấp dịch vụ thì khó và tốn kém
Chỉ là tôi tò mò sự thống trị của MapBox trong nhiều năm đã cản trở các nỗ lực khác đến mức nào
Tôi thắc mắc liệu chi phí vận hành có giảm khi host bản đồ dựa trên OSM hay không. Vì có vẻ sẽ cần ít CPU hơn cho việc render, và vector cũng sẽ tốn ít dung lượng lưu trữ lẫn băng thông hơn
Không đúng là vì lớp tile OSM chính thức đang nhận tài trợ rất lớn từ Fastly. Lần cuối tôi kiểm tra thì Fastly là €720k, còn render trên AWS là €40k
Đúng là vì về mặt kỹ thuật nó dùng ít tài nguyên hơn, nên cũng giảm gánh nặng cho AWS+Fastly, và việc tự host cũng dễ hơn
Trong một bản đánh giá rủi ro tôi từng đọc kỹ trước đây, OSM có viết rằng “nếu mất tài trợ của Fastly, rất có khả năng họ sẽ cắt toàn bộ truy cập của bên thứ ba vào lớp tile tiêu chuẩn và chỉ vận hành một số ít máy chủ Varnish”
Theo tôi hiểu, động lực chính của vector không hẳn là giảm chi phí, mà gần với việc cải thiện quốc tế hóa, cho phép quyết định render ở phía client, và xây dựng một hệ công cụ hiện đại đem lại nhiều lợi ích tiếp theo
Chắc sẽ có thông tin mới hơn, còn tài liệu liên quan nằm ở 1 và 2
Tuy nhiên, đúng ở chỗ nó có thể đẩy một phần xử lý sang client, và quan trọng hơn là để client quyết định nhiều thứ về style. Tất nhiên không phải mọi thứ đều làm được
Vector tile tĩnh hoặc không cập nhật thường xuyên có thể được tạo từ dữ liệu OSM bằng nhiều công cụ; hiện phổ biến nhất là https://github.com/systemed/tilemaker và https://github.com/onthegomap/planetiler
Điểm thực sự mới là nhờ công việc Paul làm cho OSMF, vector tile có thể được cập nhật tức thì, tức trong vòng vài phút. Điều này quan trọng như một cơ chế phản hồi cho người đóng góp OSM, và cũng là lý do chính OSMF hiện vận hành dịch vụ raster tile
Hiện vẫn chưa rõ sẽ đặt những hạn chế nào cho việc dùng dịch vụ vector tile. Cũng như dịch vụ raster tile, mục đích không phải là cạnh tranh hoặc thay thế các dịch vụ bên thứ ba, nhưng dịch vụ vector tile có tiềm năng làm điều đó
Ví dụ có https://protomaps.com/, https://openmaptiles.org/, https://versatiles.org/
Nén gzip cũng đã được thực hiện sẵn bên trong tile
Một vấn đề khác là trong phiên bản vector, phông chữ Ả Rập không được render đúng. Nó được render từ trái sang phải thay vì từ phải sang trái, và các chữ cái trông bị tách rời chứ không nối với nhau
Vì vậy lỗi hiển thị đó là vấn đề ở style hoặc ở thư viện render nội dung cục bộ
Có thể xem thêm: OpenFreeMap — host vector tile OpenStreetMap miễn phí
https://openfreemap.org/
https://github.com/hyperknot/openfreemap?tab=readme-ov-file#...
Tôi tò mò không biết nó cũng dựa trên cùng stack công nghệ vector này, hay là một hướng phát triển hoàn toàn riêng
Phần “hình ảnh sẽ sắc nét hơn nhiều và cũng có thể chuyển đổi ngôn ngữ nhãn” có vẻ sẽ không tốt như kỳ vọng
Khi đổi ngôn ngữ, hoàn toàn không có gì bảo đảm kích thước nhãn sẽ được giữ nguyên, mà kích thước nhãn lại tương tác với bố cục bản đồ và quyết định cả việc hiển thị những gì
Nếu nhãn lớn hơn, chúng có thể che quá nhiều bản đồ hoặc chồng lên nhau. Nếu nhãn nhỏ hơn, người dùng có thể thắc mắc vì sao những thành phố trước đây bị lược bỏ do hạn chế không gian lại không xuất hiện trong khoảng trống mới tạo ra
Cứ hiển thị tất cả tên đường là được. Dày đặc cũng không sao. Đứng ở ngã tư mà nhìn vào bản đồ không có tên thì đó là bản đồ vô dụng
Với raster tile đã được dùng nhiều năm cũng vậy
Đây là một thay đổi mới rất đáng mừng. Tôi mong đợi những bản đồ đẹp hơn
Tuy nhiên phần “my workstation” hơi khó hiểu. Nó có vẻ không liên quan lắm đến phần còn lại của bài viết, và những công việc được đề cập sau đó cũng không có vẻ cần yêu cầu hệ thống cao
“Hình ảnh sẽ sắc nét hơn nhiều và cũng có thể chuyển đổi ngôn ngữ nhãn”, vậy chẳng hạn có phải sẽ phải mang theo metadata tên thành phố bằng mọi ngôn ngữ được định nghĩa cho vector hình dạng thành phố, chính xác hơn là đa giác, không?
Tính hữu dụng của chức năng chuyển đổi ngôn ngữ tất nhiên phụ thuộc vào việc có bản dịch hay không. Nó cũng có thể khuyến khích các biên tập viên bổ sung thêm bản dịch địa danh
Có thể xem ví dụ về dạng này tại https://americanamap.org. Nó dùng dữ liệu OSM, nhưng không nhắm đến gần thời gian thực như các tile trong bài này
Mong là điều này có nghĩa OSMAnd và OrganicMaps cuối cùng sẽ hợp lực để đưa ra ứng dụng bản đồ tự do nguồn mở tối thượng
Vector tile định dạng MVT hoàn toàn không phù hợp cho điều hướng hay tìm kiếm. Không có nghĩa là không thể gượng ép ghép lại để làm, nhưng sẽ khá khiên cưỡng
Ví dụ OSMAnd có nhiều tính năng power user rất hữu ích cho những người đóng góp cho OSM, nhưng trong một ứng dụng dành cho người dùng phổ thông thì chúng có thể chỉ làm rối giao diện
https://marble.kde.org/ đã tự triển khai lớp OSM vector streaming từ 9 năm trước, và tôi đã chờ khá lâu để thấy thứ tương tự xuất hiện trong các ứng dụng bản đồ OSM khác
Trên các ứng dụng OSM Android, việc tải xuống bản đồ hàng trăm megabyte theo từng khối lớn cấp cả quốc gia luôn là vấn đề về dung lượng lưu trữ. Rất vui vì cuối cùng tiêu chuẩn cũng đang hình thành, và mong nó được nhiều ứng dụng chấp nhận và hoàn thiện. Công việc tuyệt vời