インラインSVGをつかって地図っぽいものをつくってみる

Kohei Kadowaki
Kohei KadowakiSoftware Engineer at PLAID, Inc.
インラインSVGをつかって
地図っぽいものをつくってみる
2012/7/21 第5回 HTML5など勉強会
HTML5-West.jp Kadoppe




                        1
自己紹介
• 名前:門脇   恒平 @kadoppe

• 職業:エンジニア
Rails, (Java¦Coffee)Script, Objective-C

• 肩書き:
HTML5-West.jpコアメンバー/ShareWis Inc. CTO

• 趣味:ポッドキャスト/        Ust配信
                                最近ももクロが好きすぎて辛いです。

                        2
本日の資料

• プレゼンスライド


• SlideShare: http://www.slideshare.net/kadoppe


• ソースコード


• GitHub: https://github.com/kadoppe



                        3
Chapter 1:
SVGとはなんぞや。



             4
いい資料あり

• 才色兼備なグラフィックス                          - SVGが見せるWebの未来
Mozilla Japan - Brian Birtlesさん

http://people.mozilla.org/ bbirtles/pres/fxdevcon-2012/




               この資料読むだけでSVGはOK!



                                    5
SVGの3つの特徴


 ベクター      XML    インライン
グラフィック   フォーマット    SVG




           6
ベクター
グラフィック   ベクター vs ビットマップ




         点で画像を表現       線で画像を表現
                        出展: http://ja.wikipedia.org/wiki/ファイル:Bitmap_VS_SVG.svg
                   7
XML
フォーマット   画像をXMLで書く!
• プログラマーが大好き(?)なXMLが使える


 • 円:<circle>要素


 • 四角:<rect>要素


 • 線:<path>要素


 • グループ化:<g>要素

                      出展: http://ja.wikipedia.org/wiki/ファイル:SVG.svg
                  8
インライン
 SVG    HTMLにSVGを埋め込む!

• HTML文書に直接SVGの要素を記述できる

<!DOCTYPE html>
<html>                     CSSによるルック
  <head></head>
                           アンドフィール変更
  <body>
    <h1>SVG画像だよ。<h1>
                                          が可能に!
    <svg>
      <circle>
    </svg>             JavaScriptによる操作/
  </body>               イベントハンドリング
</html>




                       9
対応ブラウザ



>= 1.5    >= 9        最初から   >= 3.0

   ただし、ブラウザ間でサポートしている機能、挙動に違いがある




                 10
SVGデモまとめサイト「svgwow」
                      http://svgwow.org

         11
Chapter 2:
インラインSVGでつくる
地図っぽいもの


             12
Webブラウザ + SVG = ??

インラインSVGを使って何かつくりたい!




  SVGといったら「ズーム」だ!



 Webブラウザ + ズーム = 地図!?


             13
Webブラウザ + SVG = 地図

       納得!(仕事でもつくってるしね。)



           14
Webブラウザで動く地図といえば?




   Bing Maps        Google Maps

特徴その1:ドラッグで地図を動かせる(Pan)

特徴その2:ホイールでズームレベルを変更できる
(Zoom in / Zoom out)
               15
ライブコーディング
• ゴール:Zoom    / Pan機能を備えた地図っぽいもの

• Step   1:地図データの準備

• Step   2:地図データをSVGで描画

• Step   3:CSSでスタイルを整える

• Step   4:Panの実装

• Step   5:Zoomの実装        ※ JavaScriptのライブラリは使わない

                     16
Step 1
         地図データの準備

         地図データは自分で作成したい!


• 完璧な地図データは作成できない
→ 円で陸地を、背景で海を表現

• 各円の半径、中心座標データを
JSON形式で作成                  完成イメージ


                  17
Step 2
            地図データをSVGで描画
•   今回使うSVG要素

    •   <svg>要素:SVG画像を表す
        <svg><!-- SVG画像 --></svg>


    •   <circle>要素:円を表す
        <!-- 座標(10, 20)に半径5pxの円を表示 -->
        <circle cx=”10” cy=”20” r=”5”>



    <circle>要素をappendChild()を使って追加していく

                                18
