<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hidenori FUJIMURA</title>
    <description>The latest articles on DEV Community by Hidenori FUJIMURA (@hfu).</description>
    <link>https://dev.to/hfu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F320060%2F774c1741-1e46-467d-8d3d-2e39762390e3.png</url>
      <title>DEV Community: Hidenori FUJIMURA</title>
      <link>https://dev.to/hfu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hfu"/>
    <language>en</language>
    <item>
      <title>UN Smart Maps Group ポータブルウェブの進捗まとめ 2025-09</title>
      <dc:creator>Hidenori FUJIMURA</dc:creator>
      <pubDate>Mon, 08 Sep 2025 22:47:40 +0000</pubDate>
      <link>https://dev.to/hfu/un-smart-maps-group-potaburuuebunojin-bu-matome-2025-09-50ac</link>
      <guid>https://dev.to/hfu/un-smart-maps-group-potaburuuebunojin-bu-matome-2025-09-50ac</guid>
      <description>&lt;h2&gt;
  
  
  1. はじめに
&lt;/h2&gt;

&lt;p&gt;UN Smart Maps Groupでは、大規模な地理空間データ、特に点群データを含む数百GB規模のクラウドネイティブデータの効率的な配信方法について研究を進めてきました。特にPMTiles形式のデータをホスティングするための最適な方法を模索し、様々な技術的アプローチを検証してきました。&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 研究の背景と目的
&lt;/h3&gt;

&lt;p&gt;ファイルシステム上のファイルをウェブサーバで提供する方式のシンプルな静的ホスティングでは、ファイルサイズ大きい場合のストレージ容量の拡張が困難であり、ウェブサーバの設定によってはセキュリティリスクが高くなる可能性があり、また大規模データセットの配信に最適化するための技術についての敷居が高いという問題がありました。これらの課題を解決するため、我々はオブジェクトストレージ、分散ストレージ、そして改めてCDNなどの技術を検証することにより、個人や小規模グループでも大規模な地理空間データを効率的に配信できる方法を開発することを目指しました。技術検証の過程では、実用性と持続可能性を重視し、複数のアプローチを段階的に評価してきました。&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2 ポータブルウェブのコンセプト
&lt;/h3&gt;

&lt;p&gt;ポータブルウェブとは、「誰もが大規模なデータをウェブ上で簡単に共有できる」という理念に基づいた概念です。従来のウェブインフラストラクチャは大規模組織向けに設計されており、個人や小規模グループが数百GBに及ぶデータセットを効率的に配信することは技術的・経済的障壁がありました。&lt;/p&gt;

&lt;p&gt;ポータブルウェブのコンセプトでは、以下の要素を重視しています：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;低コストでの実現可能性&lt;/strong&gt;: 個人や小規模組織でも維持可能な経済性&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;技術的アクセシビリティ&lt;/strong&gt;: 専門的なITインフラの知識がなくても導入・運用可能&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;高い安定性&lt;/strong&gt;: メンテナンスの手間を最小化し、長期運用を可能に&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;スケーラビリティ&lt;/strong&gt;: 数百GBから数TBに及ぶデータセットにも対応可能&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ウェブ標準準拠&lt;/strong&gt;: ウェブ標準を最大限活用することによる相互運用性の確保&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;このコンセプトは特に地理空間データのような大規模かつ構造化されたデータセットの共有に有効であり、信頼できる地理空間情報の自由な流通に大きく貢献するものです。&lt;/p&gt;

