GoogleMapの保存した場所一覧（Jsonデータ）をNumbers.appで保管する

:::note info
GoogleMapの地点登録が2000を超えてしまいました。このデータをcsv化してNumbersで整理をするためのTipsです
:::

# やりたいこと
・GoogleMapのスター付き地点を多数登録してしまい地図がうるさい感じになってしまったので、GoogleMapから削除する
　→文末の雑談のGoogleMapのリスト編集機能が使える
・全て消えると勿体無いので、一覧として保存したい
　→JSONデータを取得してCSV化（本稿）

# Googleデータをテイクアウトする

　きっかけは、Googleデータがダウンロード可能と知ったことです
　マップ関連では下記のデータが”テイクアウト”できます
　
　・マップ　　　　　　　　　　　　　　マップでの設定と個人的な場所
　・マップ（マイプレイス）　　　　　　スター付きの場所と場所のクチコミの記録
　・ロケーション履歴（タイムライン）　タイムライン データ（設定、場所など）

　　https://takeout.google.com

　今回はマップ（マイプレイス）が対象。JSONでテイクアウトできるようですね
　早速、テイクアウトしましょう
　欲しいデータをチョイスして、待つだけでOKです
　すぐにできるものから数日かかるものまでありますが、メール通知からダウンロードができます


# Jason構造を理解する

　CSV作成はターミナルからJqで行います
　まずはデータの構造を理解するため、ダンプします
　コマンドラインからJqで整形ダンプを行い、head先頭の50行をコンソールに出力
　（もちろん、テイクアウトしたJSONデータをテキストエディットで開くということでOKです）
 
　ちなみに、jqの用例として、catからJSONデータをパイプするものがありますが、jqコマンドでもファイル名指定が可能です
　下記の例では、OSXでのダウンロードした際の一般的な保存先となっていますのでusername部分を自分の環境にあわせてください

コマンドラインです
`jq '.' /Users/usesrname/Downloads/Takeout/マップ（マイプレイス）/保存した場所.json | head -n50`

```sh
//結果のサンプルです
{
  "type": "FeatureCollection",
  "features": [
    {
      "geometry": {
        "coordinates": [
          136.6928392,
          35.0710753
        ],
        "type": "Point"
      },
      "properties": {
        "date": "2024-12-28T10:11:37Z",
        "google_maps_url": "http://maps.google.com/?cid=17410544162242155823",
        "location": {
          "address": "日本、〒511-0009 三重県桑名市桑名６６３−５",
          "country_code": "JP",
          "name": "六華苑"
        }
      },
      "type": "Feature"
    },

//以下繰り返しです
```

要素の実態はFeature(s)の繰り返し構造ですね

Features
　┣━ geometry  　-> 経度／緯度
　┗━ properties　-> 名称／住所／リンクなど


ちなみにjqの'.'は入力を変更せずそのまま出力するフィルターです
デフォルトなので省略できますが、ファイル指定をする場合は下記のように引用符が必要です（先程のコマンドの書き換えです）

`>jq '' /Users/usesrname/Downloads/Takeout/マップ（マイプレイス）/保存した場所.json | head -n50`

ファイル指定をしない場合は裸のjqだけでOKです（jqの例としてよくあるテキストを流す場合の例です）
`cat 保存した場所.json| jq | head -n50`


# Jasonを整形する


上記の名称／住所／リンク／経度／緯度を抽出して整形ましょう


コマンドラインです
`cd /Users/usesrname/Downloads/Takeout/マップ（マイプレイス）/;cat 保存した場所.json| jq '.features[] | {"リスト種類": .geometry.type, "場所": .properties.location.name, "住所": .properties.location.address, "リンク": .properties.google_maps_url, "緯度": .geometry.coordinates[1], "経度": .geometry.coordinates[0]}' | >> gmap.txt`

```sh
//結果のサンプルです
{
      "リスト種類": "Point",
      "場所": "六華苑",
      "住所": "日本、〒511-0009 三重県桑名市桑名６６３−５",
      "リンク": "http://maps.google.com/?cid=17410544162242155823",
      "緯度": 35.0710753,
      "経度": 136.6928392
    }
    ・・・
```

説明です
①cd /Users/usesrname/Downloads/Takeout/マップ（マイプレイス）/;
　カレントディレクトリーをJSONでーたのある場所にセットします

②cat 保存した場所.json|
　jqへJSONデータを流します

③ jq '.features[] | {"リスト種類": .geometry.type, "場所": .properties.location.name, "住所": .properties.location.address, "リンク": .properties.google_maps_url, "緯度": .geometry.coordinates[1], "経度": .geometry.coordinates[0]}' |
　jqコマンドを分解して説明
　jqの操作を''で記述しています（フィルター）
　この中でパイプが利用できるのが秀逸ですね