Step 2    補足: createElementNS()
// 要素は生成されない
var circleElm1 = document.createElement(“circle”);

// 要素は生成される
var circleElm2 = document.createElementNS(
                    “http://www.w3.org/2000/svg”, “circle”
                 );

•   document.createElementNS()

    •   XML名前空間を指定して要素を生成するメソッド

    •   SVG要素の生成にはSVGのXML名前空間の指定が必要

                           19
Step 3
         CSSでスタイルを整える


                 地図に見えない!


   現在の 地図

          CSSで背景色、要素の色を指定する


                  20
Step 4
         Panの実装

    マウスドラッグで地図をPanしたい!


• 実装手順を分割


 1. <circle>要素をまとめて動かせるようにする

 2. ドラッグ操作を検出してPanできるようにする



               21
Step 4      1. <circle>要素をまとめて動かす
•   今回使うSVG要素:<g>要素

    •   役割1:複数のSVG要素をグループ化する
        <g><circle><circle><circle><circle></g>


    •   役割2:子要素の位置/形状をまとめて操作する (transform属性)
        <!-- 子要素をx軸方向に50px, y軸方向に25px動かす -->
        <g transform=”translate(50, 25)”><!-- 略 --></g>


             とりあえず決め打ちで地図をPanしてみる


                                22
Step 4   2. ドラッグ操作を検出してPanする


• <svg>要素に以下のイベントハンドラを登録


 • mousedown   → mousemove → mouseup
     ドラッグ開始        ドラッグ中     ドラッグ終了



         ドラッグ中のマウスポインタの移動量を元に
         <g>要素のtransform属性の値を変更する


                     23
Step 5
         Zoomの実装

   マウスホイールで地図をZoomしたい!


• 実装手順を分割


 1. <circle>要素をまとめて拡大/縮小できるように

 2. ホイール操作を検出してZoomできるようにする



               24
Step 5   1. <circle>要素をまとめて拡大縮小



• <g>要素のtransform属性にscale()を指定

 <!-- 子要素のサイズを2倍に -->
 <g transform=”translate(50, 25) scale(2)”></g>



          とりあえずは決め打ちでZoomしてみる




                           25
Step 5      2. ホイール操作を検出してZoomする
•   ホイール操作の検出方法はブラウザによって異なる

•   Google Chromeの場合

    •   <svg>要素に mousewheel イベントハンドラを登録

•   他のブラウザの場合

    •   参考記事: http://codaholic.org/?p=1139
                                        今回はChromeのみ対応
               マウスホイールが動いた向きをもとに
            <g>要素のtransform属性の値を変更する
                              26
完成!




 描画   Pan   Zoom




       27
改善ポイント

• Google   Maps / Bing Maps に近づくために

 • Zoom機能のクロスブラウザ対応


 • マウスポインタの位置に向かってZoomしたい


 • Panした時の挙動に慣性をつける



                     28
まとめ
• SVGの3つの特徴


 • ベクターグラフィック


 •   XMLフォーマット

 • インラインSVG


• Webブラウザ   + SVG = 地図

 •   JavaScriptとCSSを使って地図っぽいものをつくった
                    29
おしまい!

ご清聴ありがとうございました!



       30
1 of 30

Recommended

暗号技術の実装と数学 by
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
9.6K views35 slides
イミュータブルデータモデル(入門編) by
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
185.9K views24 slides
AWS Amplify 入門 by
AWS Amplify 入門AWS Amplify 入門
AWS Amplify 入門Hideaki Aoyagi
2K views24 slides
それはYAGNIか? それとも思考停止か? by
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
29.3K views41 slides
GoでMinecraftっぽいの作る by
GoでMinecraftっぽいの作るGoでMinecraftっぽいの作る
GoでMinecraftっぽいの作る京大 マイコンクラブ
25.1K views56 slides
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜 by
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Takahiko Ito
1.4K views27 slides

