地理的要素を持った統計データは、Google earth上で可視化すると、訴求効果が強くなります。

実際にやってみましょう。

使用するデータは、某サイトにあった「迷惑サイトのIPアドレス」です。

このIPアドレスからロケーション情報を取得してデータを作成しました。

作成方法はこちらを参照。

IPアドレスとロケーション情報

このデータを使ってKMZファイルを作りearth上で表示します。

表示は2種類。

棒グラフと、数値の比較を円の大きさで表示する一種の円グラフ。

IPアドレスとロケーション情報 で得られるデータは、サイトのプロバイダーがある国名・都市名・緯度・経度などです。




棒グラフ

元になるデータはこんな感じ。



データ

これを以下のように表示してみます。



データからKMLファイルを作成しますが、ポイントはPlacemarkの作成です。

KMLは以下のような書式。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<Document>
    <name>site list</name>
    <description>Nuisance sites.</description>
    <Style id="defaultStyles">
        <LineStyle>
            <color>cc000000</color>
        </LineStyle>
        <PolyStyle>
            <outline>0</outline>
        </PolyStyle>
    </Style>
    
    
    <Placemark>
        <name><都市名></name>
        <styleUrl>#defaultStyles</styleUrl>
        <Style>
            <PolyStyle>
                <color>dc0155ff</color>
            </PolyStyle>
        </Style>
        <Polygon>
            <extrude>1</extrude>
            <tessellate>1</tessellate>
            <altitudeMode>absolute</altitudeMode>
            <outerBoundaryIs>
                <LinearRing>
                    <coordinates>
                <座標列>
                    </coordinates>
                </LinearRing>
            </outerBoundaryIs>
        </Polygon>
    </Placemark>

        ・
        ・
        ・
        ・
        ・
        ・
</Document>
</kml>


座標列はデータの緯度・経度を囲む矩形の4隅の座標で反時計まわりにしておきます。

経度,緯度,高さ<半角スペース>........経度,緯度,高さ

座標列の最後に最初と同じものを置いて閉じます。

色(color)はAABBGGRR。

アルファ青緑赤の順で、それぞれ0~255を16進で表記します。

このKMLファイルをzip圧縮し、拡張子をkmzに変えて作成完了。

kmzファイル






円グラフ

元になるデータはこんな感じ。



データ

このなかから、JP,CN,USのデータを表示してみましょう。

こんな感じ。



これまた、データからKMLファイルを作成しますが、ポイントもPlacemarkの作成です。

KMLは以下のような書式。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<Document>
    <name>site list</name>
    <description>Nuisance sites.</description>
    <Style id="defaultStyles">
        <IconStyle>
            <color>ff0078ff</color>
            <Icon>
                <href>circle.png</href>
            </Icon>
        </IconStyle>
    </Style>

    <Placemark>
        <name><名前></name>
        <LookAt>
            <longitude><経度></longitude>
            <latitude><緯度></latitude>
            <altitude>0</altitude>
            <range>1</range>
            <tilt>0</tilt>
            <heading>0</heading>
        </LookAt>
        <styleUrl>#defaultStyles</styleUrl>
        <Style>
            <IconStyle>
                <scale><スケール></scale>
            </IconStyle>
        </Style>
        <Point>
            <coordinates><経度,緯度>,0</coordinates>
        </Point>
    </Placemark>

        ・
        ・
        ・
        ・
        ・
        ・
</Document>
</kml>


colorに関しては透過度を上げています。

スケールの差が大きいと、JPの場合、円が大きすぎて地理的場所が隠れてしまいます...ので半透明にしています。

棒グラフの場合と少し違うのは、円の描画が画像ファイル(circle.png)を読んでいて、これを描画のベースにしている点です。

circle.png

kmzを作成する場合は、この画像ファイルも一緒にアーカイブしておきます。

kmzファイル






PHPでKMZを作成する場合のコード

kmzって、形式はzipです、アーカイブしてるだけだから.....。

php_info()で、zipが使えることを確認。

xxx,yyy,zzzは適当に置き換え。

<?php
    
    $zip = new ZipArchive();
    // KMZファイルをオープン
    $res = $zip->open('./xxx.kmz', ZipArchive::CREATE);
     
    // KMZファイルのオープンに成功した場合
    if ($res === true) {
     
        // 圧縮するファイルを指定する
        $zip->addFile('yyy.kml');
        $zip->addFile('zzz.png');//円グラフの場合
     
        // KMZファイルをクローズ
        $zip->close();
    }
?>







おまけ1

都道府県別に表示する場合

データ書き込み用CSV(都道府県別)テンプレート

2012年J.リーガー出身地 都道府県別データ(kmz for Google earth)

Web版Google Earthでみる場合はこちら

PHPサンプル

CSVファイルの高さデータは、統計データの最小値が高さ4000に対応するとして、他の値は比率x4000で割り振ります。

棒グラフの辺データは中心の緯度・経度に対して±0.05度で4隅の座標を決めています。

CSVは、コード・都道府県・県庁所在地・緯度・経度・データ・高さ

これを読み込んでkmzを作成します。

