Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Non-mercator Projection with Mapnik
Search
Tak Yanagida
November 01, 2014
Programming
1
1.2k
Non-mercator Projection with Mapnik
地図投影法の概要と、Mapnikによるベクタデータの非メルカトル図法でのレンダリング
FOSS4G Tokyo 2014で発表した資料です。
Tak Yanagida
November 01, 2014
Tweet
Share
More Decks by Tak Yanagida
See All by Tak Yanagida
How much we have to study English?
tyanagida
0
120
Functional Programming Applied in JS
tyanagida
0
95
Brief Introduction of jQuery Mobile
tyanagida
0
130
PowerShell for LL Users
tyanagida
0
1.2k
Other Decks in Programming
See All in Programming
Kotlin エンジニアへ送る:Swift 案件に参加させられる日に備えて~似てるけど色々違う Swift の仕様 / from Kotlin to Swift
lovee
1
260
既存デザインを変更せずにタップ領域を広げる方法
tahia910
1
270
Flutterで備える!Accessibility Nutrition Labels完全ガイド
yuukiw00w
0
140
XP, Testing and ninja testing
m_seki
3
220
PostgreSQLのRow Level SecurityをPHPのORMで扱う Eloquent vs Doctrine #phpcon #track2
77web
2
490
ruby.wasmで多人数リアルタイム通信ゲームを作ろう
lnit
3
370
Railsアプリケーションと パフォーマンスチューニング ー 秒間5万リクエストの モバイルオーダーシステムを支える事例 ー Rubyセミナー 大阪
falcon8823
5
1.1k
Result型で“失敗”を型にするPHPコードの書き方
kajitack
5
580
git worktree × Claude Code × MCP ~生成AI時代の並列開発フロー~
hisuzuya
1
520
WebViewの現在地 - SwiftUI時代のWebKit - / The Current State Of WebView
marcy731
0
110
“いい感じ“な定量評価を求めて - Four Keysとアウトカムの間の探求 -
nealle
1
4.2k
Systèmes distribués, pour le meilleur et pour le pire - BreizhCamp 2025 - Conférence
slecache
0
120
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
6.5k
Reflections from 52 weeks, 52 projects
jeffersonlam
351
20k
How to Think Like a Performance Engineer
csswizardry
24
1.7k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
GitHub's CSS Performance
jonrohan
1031
460k
Code Review Best Practice
trishagee
69
18k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
940
The Invisible Side of Design
smashingmag
300
51k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
4 Signs Your Business is Dying
shpigford
184
22k
Transcript
Non-mercator projection with Mapnik (株) オンターゲット 柳田 岳洋 @tyanagida FOSS4Gで2地点比較地図を作る方法
地図投影法の概要と、 Mapnikによるベクタデータの 非メルカトル図法でのレンダリング
自己紹介 • お好みダムサーチ公開中 (Japanese Dam Finder) http://maps.ontarget.cc/dams/ • 本業はWebアプリ開発と、 新規Webサービスのコンサルティング
きっかけ / Motivation • Twitterでこの画像が話題になっていた • 投影法、なに使ってるの? • 切り張りして重ねていいの? *当画像の原典は検索したが確認でき
ず。数多く転載されている中から、 http://ameblo.jp/colonic4/entry- 11596544945.html より引用。 まずは投影法のお勉強
投影法: 形による分類 (Map Projection Basics) 円筒図法 円錐図法 方位図法
投影法: 性質による分類 • 投影法について詳しくは、 「地図投影法」(政春尋志, 朝倉書店, 2011)参照 http://amzn.to/1zPWM6I 名前 性質
正積 面積が正しい 正角 角度が正しい 正距 距離が正しい 任意の場所で 微小範囲で 特定条件で (例: 中心から任意の点) 風向は正しく描ける。 長距離の方位は正しくない。 “ただし”
投影法の検討 • 2地点を同条件で描画したい • 距離と面積の両方を比較したい • 2地点をそれぞれ、同一条 件の方位図法で投影 • 正距と正積の2種類を作成
(Decided to go with Azimuthal projection, Both equal-area and equidistant)
元データ選定 (Choosing Source Data) • ベクターデータが必要 • できれば世界をカバーしているもの • (とりあえず)データ量が手軽なもの
• Natural Earthを使用 http://www.naturalearthdata.com Public Domain 複数のシェープファイル 全データでもzipすれば300MB弱 *上記でうまくダウンロードできない場合は、GitHubからもダウンロード可能 https://github.com/nvkelso/natural-earth-vector
投影ツールの選定 • スクリプト言語(Python他)で操作できる • 対応している投影法が多い 等距離円など、計算した データを重ねたいから 色々な投影法で見比べ てみたかったから •
Mapnikを採用 OSMのレンダリングや、TileMillのバックエンドで使われ ていて実績十分 Pythonから呼び出すAPIあり 投影変換には定番のPROJ.4ライブラリを使用 • 他には、MapServer(shp2img)、GMT、d3.geo なども検討
Mapnikの使い方 • Ubuntu用に、Mapnik公式バイナリあり • 自分は仮想マシン内で使用 いわゆるDOS/Vマシン Windows7 VirtualBox Ubuntu12.04 •
Python用公式Introductionをたどると、 Natural Earthを無投影した画像ができる Python初心者でもOK 簡単!
ここから意外と難しい • OSMで使われている割に、情報が少ない • ドキュメントやAPIがイマイチ整理されてない 英語はもちろん、ときにはソースのC++も読む • zoom()とpan()があるけど、zoom_to_box()してからでないと 動作保証されない •
CSVはファイルからも配列からも読み込めるが、GeoJSONは ファイルからしか読み込めない (WKTを使って解決) • 正しいGeoJSONでもエラーになることがある (属性の順序に隠れた制約あり) 自分がハマった例 自助努力重要! GitHubのIssueやWikiに 少し投稿しました
Mapnikの重要な概念 • 3種類の座標がある 経緯度 投影面座標 画面座標 zoom_to_box() zoom() pan() たいてい巨大
(1000万とか) PROJ.4を使っている ツールは、たぶん同じ forward() inverse() 描画範囲 (envelope) 関数名 ちょっとハマった
投影法の指定方法 • PROJ.4は投影変換のデファクト。QGIS他、ほ とんどのFOSS4Gツールで採用されている • 投影法の指定は、長い文字列 +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0
+lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs • 「投影法名 proj4」でWeb検索するのが速い +proj=laea +lat_0=中心緯度 +lon_0=中心経度 +x_0=0 +y_0=0 • Lambert Azimuthal Equal Area 「ランベルト正積 方位図法」の英語名 例:Webメルカトル図法の場合
等距離円の描画 / Drawing equidistant circle • 地図上で、円になるとは限らない • 中心から、いろいろな方向に、一定距離進ん だ点の集合を描画する
• “Geodesic問題”を解けば良い • GeographicLibを使って、90角形を描画 • 他に、PROJ.4付属のgeodが使えるかも http://geographiclib.sourceforge.net/ 方位線も、同様に GeographicLibで描画
完成した図 ランベルト正積方位図法 (Lambert Azimuthal Equal Area) Webメルカトル図法 (Web Mercator) •
等距離円は、内側から50km, 100km, 200km • 左図:この範囲・解像度だと、正積・正距方位図法はまったく 同一画像になった • 右図:破線は本州に対する等距離円、実線は北海道に対す るもの
• 任意の場所を中心に、方位図法で比較して みたい • 試作第1弾として「どこでも方位図法」公開 (“Azimuthal Map, Anywhere”) 水曜に公開したばかり
Mapnikではなく、d3.jsを使用 今後の展開 (To be continued) • 北海道と本州程度の緯度差でも、メルカトル 図法では誤差が大きいことが確認できた http://maps.ontarget.cc/azmap/