More Related Content

What's hot

本当は恐ろしい分散システムの話 by
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話Kumazaki Hiroki
686.3K views70 slides
Raft by
RaftRaft
RaftPreferred Networks
42.8K views77 slides
シリコンバレーの「何が」凄いのか by
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかAtsushi Nakada
183.9K views77 slides
Marp入門 by
Marp入門Marp入門
Marp入門Rui Watanabe
1K views15 slides
例外設計における大罪 by
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
68.6K views37 slides
NuxtでAPIサーバー立ててみた by
NuxtでAPIサーバー立ててみたNuxtでAPIサーバー立ててみた
NuxtでAPIサーバー立ててみたssuserbf0fbd
593 views12 slides

What's hot(20)

本当は恐ろしい分散システムの話 by Kumazaki Hiroki
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki686.3K views
シリコンバレーの「何が」凄いのか by Atsushi Nakada
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada183.9K views
例外設計における大罪 by Takuto Wada
例外設計における大罪例外設計における大罪
例外設計における大罪
Takuto Wada68.6K views
NuxtでAPIサーバー立ててみた by ssuserbf0fbd
NuxtでAPIサーバー立ててみたNuxtでAPIサーバー立ててみた
NuxtでAPIサーバー立ててみた
ssuserbf0fbd593 views
マイクロサービス 4つの分割アプローチ by 増田 亨
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
増田 亨41.4K views
AWSのログ管理ベストプラクティス by Akihiro Kuwano
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
Akihiro Kuwano77.3K views
イミュータブルデータモデル(世代編) by Yoshitaka Kawashima
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima38.1K views
Redisの特徴と活用方法について by Yuji Otani
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani101.6K views
インフラエンジニアのためのRancherを使ったDocker運用入門 by Masahito Zembutsu
インフラエンジニアのためのRancherを使ったDocker運用入門インフラエンジニアのためのRancherを使ったDocker運用入門
インフラエンジニアのためのRancherを使ったDocker運用入門
Masahito Zembutsu49K views
InnoDBのすゝめ(仮) by Takanori Sejima
InnoDBのすゝめ(仮)InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)
Takanori Sejima22.6K views
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜 by Takahiro Inoue
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
Takahiro Inoue49.1K views
技術ブログを書こう by akira6592
技術ブログを書こう技術ブログを書こう
技術ブログを書こう
akira659210.4K views
Gcpで多言語対応チャットボット作ってみた by Ryo Takano
Gcpで多言語対応チャットボット作ってみたGcpで多言語対応チャットボット作ってみた
Gcpで多言語対応チャットボット作ってみた
Ryo Takano1.5K views
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24 by Shin Ohno
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Shin Ohno2.6K views
GeoPackageを使ってみた(おざき様) by OSgeo Japan
GeoPackageを使ってみた(おざき様)GeoPackageを使ってみた(おざき様)
GeoPackageを使ってみた(おざき様)
OSgeo Japan7.6K views
トランザクションをSerializableにする4つの方法 by Kumazaki Hiroki
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
Kumazaki Hiroki21.9K views

Viewers also liked

SVGでつくるインタラクティブWebアプリケーション by
SVGでつくるインタラクティブWebアプリケーションSVGでつくるインタラクティブWebアプリケーション
SVGでつくるインタラクティブWebアプリケーションKohei Kadowaki
8.2K views54 slides
CSSできる SVGアニメーション by
CSSできる SVGアニメーションCSSできる SVGアニメーション
CSSできる SVGアニメーションKasumi Morita
3.6K views33 slides
数が増えてもこわくない!Quantity Queries の紹介 by
数が増えてもこわくない!Quantity Queries の紹介数が増えてもこわくない!Quantity Queries の紹介
数が増えてもこわくない!Quantity Queries の紹介Kasumi Morita
2K views30 slides
AngularJSで業務システムUI部品化 by
AngularJSで業務システムUI部品化AngularJSで業務システムUI部品化
AngularJSで業務システムUI部品化Toshio Ehara
4.1K views27 slides
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーション by
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーションAngularJSとD3.jsによるインタラクティブデータビジュアライゼーション
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーションYosuke Onoue
9.4K views30 slides
私がWebサイトをスタイリッシュな 今風デザインにしない理由 by
私がWebサイトをスタイリッシュな 今風デザインにしない理由私がWebサイトをスタイリッシュな 今風デザインにしない理由
私がWebサイトをスタイリッシュな 今風デザインにしない理由yoshipan
1.9K views19 slides