&lt;h2&gt;
  
  
  2. 検証した技術とその結果
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Minio によるオブジェクトストレージの検証
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;結果と知見&lt;/strong&gt;:&lt;br&gt;
最初に検証したMinioは、S3互換のAPIを提供するため初期導入が比較的容易でした。しかし、Raspberry Pi 4B を複数台用いたクラスターの実運用テストを進めた結果、特に巨大ファイルの投入時などに高負荷となり、パフォーマンスが不安定になることが明らかになりました。また、オブジェクトストレージという特性上、ファイルシステムに直置きする場合と比べ、予想以上にCPUリソースとIO帯域を消費することがわかりました。これらの問題から、計算機資源が限られている場合のスケーラビリティに課題が残り、個人や小規模グループによる運用には適さないと判断せざるを得ませんでした。&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 IPFS Kubo による分散ストレージの検証
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;結果と知見&lt;/strong&gt;:&lt;br&gt;
次に検証したIPFS Kuboは、P2P分散ストレージという概念自体は非常に魅力的でしたが、実運用を想定した検証ではいくつかの課題が明らかになりました。ホスティングパフォーマンスが安定しないこと、効果的な分散ネットワークの構築が現実的には困難であること、そして大規模データセットのピンニングに関する問題が明確になりました。これらの結果から、IPFS Kuboは現時点では地理空間大規模データの配信に最適なソリューションとは言えないという結論に達しました。&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 x-24b プロトタイプの開発と検証
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;使用技術&lt;/strong&gt;:&lt;br&gt;
x-24bプロトタイプでは、より現実的な選択として、Cloudflared (Cloudflare Tunnel)、Martin (PMTiles配信用サーバー)、そしてCaddy (高性能Webサーバー)を組み合わせたアーキテクチャを採用しました。これらの技術を、USB 接続した SSD を持つ Raspberry Pi 4B に実装した x-24b インスタンスが tunnel.optgeo.org です。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;結果と知見&lt;/strong&gt;:&lt;br&gt;
x-24bプロトタイプでは、商用サービス(Cloudflare)への依存があるものの、高いパフォーマンスを安定的に実現することができました。約1ヶ月の自宅環境での運用テストを通じて、システムが高い安定性を持ち、メンテナンス負荷が少ない形での運用が可能であることを確認しました。CloudflareのCDNを活用することで、高速配信も実現できたのだと思います。これらの検証結果から、x-24bプロトタイプが現時点では最も効果的なソリューションであると考えています。&lt;/p&gt;

&lt;h2&gt;
  
  
  3. x-24b プロトタイプの詳細
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 アーキテクチャ概要
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[PMTilesデータ] → [Martin] → [Caddy] → [Cloudflared] → [Cloudflare CDN] → [エンドユーザー]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2 コンポーネントの役割
&lt;/h3&gt;

&lt;p&gt;x-24bプロトタイプを構成する各コンポーネントは、それぞれ重要な役割を担っています。Martinは、PMTiles形式に対応したタイルサーバーとして、データの効率的な配信を担当します。Caddyはリバースプロキシとして機能し、多少のキャッシュ、Martin を介さないスタティックファイルホスティングなどを提供します。Cloudflaredは、ローカル環境とCloudflare間のセキュアなトンネルを確立する役割を果たし、Cloudflare CDNがグローバルでの高速配信と追加のセキュリティ機能を提供します。&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 x-24bの主な利点
&lt;/h3&gt;

&lt;p&gt;x-24bプロトタイプの最大の強みは、CDNによる世界中での高速アクセスの実現にあります。また、Cloudflareが提供する様々なセキュリティ機能を活用することで、データの安全性も確保されています。1ヶ月以上の連続運用でも問題なく動作するという安定性に加え、個人レベルでも維持可能な運用コストという経済性も大きな利点です。具体的には、Cloudflare Tunnel が無償提供してくれる範囲内で、UN Smart Maps Group における技術検証作業には十分な転送量を提供してくれています。さらに、数百GBの大規模データセットにも対応できる拡張性を持ち合わせており、様々な規模のプロジェクトに適用可能です。&lt;/p&gt;

