パソコン用ヘッダー画像
Googleサービス PR

【GAS】全国花火大会を楽しむための鑑賞マップ作成

夏の風物詩、GASで花火大会一覧をマイマップにインポート
記事内に商品プロモーションを含む場合があります

子どもたちも夏休みにはいりました。毎年、家族で花火大会を楽しみにしています。どうせならベストな場所で花火を見たい!と思いますよね。

風向きや距離を考慮したベストな観賞スポットを見つけ、最高の花火を楽しみましょう。GoogleマイマップとGASを使って、観賞スポットを簡単に共有する方法も紹介します。

この記事では、風向きの確認や適切な距離、天候条件など、花火を最大限楽しむためのポイントを詳しく解説します。

花火を見るベストな距離と場所

夏休みの風物詩、花火大会を楽しむ方法

花火を最も美しく見るためには、打ち上げ場所からの距離と周囲の環境が大切です。適切な距離を確保することで、花火の全体像を楽しむことができます。

都心部の花火大会となれば、特設会場を中心に花火が楽しめる場所には限りがありますが、地方であれば、人混みを避けて、花火を楽しめるスポットを見つけることができます。

打ち上げ場所からの理想的な距離

一般的に尺玉(10号玉)が上がる大きな花火大会では、500〜600mの距離がベストです。1.5kmまでなら美しく見えますが、10kmが限界です。

近すぎると音が大きすぎて、子どもがショックを受ける可能性もあります。

最近は、警備などの課題もあり減少傾向ですが、突如開催される花火大会も存在します。サイズ火は4号玉(直径約130m・高さ約160m)が多く、300〜400mの距離がベストです。

Googleマイマップでスポットを共有

花火大会の観賞スポットを友人や家族と簡単に共有するには、Googleマイマップが便利です。

Googleマイマップを使えば、自分だけのオリジナルマップを作成し、花火が美しく見える場所を視覚的に確認できます。

先に作成したオリジナルマップを公開しているので確認してみてください。このあとで紹介するスクリプトでみなさんもオリジナルのマップを作成しよう!

Googleマイマップでオリジナルマップを作成

隅田川花火大会の隠れ鑑賞スポットをマップから見つける。
GASを活用してマイマップにポリゴン作成

今回は、全国の代表する花火大会を一例に、Google Apps Script (GAS)を活用して、Googleスプレッドシートに登録した観賞スポットをKML形式にエクスポートし、Googleマイマップに読み込む方法をご紹介。

  1. スプレッドシートの準備
  2. Google Apps Scriptエディタを開く
  3. スクリプトを準備
  4. スクリプトを保存して実行
  5. KMLファイルをGoogleマイマップにインポート

花火大会をスプレッドシートでリストアップ

スプレッドシートを活用して、事前にマップで管理したい花火大会の情報をまとめます。リストの情報をもとに、GASを活用して、マイマップにインポートします。

全国の花火大会の情報をシートにまとめる

  • A列
    花火大会の名前
  • B列
    経度:10進形式(例 135.121536)
  • C列
    緯度:10進形式(例 35.121536)

打ち上げ場所から半径600mエリアを可視化

花火大会の地点をまとめるだけではなく、花火がキレイに見えるスポットを仮に半径600mのエリアをマップ上に表示させます。

オリジナルマップを参考に、花火がキレイに見えるスポットを見つけるツールにも活用可能。GASをつかって、円を描画することも可能。

My Mapsにインポートするスクリプト

Googleマイマップにポリゴンを追加するスクリプト

はじめに、全体のスクリプトを紹介します。

function exportToKML() {
  var ui = SpreadsheetApp.getUi();
  var response = ui.prompt('KMLファイルの名前を入力してください:', ui.ButtonSet.OK_CANCEL);

  // ユーザーがキャンセルした場合は終了
  if (response.getSelectedButton() == ui.Button.CANCEL) {
    ui.alert('操作がキャンセルされました。');
    return;
  }

  var fileName = response.getResponseText();
  
  if (!fileName) {
    ui.alert('ファイル名が入力されていません。');
    return;
  }

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var kml = '<?xml version="1.0" encoding="UTF-8"?>\n';
  kml += '<kml xmlns="http://www.opengis.net/kml/2.2">\n';
  kml += '  <Document>\n';
  
  // スタイルを定義
  kml += '    <Style id="circleStyle">\n';
  kml += '      <LineStyle>\n';
  kml += '        <color>ff0000ff</color> <!-- 赤色の線 -->\n';
  kml += '        <width>2</width>\n';
  kml += '      </LineStyle>\n';
  kml += '      <PolyStyle>\n';
  kml += '        <color>7fff0000</color> <!-- 半透明の赤色 -->\n';
  kml += '      </PolyStyle>\n';
  kml += '    </Style>\n';

  for (var i = 1; i < data.length; i++) {
    var name = data[i][0];
    var lat = data[i][1];
    var lng = data[i][2];
    
    kml += '    <Placemark>\n';
    kml += '      <name>' + name + '</name>\n';
    kml += '      <Point>\n';
    kml += '        <coordinates>' + lng + ',' + lat + ',0</coordinates>\n';
    kml += '      </Point>\n';
    kml += '    </Placemark>\n';
    
    // 600mの円を追加
    kml += '    <Placemark>\n';
    kml += '      <name>' + name + ' 600m Radius</name>\n';
    kml += '      <styleUrl>#circleStyle</styleUrl>\n';  // スタイルを適用
    kml += '      <Polygon>\n';
    kml += '        <outerBoundaryIs>\n';
    kml += '          <LinearRing>\n';
    kml += '            <coordinates>\n';
    kml += getCircleCoordinatesKML(lat, lng, 600);
    kml += '            </coordinates>\n';
    kml += '          </LinearRing>\n';
    kml += '        </outerBoundaryIs>\n';
    kml += '      </Polygon>\n';
    kml += '    </Placemark>\n';
  }
  
  kml += '  </Document>\n';
  kml += '</kml>';
  
  var blob = Utilities.newBlob(kml, 'application/vnd.google-earth.kml+xml', fileName + '.kml');
  
  // 「KMLファイル」フォルダを取得または作成
  var folderName = 'KMLファイル';
  var folders = DriveApp.getFoldersByName(folderName);
  var folder;
  
  if (folders.hasNext()) {
    folder = folders.next();
  } else {
    folder = DriveApp.createFolder(folderName);
  }
  
  var file = folder.createFile(blob);
  Logger.log('KML file created in folder: ' + file.getUrl());
  ui.alert('KMLファイルが作成されました: ' + file.getUrl());
}