Viewers also liked(9)

SVGでつくるインタラクティブWebアプリケーション by Kohei Kadowaki
SVGでつくるインタラクティブWebアプリケーションSVGでつくるインタラクティブWebアプリケーション
SVGでつくるインタラクティブWebアプリケーション
Kohei Kadowaki8.2K views
CSSできる SVGアニメーション by Kasumi Morita
CSSできる SVGアニメーションCSSできる SVGアニメーション
CSSできる SVGアニメーション
Kasumi Morita3.6K views
数が増えてもこわくない!Quantity Queries の紹介 by Kasumi Morita
数が増えてもこわくない!Quantity Queries の紹介数が増えてもこわくない!Quantity Queries の紹介
数が増えてもこわくない!Quantity Queries の紹介
Kasumi Morita2K views
AngularJSで業務システムUI部品化 by Toshio Ehara
AngularJSで業務システムUI部品化AngularJSで業務システムUI部品化
AngularJSで業務システムUI部品化
Toshio Ehara4.1K views
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーション by Yosuke Onoue
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーションAngularJSとD3.jsによるインタラクティブデータビジュアライゼーション
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーション
Yosuke Onoue9.4K views
私がWebサイトをスタイリッシュな 今風デザインにしない理由 by yoshipan
私がWebサイトをスタイリッシュな 今風デザインにしない理由私がWebサイトをスタイリッシュな 今風デザインにしない理由
私がWebサイトをスタイリッシュな 今風デザインにしない理由
yoshipan1.9K views
データ可視化勉強会 by Daichi Morifuji
データ可視化勉強会データ可視化勉強会
データ可視化勉強会
Daichi Morifuji13.7K views
なんでCSSすぐ死んでしまうん by Hayato Mizuno
なんでCSSすぐ死んでしまうんなんでCSSすぐ死んでしまうん
なんでCSSすぐ死んでしまうん
Hayato Mizuno79.8K views
ブラウザにやさしいHTML/CSS by Takeharu Igari
ブラウザにやさしいHTML/CSSブラウザにやさしいHTML/CSS
ブラウザにやさしいHTML/CSS
Takeharu Igari71.3K views

Similar to インラインSVGをつかって地図っぽいものをつくってみる

ShareWisをFirefoxで動かすためのSVG的とりくみ by
ShareWisをFirefoxで動かすためのSVG的とりくみShareWisをFirefoxで動かすためのSVG的とりくみ
ShareWisをFirefoxで動かすためのSVG的とりくみKohei Kadowaki
1.9K views20 slides
レスポンシブWebデザイン【発展編】 by
レスポンシブWebデザイン【発展編】レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】Yasuhito Yabe
1.7K views36 slides
SVG MANIAX - CSS Nite After dark7 by
SVG MANIAX - CSS Nite After dark7SVG MANIAX - CSS Nite After dark7
SVG MANIAX - CSS Nite After dark7Naoki Matsuda
25.8K views86 slides
SVG MANIAX Ver.2 - Mars vanilla by
SVG MANIAX Ver.2 -  Mars vanillaSVG MANIAX Ver.2 -  Mars vanilla
SVG MANIAX Ver.2 - Mars vanillaNaoki Matsuda
40.5K views98 slides
Canvas勉強会 by
Canvas勉強会Canvas勉強会
Canvas勉強会Tsutomu Kawamura
4.1K views57 slides
HTML5-20100626 by
HTML5-20100626HTML5-20100626
HTML5-20100626Taku AMANO
659 views27 slides