&lt;h2&gt;
  
  
  4. 使用技術の詳細
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 Minio
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;概要&lt;/strong&gt;: Minioは、Amazon S3互換のAPIを提供するオープンソースのオブジェクトストレージサーバーです。高性能で軽量に設計されており、クラウドネイティブアプリケーションやDevOpsのユースケースに適しています。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ライセンス&lt;/strong&gt;: GNU Affero General Public License v3.0 (AGPLv3)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;公式ウェブサイト&lt;/strong&gt;: &lt;a href="https://min.io/" rel="noopener noreferrer"&gt;https://min.io/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 IPFS Kubo
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;概要&lt;/strong&gt;: Kuboは、InterPlanetary File System (IPFS)の主要な実装です。IPFSは、コンテンツアドレス可能な分散型ファイルシステムで、データを永続的に保存し、重複を排除し、効率的に配信することを目的としています。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ライセンス&lt;/strong&gt;: デュアルライセンス (MIT License および Apache License 2.0)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;公式ウェブサイト&lt;/strong&gt;: &lt;a href="https://docs.ipfs.tech/install/command-line/" rel="noopener noreferrer"&gt;https://docs.ipfs.tech/install/command-line/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.3 Martin
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;概要&lt;/strong&gt;: Martinは、PMTilesフォーマット向けに最適化されたタイルサーバーです。地理空間データ、特にベクトルタイルやラスタータイルの効率的な配信に特化しており、PMTilesファイルから直接タイルを提供します。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ライセンス&lt;/strong&gt;: BSD 3-Clause License&lt;br&gt;&lt;br&gt;
&lt;strong&gt;公式ウェブサイト&lt;/strong&gt;: &lt;a href="https://github.com/maplibre/martin" rel="noopener noreferrer"&gt;https://github.com/maplibre/martin&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.4 Caddy
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;概要&lt;/strong&gt;: Caddyは、現代的で使いやすいウェブサーバーで、自動HTTPSや多様な機能を持ちながらも設定が簡単なことが特徴です。リバースプロキシ、ロードバランシング、静的ファイル配信などの機能を提供します。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ライセンス&lt;/strong&gt;: Apache License 2.0&lt;br&gt;&lt;br&gt;
&lt;strong&gt;公式ウェブサイト&lt;/strong&gt;: &lt;a href="https://caddyserver.com/" rel="noopener noreferrer"&gt;https://caddyserver.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.5 cloudflared
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;概要&lt;/strong&gt;: cloudflaredは、Cloudflare Tunnelのクライアントソフトウェアです。インターネット上に公開されたIPアドレスを持たないローカルのウェブサーバーやサービスを、安全にインターネットに公開するためのツールです。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ライセンス&lt;/strong&gt;: Apache License 2.0&lt;br&gt;&lt;br&gt;
&lt;strong&gt;公式ウェブサイト&lt;/strong&gt;: &lt;a href="https://github.com/cloudflare/cloudflared" rel="noopener noreferrer"&gt;https://github.com/cloudflare/cloudflared&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. 今後の展望とFOIL4G構想
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 x-24bの意義
&lt;/h3&gt;

&lt;p&gt;x-24bプロトタイプの成功により、個人や小規模グループでも大規模地理空間データを効率的に配信できる可能性が示されました。これはスマート地図の世界に新たな可能性をもたらし、信頼できる地理空間情報の自由な流通の重要な一歩となります。従来は大規模な組織や継続的な予算を確保されたプロジェクトでしか実現できなかったことが、より小規模な主体でも可能になるという点で、信頼できる地理空間情報の自由な流通に大きく貢献するものと考えています。&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 FOIL4G（Free and Open Information Library for Geospatial）構想
&lt;/h3&gt;

&lt;p&gt;x-24bの成功を足がかりに、私たちはFOIL4G構想をさらに推進していきます。この構想では、地理空間データの自由な共有と活用を促進するオープンデータの理念を中心に据えています。複数の個人・組織によるデータホスティングの連携による分散型ホスティングネットワークの構築や、PMTilesなど標準化されたデータフォーマットの採用を進めていきます。そして何より、地理空間情報に関心を持つ幅広いコミュニティの参加によるコミュニティドリブンな発展を目指しています。&lt;/p&gt;

&lt;h2&gt;
  
  
  6. まとめ
&lt;/h2&gt;

&lt;p&gt;UN Smart Maps Group は、大規模地理空間情報の効率的な配信という課題に対し、複数の技術検証を経て、x-24bプロトタイプという実用的なソリューションを開発しました。これにより、個人や小規模グループでも数百GB規模の地理空間データを安定的かつ高速に配信することが可能になりました。&lt;/p&gt;

&lt;p&gt;この成果は、FOIL4G構想の実現に向けた重要な一歩であり、地理空間情報のより広範な共有と活用を促進することで、スマート地図の世界を次の段階へと進める足がかりとなります。今後も継続的な改善と拡張を行いながら、信頼できる地理空間情報の自由な流通に貢献していきたいと考えています。&lt;/p&gt;