<?php
    //CSV読み込み
    setlocale(LC_ALL, 'ja_JP.UTF-8');
     
    $file = '2012Jleager_47todohuken.csv';
    $data = file_get_contents($file);
    $data = mb_convert_encoding($data, 'UTF-8', 'sjis-win');
    $temp = tmpfile();
    $csv  = array();
     
    fwrite($temp, $data);
    rewind($temp);
     
    while (($data = fgetcsv($temp, 0, ",")) !== FALSE) {
      $csv[] = $data;
    }
    fclose($temp);
    
    $pre_script = '';
    $pre_script .= '<?xml version="1.0" encoding="UTF-8"?>';
    $pre_script .= '<kml xmlns="http://earth.google.com/kml/2.2">';
    $pre_script .= '<Document>';
    $pre_script .= '<name>J.leaguer map</name>';
    $pre_script .= '<description>earth.</description>';
    $pre_script .= '<Style id="defaultStyles">';
    $pre_script .= '<LineStyle>';
    $pre_script .= '<color>cc000000</color>';
    $pre_script .= '</LineStyle>';
    $pre_script .= '<PolyStyle>';
    $pre_script .= '<outline>0</outline>';
    $pre_script .= '</PolyStyle>';
    $pre_script .= '</Style>';
    $pre_script .= '\n';
    
    $coordinate_delta = 0.05;
    
    for ($i = 0;$i < count($csv);$i++){
        $name = $csv[$i][1];
        $ido = $csv[$i][3];
        $keido = $csv[$i][4];
        $height = $csv[$i][6];
        
        if(($ido != 0)&&($keido != 0)){
                
                $ne_lat = $ido + $coordinate_delta;
                $ne_lng = $keido + $coordinate_delta;
                
                $nw_lat = $ido + $coordinate_delta;
                $nw_lng = $keido - $coordinate_delta;
                
                $sw_lat = $ido - $coordinate_delta;
                $sw_lng = $keido - $coordinate_delta;
                
                $se_lat = $ido - $coordinate_delta;
                $se_lng = $keido + $coordinate_delta;
                
                
                $coordinates = "";
                
                $coordinates .= $ne_lng . "," . $ne_lat . "," . $height . " ";
                $coordinates .= $nw_lng . "," . $nw_lat . "," . $height . " ";
                $coordinates .= $sw_lng . "," . $sw_lat . "," . $height . " ";
                $coordinates .= $se_lng . "," . $se_lat . "," . $height . " ";
                $coordinates .= $ne_lng . "," . $ne_lat . "," . $height;
                
                
                $placemark .= "<Placemark>";
                
                
                $placemark .= "<name>" + $name + "</name>";
                $placemark .= "<styleUrl>#defaultStyles</styleUrl>";
                $placemark .= "<Style>";
                $placemark .= "<PolyStyle>";
                $placemark .= "<color>dc0155ff</color>";
                $placemark .= "</PolyStyle>";
                $placemark .= "</Style>";
                $placemark .= "<Polygon>";
                $placemark .= "<extrude>1</extrude>";
                $placemark .= "<tessellate>1</tessellate>";
                $placemark .= "<altitudeMode>absolute</altitudeMode>";
                $placemark .= "<outerBoundaryIs>";
                $placemark .= "<LinearRing>";
                $placemark .= "<coordinates>";
                
                $placemark .= $coordinates;
                
                $placemark .= "</coordinates>";
                $placemark .= "</LinearRing>";
                $placemark .= "</outerBoundaryIs>";
                $placemark .= "</Polygon>";
                $placemark .= "</Placemark>";
                
                $placemark .= "\n";
        }
        
        
        
    }
    
    
    $post_script = '';
    $post_script .= '</Document>';
    $post_script .= '</kml>';
    
    
    $fp=fopen("2012JLeager.kml","w");
    fputs($fp,$pre_script . $placemark . $post_script);
    fclose($fp);
    
    
    $zip = new ZipArchive();
        // ZIPファイルをオープン
        $res = $zip->open('./2012JLeager.kmz', ZipArchive::CREATE);
         
        // zipファイルのオープンに成功した場合
        if ($res === true) {
         
            // 圧縮するファイルを指定する
            $zip->addFile('2012JLeager.kml');
         
            // ZIPファイルをクローズ
            $zip->close();
        }
        
        print("ok");
        
    
    
?>







おまけ2

統計処理をする場合ツールとしてよく使われるのは多分、ExcelとR言語だと......勝手に思ってます。

ExcelはCSVにすれば上のようにEarthと連携できますが、Rはどうなんだ?

できますねぇ、以下を参照。

ここ
GoogleEarthとR

とか、ここ
R システムを用いた統計処理/データマイニング

Rについては、このサイトを立ち上げた2008年頃にもEarthとの連携やりますよーー.....的なことを書いておきながら、その後ぜんぜんやってませんでした。

当時は今のようなビッグデータなんて言葉はどこにもなくて、「別に今やんなくてもいいか」くらいにしか思ってませんでした。

でもそろそろ「RとGIS」をやってみる時期かも.....と思ってます。




EarthにFlight Path(航空路線図)のようなものを描く場合は、こちら。

Google Earthのデータ(KML)を作る