Similar to インラインSVGをつかって地図っぽいものをつくってみる(20)

ShareWisをFirefoxで動かすためのSVG的とりくみ by Kohei Kadowaki
ShareWisをFirefoxで動かすためのSVG的とりくみShareWisをFirefoxで動かすためのSVG的とりくみ
ShareWisをFirefoxで動かすためのSVG的とりくみ
Kohei Kadowaki1.9K views
レスポンシブWebデザイン【発展編】 by Yasuhito Yabe
レスポンシブWebデザイン【発展編】レスポンシブWebデザイン【発展編】
レスポンシブWebデザイン【発展編】
Yasuhito Yabe1.7K views
SVG MANIAX - CSS Nite After dark7 by Naoki Matsuda
SVG MANIAX - CSS Nite After dark7SVG MANIAX - CSS Nite After dark7
SVG MANIAX - CSS Nite After dark7
Naoki Matsuda25.8K views
SVG MANIAX Ver.2 - Mars vanilla by Naoki Matsuda
SVG MANIAX Ver.2 -  Mars vanillaSVG MANIAX Ver.2 -  Mars vanilla
SVG MANIAX Ver.2 - Mars vanilla
Naoki Matsuda40.5K views
HTML5-20100626 by Taku AMANO
HTML5-20100626HTML5-20100626
HTML5-20100626
Taku AMANO659 views
F-site発表資料「Flashユーザーが今覚えておきたいHTML5」 by Yasunobu Ikeda
F-site発表資料「Flashユーザーが今覚えておきたいHTML5」F-site発表資料「Flashユーザーが今覚えておきたいHTML5」
F-site発表資料「Flashユーザーが今覚えておきたいHTML5」
Yasunobu Ikeda1.9K views
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう by Hiroaki Wakamatsu
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみようJavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
Hiroaki Wakamatsu2.1K views
スマホにおけるWebGL入門 by Yohta Kanke
スマホにおけるWebGL入門スマホにおけるWebGL入門
スマホにおけるWebGL入門
Yohta Kanke12K views
HTML5で作るスマホブラウザゲーム by Takumi Ohashi
HTML5で作るスマホブラウザゲームHTML5で作るスマホブラウザゲーム
HTML5で作るスマホブラウザゲーム
Takumi Ohashi6.4K views
HTML5でスマートフォン開発の理想と現実 by Takumi Ohashi
HTML5でスマートフォン開発の理想と現実HTML5でスマートフォン開発の理想と現実
HTML5でスマートフォン開発の理想と現実
Takumi Ohashi6.5K views
パララックスでレスポンシブでJ query mobileなサイトのつくりかた by Shumpei Shiraishi
パララックスでレスポンシブでJ query mobileなサイトのつくりかたパララックスでレスポンシブでJ query mobileなサイトのつくりかた
パララックスでレスポンシブでJ query mobileなサイトのつくりかた
Shumpei Shiraishi20K views
㉘HTML5+CSS3でアニメーション! by Nishida Kansuke
㉘HTML5+CSS3でアニメーション!㉘HTML5+CSS3でアニメーション!
㉘HTML5+CSS3でアニメーション!
Nishida Kansuke3.4K views
JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with... by torutk
JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...
JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...
torutk1.9K views
Data Visualization meetup 2017 by 清水 正行
Data Visualization meetup 2017Data Visualization meetup 2017
Data Visualization meetup 2017
清水 正行2K views
AngularJSでデータビジュアライゼーションがしたい by Yosuke Onoue
AngularJSでデータビジュアライゼーションがしたいAngularJSでデータビジュアライゼーションがしたい
AngularJSでデータビジュアライゼーションがしたい
Yosuke Onoue1.6K views
おふとんから眺めるSVG by cocu_628496
おふとんから眺めるSVGおふとんから眺めるSVG
おふとんから眺めるSVG
cocu_628496932 views
Css3でキャラクターアニメーションに挑戦してみた by Shinichi Sato
Css3でキャラクターアニメーションに挑戦してみたCss3でキャラクターアニメーションに挑戦してみた
Css3でキャラクターアニメーションに挑戦してみた
Shinichi Sato1.8K views
Firefox OSでSVGをつかってみた by Kohei Kadowaki
Firefox OSでSVGをつかってみたFirefox OSでSVGをつかってみた
Firefox OSでSVGをつかってみた
Kohei Kadowaki8.2K views
インタラクティブコンテンツにおけるHTML5とFlash by Yasunobu Ikeda
インタラクティブコンテンツにおけるHTML5とFlashインタラクティブコンテンツにおけるHTML5とFlash
インタラクティブコンテンツにおけるHTML5とFlash
Yasunobu Ikeda3.4K views