</description>
      <category>geospatial</category>
      <category>unopengis</category>
      <category>smartmaps</category>
    </item>
    <item>
      <title>Martin で遠隔の PMTiles をホストする</title>
      <dc:creator>Hidenori FUJIMURA</dc:creator>
      <pubDate>Sun, 31 Aug 2025 12:50:04 +0000</pubDate>
      <link>https://dev.to/hfu/martin-deyuan-ge-no-pmtiles-wohosutosuru-3lg5</link>
      <guid>https://dev.to/hfu/martin-deyuan-ge-no-pmtiles-wohosutosuru-3lg5</guid>
      <description>&lt;h2&gt;
  
  
  背景
&lt;/h2&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/smellman"&gt;@smellman&lt;/a&gt; が &lt;a href="https://dev.smellman.org/static/overture-2025-08-20" rel="noopener noreferrer"&gt;https://dev.smellman.org/static/overture-2025-08-20&lt;/a&gt; で Overture Maps ベースの 6 つの PMTiles ファイルをホストしています。&lt;/p&gt;

&lt;h2&gt;
  
  
  行なったこと
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/unvt/x-24b" rel="noopener noreferrer"&gt;x-24b&lt;/a&gt; で上記を遠隔の PMTiles ファイルとしてホストしてみました。tile.json アクセスポイントは次の通りとなります。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://tunnel.optgeo.org/martin/addresses" rel="noopener noreferrer"&gt;https://tunnel.optgeo.org/martin/addresses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tunnel.optgeo.org/martin/base" rel="noopener noreferrer"&gt;https://tunnel.optgeo.org/martin/base&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tunnel.optgeo.org/martin/buildings" rel="noopener noreferrer"&gt;https://tunnel.optgeo.org/martin/buildings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tunnel.optgeo.org/martin/divisions" rel="noopener noreferrer"&gt;https://tunnel.optgeo.org/martin/divisions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tunnel.optgeo.org/martin/places" rel="noopener noreferrer"&gt;https://tunnel.optgeo.org/martin/places&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tunnel.optgeo.org/martin/transportation" rel="noopener noreferrer"&gt;https://tunnel.optgeo.org/martin/transportation&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  今後行いたいこと
&lt;/h2&gt;

&lt;p&gt;上記のアクセスポイントをうまく使ってウェブ地図を作るのを Copilot にでもやらせてみたいと思っています。&lt;/p&gt;

</description>
      <category>geospatial</category>
      <category>unopengis</category>
      <category>smartmaps</category>
      <category>martin</category>
    </item>
    <item>
      <title>Create an AP with Network Manager</title>
      <dc:creator>Hidenori FUJIMURA</dc:creator>
      <pubDate>Sat, 12 Oct 2024 05:10:26 +0000</pubDate>
      <link>https://dev.to/hfu/create-an-ap-with-network-manager-11dm</link>
      <guid>https://dev.to/hfu/create-an-ap-with-network-manager-11dm</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nmcli dev wifi hotspot ifname [wlan0] ssid [smartmapsportable] band bg password [smartmapsportable]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>raspberrypi</category>
      <category>smartmaps</category>
    </item>
    <item>
      <title>style.json from Apple Pkl #3</title>
      <dc:creator>Hidenori FUJIMURA</dc:creator>
      <pubDate>Sat, 02 Mar 2024 01:49:40 +0000</pubDate>
      <link>https://dev.to/hfu/stylejson-from-apple-pkl-3-456p</link>
      <guid>https://dev.to/hfu/stylejson-from-apple-pkl-3-456p</guid>
      <description>&lt;p&gt;Now we have the first running demo at &lt;a href="https://observablehq.com/d/3df96ac1c9d36daa" rel="noopener noreferrer"&gt;https://observablehq.com/d/3df96ac1c9d36daa&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;We also have a GitHub repository: &lt;a href="https://github.com/hfu/pkl-test" rel="noopener noreferrer"&gt;https://github.com/hfu/pkl-test&lt;/a&gt;&lt;/p&gt;

