3 điểm bởi GN⁺ 2024-11-20 | 2 bình luận | Chia sẻ qua WhatsApp
  • 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 tiles2columns có 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_tile
    • morecantile
    • notebook
  • 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.maplibregl và chỉ định colorful.json là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ào morecantile 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.decode và 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
    • addresses
    • bridges
    • buildings
    • ferries
    • land
    • ocean
    • pier_lines
    • pier_polygons
    • place_labels
    • pois
    • public_transport
    • sites
    • street_labels
    • street_polygons
    • streets
    • streets_labels_points
    • water_polygons
    • water_polygons_labels

Xem xét lớp POI bằng DuckDB

  • Sau khi trích xuất lớp pois thành tệp JSON riêng, mở và phân tích bằng ST_READ của DuckDB
  • Các POI có giá trị cuisine được truy vấn ra 67 hàng
    • Ví dụ amenity gồm restaurant, fast_food, cafe
    • Ví dụ cuisine gồm french, greek, american, lebanese, coffee_shop, asian, persian, chicken, pizza
  • Kết quả SUMMARIZE củ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_en lần lượt là 29,96%
    • Tỷ lệ null của amenity31,86%
    • Tỷ lệ null của cuisine85,86%
    • Tỷ lệ null của geom0,00%
  • Theo approx_unique, name có 258 giá trị, name_de có 264, name_en có 245, amenity có 27 và cuisine có 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,8MB
    • buildings.gpkg: 6,2MB
    • pois.gpkg: 1,4MB
    • street_labels.gpkg: 1,4MB
    • land.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.gpkg trả 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

 
GN⁺ 2024-11-20
Ý 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

    • Về cơ bản là đúng, nhưng góc nhìn có thể hơi khác. Với bên cung cấp bản đồ, lợi ích chính của ô bản đồ vector không phải những điểm nhỏ như độ sắc nét hay tính linh hoạt của style, mà là lượng tính toán cần thiết giảm đi rất nhiều
      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
    • Cho đến nay có vẻ trọng tâm là phần mềm tạo tile vector được cập nhật liên tục, hơn là làm phong phú các style tận dụng những tile đó
    • Tôi đã tạo một fork của OpenrailwayMap. Bản gốc ở https://www.openrailwaymap.org, còn style vector ở https://openrailwaymap.fly.dev
      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
    • Hoàn toàn đồng ý. Khi tìm đường tôi dùng kết hợp OpenStreetMap và Google Maps, nhưng dù muốn chỉ dùng OSM, số địa điểm được đăng ký vẫn chưa nhiều bằng Google Maps
      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
    • Tôi nghĩ hoàn toàn giống vậy. Cá nhân tôi thấy style mặc định của openstreetmap.org gần như là niềm hạnh phúc thuần túy, và đã thử khá lâu để đưa bản đồ vector lên mức đó nhưng chưa tìm được kết quả dùng được
      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 hơi ngạc nhiên là OSM mất lâu như vậy mới đi đến đây. Các thành phần công nghệ cơ bản đã có từ hơn 10 năm trước
      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

    • Vừa đúng vừa không
      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
      1. https://operations.osmfoundation.org/2024/01/25/owg_budget.o...
      2. https://osmfoundation.org/wiki/Finances
    • Cũng có thể nói là không. Vì từ lâu vector tile đã có thể tự host hoặc thuê ai đó host với rất ít công sức
      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/tilemakerhttps://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 đó
    • Đúng vậy, vector tile dễ tự host hơn rất nhiều
      Ví dụ có https://protomaps.com/, https://openmaptiles.org/, https://versatiles.org/
    • Tôi là người tạo openfreemap.org. Đúng vậy. Vector tile về cơ bản là host file tĩnh, server không phải làm gì ngoài mã hóa HTTPS
      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

    • Điểm cốt lõi của vector tile là việc render diễn ra cục bộ, và ngoài schema của tile thì nó được điều khiển bằng thiết lập style có thể thay đổi
      Vì vậy lỗi hiển thị đó là vấn đề ở style hoặc ở thư viện render nội dung cục bộ
    • Tôi không biết trình render vector tile của QGIS hoạt động thế nào, nhưng nếu là trang demo GitHub thì có lẽ dễ thêm plugin văn bản RTL vào MapLibre để xử lý đúng văn bản viết từ phải sang trái: https://maplibre.org/maplibre-gl-js/docs/examples/mapbox-gl-...
  • Có thể xem thêm: OpenFreeMap — host vector tile OpenStreetMap miễn phí
    https://openfreemap.org/

    • OpenFreeMap không cung cấp: tìm kiếm hay geocoding, tính tuyến đường·điều hướng·chỉ đường, tạo ảnh tĩnh, host raster tile, host ảnh vệ tinh, tra cứu độ cao, host tile hoặc dataset tùy chỉnh
      https://github.com/hyperknot/openfreemap?tab=readme-ov-file#...
    • Wow, trông được hoàn thiện rất tốt
      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

    • Tôi thật sự ghét việc tên thành phố và tên đường biến mất khi phóng to·thu nhỏ trên Google Maps. Có những tên đường hoặc cửa hàng chỉ hiện ở một mức zoom nhất định, rồi khi phóng to hơn hoặc thu nhỏ hơn thì lại không thấy
      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
    • Dù sao điểm khởi đầu vẫn là tự động bố trí nhãn
      Với raster tile đã được dùng nhiều năm cũng vậy
    • Có lý do gì để kỳ vọng thuật toán bố trí sẽ thay đổi đáng kể không?
  • Đâ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?

    • Các thành phố lớn hiện đã bao gồm tên bằng nhiều ngôn ngữ. Ví dụ cứ xem Paris: https://www.openstreetmap.org/relation/71525
      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
    • shortbread, schema tile hiện đang dùng để thử nghiệm, chưa hỗ trợ nhiều ngôn ngữ, nhưng theo tôi biết thì sau khi dọn dẹp lỗi, những người đang làm sẽ muốn hỗ trợ tính năng này
      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
    • Không phải vậy, nhưng có thể lấy các tile chỉ chứa phần văn bản cần thiết rồi patch các tile đã có
  • 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

    • Hai ứng dụng này chủ yếu dùng dữ liệu bản đồ tải xuống/offline đã được tiền xử lý theo định dạng riê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
    • Không thể có một ứng dụng bản đồ tối thượng duy nhất, vì các use case khác nhau
      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
    • Ít nhất hy vọng hai bên có thể chia sẻ tile bản đồ, để không phải dùng trùng lặp hàng gigabyte dung lượng cho cùng một bả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

    • Tôi đã tìm ứng dụng Marble trên Android nhưng không thấy trên Play Store cũng như F-Droid. Link Play Store trên website thì 404. Họ bỏ rồi à?