More from Kohei Kadowaki

Pebble + JavaScriptでつくるスマートウォッチアプリ by
Pebble + JavaScriptでつくるスマートウォッチアプリPebble + JavaScriptでつくるスマートウォッチアプリ
Pebble + JavaScriptでつくるスマートウォッチアプリKohei Kadowaki
6.4K views47 slides
Inline SVG - トラブルとその対策 by
Inline SVG - トラブルとその対策Inline SVG - トラブルとその対策
Inline SVG - トラブルとその対策Kohei Kadowaki
10.4K views71 slides
Webでもできるデータビジュアライゼーション by
WebでもできるデータビジュアライゼーションWebでもできるデータビジュアライゼーション
WebでもできるデータビジュアライゼーションKohei Kadowaki
6.2K views78 slides
いまさら聞けない!?Backbone.js 超入門 by
いまさら聞けない!?Backbone.js 超入門いまさら聞けない!?Backbone.js 超入門
いまさら聞けない!?Backbone.js 超入門Kohei Kadowaki
21.2K views91 slides
D3.js と SVG によるデータビジュアライゼーション by
D3.js と SVG によるデータビジュアライゼーションD3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーションKohei Kadowaki
13.8K views81 slides
プログラマーのお仕事 by
プログラマーのお仕事プログラマーのお仕事
プログラマーのお仕事Kohei Kadowaki
1K views19 slides

More from Kohei Kadowaki(14)

Pebble + JavaScriptでつくるスマートウォッチアプリ by Kohei Kadowaki
Pebble + JavaScriptでつくるスマートウォッチアプリPebble + JavaScriptでつくるスマートウォッチアプリ
Pebble + JavaScriptでつくるスマートウォッチアプリ
Kohei Kadowaki6.4K views
Inline SVG - トラブルとその対策 by Kohei Kadowaki
Inline SVG - トラブルとその対策Inline SVG - トラブルとその対策
Inline SVG - トラブルとその対策
Kohei Kadowaki10.4K views
Webでもできるデータビジュアライゼーション by Kohei Kadowaki
WebでもできるデータビジュアライゼーションWebでもできるデータビジュアライゼーション
Webでもできるデータビジュアライゼーション
Kohei Kadowaki6.2K views
いまさら聞けない!?Backbone.js 超入門 by Kohei Kadowaki
いまさら聞けない!?Backbone.js 超入門いまさら聞けない!?Backbone.js 超入門
いまさら聞けない!?Backbone.js 超入門
Kohei Kadowaki21.2K views
D3.js と SVG によるデータビジュアライゼーション by Kohei Kadowaki
D3.js と SVG によるデータビジュアライゼーションD3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーション
Kohei Kadowaki13.8K views
5分でわかる?Backbone.js ことはじめ by Kohei Kadowaki
5分でわかる?Backbone.js ことはじめ5分でわかる?Backbone.js ことはじめ
5分でわかる?Backbone.js ことはじめ
Kohei Kadowaki11.4K views
UnityでつくるはじめてのPONG by Kohei Kadowaki
UnityでつくるはじめてのPONGUnityでつくるはじめてのPONG
UnityでつくるはじめてのPONG
Kohei Kadowaki5.5K views
d3jsではじめるデータビジュアライゼーション入門 by Kohei Kadowaki
d3jsではじめるデータビジュアライゼーション入門d3jsではじめるデータビジュアライゼーション入門
d3jsではじめるデータビジュアライゼーション入門
Kohei Kadowaki9.7K views
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた by Kohei Kadowaki
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみたゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
Kohei Kadowaki48.1K views
WebSocket + Node.jsでつくるチャットアプリ by Kohei Kadowaki
WebSocket + Node.jsでつくるチャットアプリWebSocket + Node.jsでつくるチャットアプリ
WebSocket + Node.jsでつくるチャットアプリ
Kohei Kadowaki15.1K views