</description>
      <category>json</category>
      <category>maplibre</category>
      <category>pkl</category>
    </item>
    <item>
      <title>style.json from Apple Pkl #2</title>
      <dc:creator>Hidenori FUJIMURA</dc:creator>
      <pubDate>Wed, 28 Feb 2024 12:20:09 +0000</pubDate>
      <link>https://dev.to/hfu/stylejson-from-apple-pkl-2-20mf</link>
      <guid>https://dev.to/hfu/stylejson-from-apple-pkl-2-20mf</guid>
      <description>&lt;p&gt;Started to generate style.json...&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;1.pkl&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// my first attempt to generate style.json from a pkl file.

version = 8
center { -122.42 37.80 }
zoom = 10.42
sources = import("sources.pkl")
sprite = "https://tile.openstreetmap.jp/styles/maptiler-toner-en/sprite"
glyphs = "https://tile.openstreetmap.jp/fonts/{fontstack}/{range}.pbf"
layers = new Listing {
    import("background.pkl")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;code&gt;sources.pkl&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module sources

openmaptiles {
    type = "vector"
    url = "https://tile.openstreetmap.jp/data/planet.json"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;code&gt;background.pkl&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module background

id = "background"
paint { background_color = "#fff" }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;code&gt;Makefile&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use_color: 
    pkl eval -f json use_color.pkl
1: 
    pkl eval -f json 1.pkl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;% make 1
pkl eval -f json 1.pkl
{
  "version": 8,
  "center": [
    -122.42,
    37.8
  ],
  "zoom": 10.42,
  "sources": {
    "openmaptiles": {
      "type": "vector",
      "url": "https://tile.openstreetmap.jp/data/planet.json"
    }
  },
  "sprite": "https://tile.openstreetmap.jp/styles/maptiler-toner-en/sprite",
  "glyphs": "https://tile.openstreetmap.jp/fonts/{fontstack}/{range}.pbf",
  "layers": [
    {
      "id": "background",
      "paint": {
        "background_color": "#fff"
      }
    },
    {
      "id": "cde"
    }
  ]
}
hfu@smart pkl-test % make 1
pkl eval -f json 1.pkl
{
hfu@smart pkl-test % make 1
pkl eval -f json 1.pkl
{
  "version": 8,
  "center": [
    -122.42,
    37.8
  ],
  "zoom": 10.42,
  "sources": {
    "openmaptiles": {
      "type": "vector",
      "url": "https://tile.openstreetmap.jp/data/planet.json"
    }
  },
  "sprite": "https://tile.openstreetmap.jp/styles/maptiler-toner-en/sprite",
  "glyphs": "https://tile.openstreetmap.jp/fonts/{fontstack}/{range}.pbf",
  "layers": [
    {
      "id": "background",
      "paint": {
        "background_color": "#fff"
      }
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Repository
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/hfu/pkl-test" rel="noopener noreferrer"&gt;https://github.com/hfu/pkl-test&lt;/a&gt;&lt;/p&gt;

</description>
      <category>pkl</category>
      <category>json</category>
      <category>maplibre</category>
    </item>
    <item>
      <title>style.json from Apple Pkl #1</title>
      <dc:creator>Hidenori FUJIMURA</dc:creator>
      <pubDate>Tue, 27 Feb 2024 11:09:49 +0000</pubDate>
      <link>https://dev.to/hfu/stylejson-from-apple-pkl-1-4j5j</link>
      <guid>https://dev.to/hfu/stylejson-from-apple-pkl-1-4j5j</guid>
      <description>&lt;p&gt;I am trying to generate style.json for MapLibre GL JS or Mapbox GL JS. This is the first attempt. &lt;/p&gt;

&lt;h1&gt;
  
  
  Check how module works
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;colors.pkl&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module colors

red { "rgb" 255 0 0 }
green { "rgb" 0 255 0 }
blue { "rgb" 0 0 255 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;code&gt;use_color.pkl&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import "colors.pkl"

the_color = colors.blue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;code&gt;Makefile&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use_color: 
    pkl eval -f json use_color.pkl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Result
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "the_color": [
    "rgb",
    0,
    0,
    255
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ok.&lt;/p&gt;

&lt;h3&gt;
  
  
  See also
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/UNopenGIS/7/issues/404" rel="noopener noreferrer"&gt;https://github.com/UNopenGIS/7/issues/404&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hfu/pkl-test" rel="noopener noreferrer"&gt;https://github.com/hfu/pkl-test&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>pkl</category>
      <category>maplibre</category>
      <category>json</category>
    </item>
    <item>
      <title>How to use MapLibre GL JS with 3D Tiles (pnts)</title>
      <dc:creator>Hidenori FUJIMURA</dc:creator>
      <pubDate>Mon, 17 Apr 2023 21:02:57 +0000</pubDate>
      <link>https://dev.to/hfu/how-to-use-maplibre-gl-js-with-3d-tiles-pnts-g4h</link>
      <guid>https://dev.to/hfu/how-to-use-maplibre-gl-js-with-3d-tiles-pnts-g4h</guid>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://optgeo.github.io/free-nagasaki-maplibre/?tileset=https://smb.optgeo.org/ipfs/QmVqPr8p3TjgcQxVbqEuJ9kCvcMvZR3T91zyyu11VFp44G/tileset.json#17.52/32.733403/129.865636/43.6/60" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/optgeo/free-nagasaki-maplibre/blob/main/docs/index.html" rel="noopener noreferrer"&gt;Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is the code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/maplibre-gl@2.4.0/dist/maplibre-gl.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/deck.gl@latest/dist.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/@loaders.gl/3d-tiles@^2.3.0/dist/dist.min.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/maplibre-gl@2.4.0/dist/maplibre-gl.css"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/link&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
&lt;span class="nf"&gt;#cesiumContainer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
  &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"map"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;maplibregl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://optgeo.github.io/optbv-intl/optbv-intl-dev.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;attributionControl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;searchParams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tileset&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://d21pj9gigeop84.cloudfront.net/data/point-cloud/lp-2022/22302_kawazu-cho/tileset.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;load&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MapboxLayer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Tile3DLayer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;deck&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;layer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MapboxLayer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Tile3DLayer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;pointSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Tiles3DLoader&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addLayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;layer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>javascript</category>
      <category>smartmaps</category>
      <category>maplibre</category>
    </item>
    <item>
      <title>How to consume 3D Tiles (pnts) with Cesium</title>
      <dc:creator>Hidenori FUJIMURA</dc:creator>
      <pubDate>Sun, 16 Apr 2023 11:51:14 +0000</pubDate>
      <link>https://dev.to/hfu/how-to-consume-3d-tiles-pnts-with-cesium-5hn1</link>
      <guid>https://dev.to/hfu/how-to-consume-3d-tiles-pnts-with-cesium-5hn1</guid>
      <description>&lt;p&gt;I am developing a &lt;a href="https://optgeo.github.io/free-nagasaki-3dtiles/?tileset=https%3A%2F%2Fsmb.optgeo.org/ipfs/QmWRhAc2UNNmWuFWZiXpFVJDrPE46P1nmj6ePrvqxmJTSU/tileset.json#32.755703/129.878710/184/249/-15" rel="noopener noreferrer"&gt;site&lt;/a&gt; to consume 3D Tiles of PNTS (Point Cloud Tiles) with Cesium. Here is the code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cesium.com/downloads/cesiumjs/releases/1.102/Build/Cesium/Cesium.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://frogcat.github.io/cesium-hash/cesium-hash.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://cesium.com/downloads/cesiumjs/releases/1.102/Build/Cesium/Widgets/widgets.css"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/link&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
&lt;span class="nf"&gt;#cesiumContainer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
  &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"cesiumContainer"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;span class="nx"&gt;Cesium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Ion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaultAccessToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5N2UyMjcwOS00MDY1LTQxYjEtYjZjMy00YTU0ZTg5MmViYWQiLCJpZCI6ODAzMDYsImlhdCI6MTY0Mjc0ODI2MX0.dkwAL1CcljUV7NA7fDbhXXnmyZQU_c-G5zRx8PtEcxE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;viewer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Cesium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Viewer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cesiumContainer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;homeButton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;navigationHelpButton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;sceneModePicker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;timeline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nx"&gt;viewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;imageryLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addImageryProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageProvider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;viewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Cesium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;JulianDate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromIso8601&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2023-03-21T12:00&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;viewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;depthTestAgainstTerrain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;searchParams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tileset&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://d21pj9gigeop84.cloudfront.net/data/point-cloud/lp-2022/22302_kawazu-cho/tileset.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tileset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Cesium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Cesium3DTileset&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="nx"&gt;tileset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maximumScreenSpaceError&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;
&lt;span class="nx"&gt;tileset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Cesium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Cesium3DTileStyle&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;pointSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;tileset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pointCloudShading&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;attenuation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="nx"&gt;tileset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pointCloudShading&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geometricErrorScale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="nx"&gt;viewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;primitives&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tileset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;viewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;camera&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;moveEnd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Cesium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;viewer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;credit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Cesium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Credit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Virtual Shizuoka and/or 東京都デジタルツイン実現プロジェクト&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;viewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scene&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;frameState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;creditDisplay&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addDefaultCredit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;credit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Cesium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;tileset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readyPromise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;viewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zoomTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;tileset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Cesium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;HeadingPitchRange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="nx"&gt;tileset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;boundingSphere&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;radius&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Cesium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;viewer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Cesium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;viewer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  See Also
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/optgeo/free-nagasaki-3dtiles" rel="noopener noreferrer"&gt;optgeo/free-nagasaki-3dtiles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/frogcat/cesium-hash" rel="noopener noreferrer"&gt;frogcat/cesium-hash&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>smartmaps</category>
      <category>cesium</category>
      <category>javascript</category>
      <category>3dtiles</category>
    </item>
    <item>
      <title>Serve OS Open ZoomStack (2022-12) through PMTiles</title>
      <dc:creator>Hidenori FUJIMURA</dc:creator>
      <pubDate>Sun, 08 Jan 2023 10:51:13 +0000</pubDate>
      <link>https://dev.to/hfu/serve-os-open-zoomstack-2022-12-through-pmtiles-1di1</link>
      <guid>https://dev.to/hfu/serve-os-open-zoomstack-2022-12-through-pmtiles-1di1</guid>
      <description>&lt;h2&gt;
  
  
  Step 1: Download MBTiles
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -o zoomstack.mbtiles -L -C - "https://api.os.uk/downloads/v1/products/OpenZoomstack/downloads?area=GB&amp;amp;format=Vector+Tiles&amp;amp;subformat=%28MBTiles%29&amp;amp;redirect"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Convert MBTiles to PMTiles by go-pmtiles
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pmtiles convert zoomstack.mbtiles zoomstack.pmtiles 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;zoomstack.mbtiles&lt;/code&gt; was 2.6GB and &lt;code&gt;zoomstack.pmtiles&lt;/code&gt; was 2.4GB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Upload PMTiles file to a server.
&lt;/h2&gt;

&lt;p&gt;I have uploaded it to &lt;a href="https://x.optgeo.org/zoomstack.pmtiles" rel="noopener noreferrer"&gt;https://x.optgeo.org/zoomstack.pmtiles&lt;/a&gt;. You can specify this URL at &lt;a href="https://protomaps.github.io/PMTiles/" rel="noopener noreferrer"&gt;https://protomaps.github.io/PMTiles/&lt;/a&gt; to see the view like the following. (Hint: Great Britain is around 50N in latitude and 0E in longitude.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88rg1cg1bh5u88scissd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88rg1cg1bh5u88scissd.jpg" alt="OS ZoomStack in PMTiles" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Create a demo site.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://x.optgeo.org/zoomstack/" rel="noopener noreferrer"&gt;https://x.optgeo.org/zoomstack/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9mrswqwo7topyqfe2zj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr9mrswqwo7topyqfe2zj.jpg" alt="demo site" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Attribution
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Map: Contains OS data © Crown copyright and database right 2022&lt;/li&gt;
&lt;li&gt;Cover image: &lt;a href="https://www.metmuseum.org/art/collection/search/266439" rel="noopener noreferrer"&gt;https://www.metmuseum.org/art/collection/search/266439&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>gratitude</category>
    </item>
    <item>
      <title>postmaps.js: maxDataZoom</title>
      <dc:creator>Hidenori FUJIMURA</dc:creator>
      <pubDate>Sun, 12 Jun 2022 01:14:49 +0000</pubDate>
      <link>https://dev.to/hfu/postmapsjs-maxdatazoom-72m</link>
      <guid>https://dev.to/hfu/postmapsjs-maxdatazoom-72m</guid>
      <description>&lt;p&gt;postmaps.js でオーバーズームを正しく効かせるために、ベクトルタイル側の maxzoom を知らせるためには、maxDataZoom を設定すれば良いことがわかりました。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://x.optgeo.org/proton/#18/36.08469/140.19806" rel="noopener noreferrer"&gt;デモサイト&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  情報源
&lt;/h2&gt;

&lt;p&gt;ソースコードを GitHub で検索して見つけました。検索文字列は 14 です。protomaps のサービスが maxzoom を 14 にしていると知っていたからです。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;maxDataZoom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxDataZoom&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/protomaps/protomaps.js/blob/c30bec880a7228ae53de9f5c88f9c789579f7f71/src/view.ts#L228" rel="noopener noreferrer"&gt;https://github.com/protomaps/protomaps.js/blob/c30bec880a7228ae53de9f5c88f9c789579f7f71/src/view.ts#L228&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  動的なスタイル設定
&lt;/h2&gt;

&lt;p&gt;protomaps.js では、width や color に (z, f) を引数とする関数を渡せるので、それを使って色々ためしています。&lt;/p&gt;

&lt;h3&gt;
  
  
  道路の太さをランダムで設定
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;dataLayer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;road&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;symbolizer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;protomaps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LineSymbolizer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gray&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/optgeo/proton/blob/main/docs/index.html#L50-L58" rel="noopener noreferrer"&gt;https://github.com/optgeo/proton/blob/main/docs/index.html#L50-L58&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ポリゴンの塗色をランダムで設定
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;dataLayer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;building&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;symbolizer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;protomaps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PolygonSymbolizer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yellow&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/optgeo/proton/blob/main/docs/index.html#L59-L66" rel="noopener noreferrer"&gt;https://github.com/optgeo/proton/blob/main/docs/index.html#L59-L66&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  謝辞・出典
&lt;/h2&gt;

&lt;p&gt;protomaps.js をオープンソースで開発している皆様に敬意と共感を持っています。&lt;/p&gt;

&lt;p&gt;地理院地図 Vector タイルのドキュメントは &lt;a href="https://github.com/gsi-cyberjapan/gsimaps-vector-experiment" rel="noopener noreferrer"&gt;https://github.com/gsi-cyberjapan/gsimaps-vector-experiment&lt;/a&gt; にあります。&lt;/p&gt;

</description>
      <category>protomaps</category>
      <category>unvt</category>
    </item>
    <item>
      <title>UNVT活動</title>
      <dc:creator>Hidenori FUJIMURA</dc:creator>
      <pubDate>Fri, 17 Sep 2021 21:26:38 +0000</pubDate>
      <link>https://dev.to/hfu/unvt-4oa9</link>
      <guid>https://dev.to/hfu/unvt-4oa9</guid>
      <description>&lt;p&gt;自然発生的に「UNVT 活動」という用語が職場で生まれつつあります。日本の教育現場の伝統「部活動」に近いニュアンスを感じます。島崎藤村の詩に「天地はまさに奮闘と鋭意と活動との舞台なり」という表現があるそうです。私もアクティビストを名乗れる兆しかと面白く感じると共に「活動を展開する」という観点から UNVT を見直してみようと思います。あなたはどう考えますか。&lt;/p&gt;

</description>
      <category>unvt</category>
    </item>
    <item>
      <title>dev.to をどのように使えば良いか</title>
      <dc:creator>Hidenori FUJIMURA</dc:creator>
      <pubDate>Sun, 10 Jan 2021 23:01:13 +0000</pubDate>
      <link>https://dev.to/hfu/dev-to-3dhm</link>
      <guid>https://dev.to/hfu/dev-to-3dhm</guid>
      <description>&lt;p&gt;YouTube に上がっている &lt;a href="https://www.youtube.com/watch?v=ptJAlOSewW8" rel="noopener noreferrer"&gt;dev.to(gether) - The State of the Web&lt;/a&gt; を視聴すると、少しアイディアが広がるかもしれない。&lt;/p&gt;

&lt;p&gt;dev.to をどのように使えばよいか、という話と、私がそもそも何をしたいかという話を切り分けて考える必要がある。&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