function getCircleCoordinatesKML(lat, lng, radius) {
  var coordinates = '';
  var earthRadius = 6371000; // 地球の半径(メートル)
  var d = radius / earthRadius; // 半径の角度
  
  for (var i = 0; i <= 360; i += 10) {
    var angle = i * Math.PI / 180;
    var latRadians = lat * Math.PI / 180;
    var lngRadians = lng * Math.PI / 180;
    
    var latPoint = Math.asin(Math.sin(latRadians) * Math.cos(d) + Math.cos(latRadians) * Math.sin(d) * Math.cos(angle));
    var lngPoint = lngRadians + Math.atan2(Math.sin(angle) * Math.sin(d) * Math.cos(latRadians), Math.cos(d) - Math.sin(latRadians) * Math.sin(latPoint));
    
    coordinates += (lngPoint * 180 / Math.PI) + ',' + (latPoint * 180 / Math.PI) + ',0 ';
  }
  
  return coordinates;
}

KMLファイルって?

KMLファイルとは、地理空間データを格納するためのファイル形式です。KMLは「Keyhole Markup Language」の略で、Google EarthやGoogleマップなどの地図アプリケーションで使われます。

このファイル形式はXMLベースで、地図上にポイント、線、ポリゴンなどを表示するための情報を含んでいます。例えば、特定の場所の座標、名前、説明文、スタイル(色や幅など)などの情報が記述されています。

KMLファイルを使うことで、地理データを視覚的に簡単に共有したり、地図上でカスタマイズした情報を表示したりすることができます。例えば、旅行のルートを共有したり、特定の場所にマーカーを置いて説明を付けたりするのに便利です。

円を描く関数について

指定した中心点(緯度と経度)を基に、指定された半径内にある円周上の点の座標を計算するためのものです。関数の構成と流れは以下の通り。

  1. 関数の定義
  2. 変数の初期化
  3. 円周上の点の計算
  4. 座標の計算
  5. 結果の返却

この流れを使って、円周上の各点の緯度と経度を計算し、KML形式の座標データとして出力することで、地図上に円を描くことができます。

地元・旅行先で使える花火大会マップ

  1. マイマップに表示させたい情報をリスト化
  2. スクリプトの設定
  3. KMLファイルのダウンロード
  4. ダウンロード先もGASでフォルダの指定
  5. マイマップにファイルをインポート

花火大会を楽しむためには、観賞スポットの選定が重要です。風向きや距離、障害物、天気などを考慮しながら、最適な場所を見つけましょう。

また、Googleマイマップを活用することで、視覚的に地図上に最適なスポットをマッピングし、計画的に花火を楽しむことができます。

大きな花火大会になるほど、交通規制等が設けられます。近隣住民の方に迷惑がかからないように楽しむことが重要。

\スプレッドシートにオリジナルメニューでさらに便利に!/

【保存版】GASでスプレッドシートのメニューをカスタマイズ!!Google スプレッドシートのカスタムメニューを活用して、日々の作業効率をアップさせましょう!この記事では、カスタムメニューの作り方から便利な活用事例まで詳しく解説します。初心者でも簡単に作れるので、ぜひチャレンジしてみてください。...

Fatal error: Uncaught JSMin_UnterminatedRegExpException: JSMin: Unterminated RegExp at byte 47225: /.source + in /home/c1448553/public_html/one-walker.net/wp-content/plugins/autoptimize/classes/external/php/jsmin.php:264 Stack trace: #0 /home/c1448553/public_html/one-walker.net/wp-content/plugins/autoptimize/classes/external/php/jsmin.php(150): JSMin->action(1) #1 /home/c1448553/public_html/one-walker.net/wp-content/plugins/autoptimize/classes/external/php/jsmin.php(84): JSMin->min() #2 /home/c1448553/public_html/one-walker.net/wp-content/plugins/autoptimize/classes/autoptimizeSpeedupper.php(38): JSMin::minify('/* PrismJS 1.29...') #3 /home/c1448553/public_html/one-walker.net/wp-includes/class-wp-hook.php(324): autoptimizeSpeedupper->js_snippetcacher('/* PrismJS 1.29...', '/home/c1448553/...') #4 /home/c1448553/public_html/one-walker.net/wp-includes/plugin.php(205): WP_Hook->apply_filters('/* PrismJS 1.29...', Array) #5 /home/c1448553/public_html/one-walker.net/wp-content/plugins/autoptimize/classes/autoptimizeScripts.ph in /home/c1448553/public_html/one-walker.net/wp-content/plugins/autoptimize/classes/external/php/jsmin.php on line 264