Recently uploaded

定例会スライド_キャチs 公開用.pdf by
定例会スライド_キャチs 公開用.pdf定例会スライド_キャチs 公開用.pdf
定例会スライド_キャチs 公開用.pdfKeio Robotics Association
146 views64 slides
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可 by
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可Hitachi, Ltd. OSS Solution Center.
10 views22 slides
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 by
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PC Cluster Consortium
66 views12 slides
光コラボは契約してはいけない by
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけないTakuya Matsunaga
28 views17 slides
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向 by
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Hitachi, Ltd. OSS Solution Center.
109 views26 slides

Recently uploaded(7)

PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 by PC Cluster Consortium
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
光コラボは契約してはいけない by Takuya Matsunaga
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけない
Takuya Matsunaga28 views
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」 by PC Cluster Consortium
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」

インラインSVGをつかって地図っぽいものをつくってみる

  • 2. 自己紹介 • 名前:門脇 恒平 @kadoppe • 職業:エンジニア Rails, (Java¦Coffee)Script, Objective-C • 肩書き: HTML5-West.jpコアメンバー/ShareWis Inc. CTO • 趣味:ポッドキャスト/ Ust配信 最近ももクロが好きすぎて辛いです。 2
  • 3. 本日の資料 • プレゼンスライド • SlideShare: http://www.slideshare.net/kadoppe • ソースコード • GitHub: https://github.com/kadoppe 3
  • 5. いい資料あり • 才色兼備なグラフィックス - SVGが見せるWebの未来 Mozilla Japan - Brian Birtlesさん http://people.mozilla.org/ bbirtles/pres/fxdevcon-2012/ この資料読むだけでSVGはOK! 5
  • 6. SVGの3つの特徴 ベクター XML インライン グラフィック フォーマット SVG 6
  • 7. ベクター グラフィック ベクター vs ビットマップ 点で画像を表現 線で画像を表現 出展: http://ja.wikipedia.org/wiki/ファイル:Bitmap_VS_SVG.svg 7
  • 8. XML フォーマット 画像をXMLで書く! • プログラマーが大好き(?)なXMLが使える • 円:<circle>要素 • 四角:<rect>要素 • 線:<path>要素 • グループ化:<g>要素 出展: http://ja.wikipedia.org/wiki/ファイル:SVG.svg 8
  • 9. インライン SVG HTMLにSVGを埋め込む! • HTML文書に直接SVGの要素を記述できる <!DOCTYPE html> <html> CSSによるルック <head></head> アンドフィール変更 <body> <h1>SVG画像だよ。<h1> が可能に! <svg> <circle> </svg> JavaScriptによる操作/ </body> イベントハンドリング </html> 9
  • 10. 対応ブラウザ >= 1.5 >= 9 最初から >= 3.0 ただし、ブラウザ間でサポートしている機能、挙動に違いがある 10
  • 13. Webブラウザ + SVG = ?? インラインSVGを使って何かつくりたい! SVGといったら「ズーム」だ! Webブラウザ + ズーム = 地図!? 13
  • 14. Webブラウザ + SVG = 地図 納得!(仕事でもつくってるしね。) 14
  • 15. Webブラウザで動く地図といえば? Bing Maps Google Maps 特徴その1:ドラッグで地図を動かせる(Pan) 特徴その2:ホイールでズームレベルを変更できる (Zoom in / Zoom out) 15
  • 16. ライブコーディング • ゴール:Zoom / Pan機能を備えた地図っぽいもの • Step 1:地図データの準備 • Step 2:地図データをSVGで描画 • Step 3:CSSでスタイルを整える • Step 4:Panの実装 • Step 5:Zoomの実装 ※ JavaScriptのライブラリは使わない 16
  • 17. Step 1 地図データの準備 地図データは自分で作成したい! • 完璧な地図データは作成できない → 円で陸地を、背景で海を表現 • 各円の半径、中心座標データを JSON形式で作成 完成イメージ 17
  • 18. Step 2 地図データをSVGで描画 • 今回使うSVG要素 • <svg>要素:SVG画像を表す <svg><!-- SVG画像 --></svg> • <circle>要素:円を表す <!-- 座標(10, 20)に半径5pxの円を表示 --> <circle cx=”10” cy=”20” r=”5”> <circle>要素をappendChild()を使って追加していく 18
  • 19. Step 2 補足: createElementNS() // 要素は生成されない var circleElm1 = document.createElement(“circle”); // 要素は生成される var circleElm2 = document.createElementNS( “http://www.w3.org/2000/svg”, “circle” ); • document.createElementNS() • XML名前空間を指定して要素を生成するメソッド • SVG要素の生成にはSVGのXML名前空間の指定が必要 19
  • 20. Step 3 CSSでスタイルを整える 地図に見えない! 現在の 地図 CSSで背景色、要素の色を指定する 20
  • 21. Step 4 Panの実装 マウスドラッグで地図をPanしたい! • 実装手順を分割 1. <circle>要素をまとめて動かせるようにする 2. ドラッグ操作を検出してPanできるようにする 21
  • 22. Step 4 1. <circle>要素をまとめて動かす • 今回使うSVG要素:<g>要素 • 役割1:複数のSVG要素をグループ化する <g><circle><circle><circle><circle></g> • 役割2:子要素の位置/形状をまとめて操作する (transform属性) <!-- 子要素をx軸方向に50px, y軸方向に25px動かす --> <g transform=”translate(50, 25)”><!-- 略 --></g> とりあえず決め打ちで地図をPanしてみる 22
  • 23. Step 4 2. ドラッグ操作を検出してPanする • <svg>要素に以下のイベントハンドラを登録 • mousedown → mousemove → mouseup ドラッグ開始 ドラッグ中 ドラッグ終了 ドラッグ中のマウスポインタの移動量を元に <g>要素のtransform属性の値を変更する 23
  • 24. Step 5 Zoomの実装 マウスホイールで地図をZoomしたい! • 実装手順を分割 1. <circle>要素をまとめて拡大/縮小できるように 2. ホイール操作を検出してZoomできるようにする 24
  • 25. Step 5 1. <circle>要素をまとめて拡大縮小 • <g>要素のtransform属性にscale()を指定 <!-- 子要素のサイズを2倍に --> <g transform=”translate(50, 25) scale(2)”></g> とりあえずは決め打ちでZoomしてみる 25
  • 26. Step 5 2. ホイール操作を検出してZoomする • ホイール操作の検出方法はブラウザによって異なる • Google Chromeの場合 • <svg>要素に mousewheel イベントハンドラを登録 • 他のブラウザの場合 • 参考記事: http://codaholic.org/?p=1139 今回はChromeのみ対応 マウスホイールが動いた向きをもとに <g>要素のtransform属性の値を変更する 26
  • 27. 完成! 描画 Pan Zoom 27
  • 28. 改善ポイント • Google Maps / Bing Maps に近づくために • Zoom機能のクロスブラウザ対応 • マウスポインタの位置に向かってZoomしたい • Panした時の挙動に慣性をつける 28
  • 29. まとめ • SVGの3つの特徴 • ベクターグラフィック • XMLフォーマット • インラインSVG • Webブラウザ + SVG = 地図 • JavaScriptとCSSを使って地図っぽいものをつくった 29