③-1　
　.features[] 
　このフィルターで、featuresの要素をまるごと取り出します
　".xxx"はJSONのキーxxxの内容を返します
　"[]"は配列全体を返します
　featuresは配列（geometryとpropertiesの集合）なので、[]として配列全体を出力することになります

　言い方を変えると取り出したいデータを配下に持つ、featuresをルートに設定するという感じです
　わかりたい場合はここまでの処理で出力してみるとよいでしょう

③-2　
　{"リスト種類": .geometry.type, "場所": .properties.location.name, "住所": .properties.location.address, "リンク": .properties.google_maps_url, "緯度": .geometry.coordinates[1], "経度": .geometry.coordinates[0]}

　外側の{}は、出力を構造化する記号です。JSONで出力させるためのものです
　構造化の中身はJSONのキーとバリューの列挙となります
  カンマをとって要素ごとに改行
```s
    "リスト種類": .geometry.type
    "場所": .properties.location.name
    "住所": .properties.location.address
    "リンク": .properties.google_maps_url
    "緯度": .geometry.coordinates[1]
    "経度": .geometry.coordinates[0]
```

　キー部分は自分で名前をつけることができますが、日本語にしてみました
　バリューはJSONから取得します
　③-1でfeaturesを取り出していますので、.geometry.typeというようにキーを辿ってその内容を取り出します
　
 　ちょっと小技を必要とするのが緯度軽度です
　.geometry.coordinates[1]や.geometry.coordinates[0]としています
　[n]はn+1番目の配列要素を取り出すという意味です
　上の例でcoordinatesは下記のJSONなので配列の中身を取り出すことができます

```s
    coordinates:[136.6928392,35.0710753]
```
  .coordinates[0]は136.6928392、.coordinates[1]は35.0710753となります

④ >> gmap.txt
テキストデータとして出力します


# jqからCSVとして出力する

上記のデータを1行で出力すればOKです

`cd /Users/usesrname/Downloads/Takeout/マップ（マイプレイス）/;cat 保存した場所.json| jq  -c '.features[] | [.properties.location.name, .properties.location.address, .properties.google_maps_url, .geometry.coordinates[1], .geometry.coordinates[0]]' | tr -d '[]' | >> Gmap.csv`

説明です
　jqのオプションの-cが1行で出力するオプションです
　上記③-2を少し変更しています
　[.properties.location.name, .properties.location.address, .properties.google_maps_url, .geometry.coordinates[1], .geometry.coordinates[0]]

　・外側の構造化をする{}は、配列化をする[]にしています
　・JSONのバリュー部分のみを出力しています
　・データの最初と最後に"["、"]"がつくのでtrで削除しています
 
　あとは出力をCSVとして、Numbersで開ばOKです
　Numbers.appでの編集としては、ヘッダー行をつけるくらいです


# 雑談

#### GoogleMapの場所の保存について
　GoogleMapに写真撮影したい場所を登録しているのですが、削除をしておらず、溜まり溜まって2000ポイントを超えてしまいました
 当初は星印をつけれるだけでしたが、現在は、下記の4種類となっています
 行ってみたい／旅行プラン／お気に入り／スター付き

 さらに言うと、上位概念とすてリストという機能があります
 ・リストはGoogleMapのメニューの『保存済み』からアクセスできます
 ・上記4つのリストの他に、40個のリストを作成できます
 　別の言い方をすると、上記の4カテゴリーはリストのデフォルトです
 ・各リストに地点が登録でき、リストメニューから編集、マップ表示／非表示、共有／日共有の処理が可能です
 ・現状、保存した場所.JSONは「スター付き」のみのです
 　アクセス方法
  GoogleMapの左縦メニュー「保存済み」をクリックするとメニュー一覧が表示されるので、三点メニューをクリック
 
#### Googleテイクアウトについて
　地図データ以外にもたくさんのGoogle個人データがテイクアウトできるので
　参考のリンクをみてください（執筆時点で68種類）

　私が利用したもの
　・GooglePhotoデータ
 　　容量を浪費していたので、テイクアウトしてAmazonPhotoに移行
　・GoogleFitデータ
 　 →昔使っていたウェラブルデバイスと連携した情報が残っていました
　　→GoogleFitの日誌がスクロールでしか過去分を見れないので、テイクアウトは役に立ちそう
　・Googleストアデータ
 　→googlePlayでの購入履歴を確認（無駄な課金が。。。）

 GoogleMapの保存した場所.jsonはGeoJSONに則っていますね。地点タイプ（point）です。参考にwikipediaのリンクをつけます

#### 参考リンク
　①jq（YujiOkazawa氏のjpマニュアル日本語訳）
　　https://yujiorama.github.io/unofficial-translations/jq/l10n/jp/manual/
　②とほほのjq入門
　　https://www.tohoho-web.com/ex/jq.html
　③googleデータテイクアウト
　　https://takeout.google.com
　④GeoJSON（ウィキペディア）
　　https://ja.wikipedia.org/wiki/GeoJSON