【PowerBI】世界各国の都市情報を緯度・経度10度毎にまとめる

データ分析を行っていると、緯度経度情報に触れる機会もあります。
実はこの緯度経度情報が曲者だと考えています。

一見したところ詳細な情報のように見えるのですが、実態は無味乾燥な2次元の数値情報に過ぎずそこからつかみ取れるものが少ない。

どのようにすれば人間の感性に訴えかけるかなと考えた結果「最も近い都市情報とリンクさせるのが良い」という結論に至りました。都市という属性を持たせ、かつ単体のデータではなく「寄せる」ことで、そこから情報を引っ張り出せるのという考えです。

PowerBIで都市情報を取得する自分のやり方を下記にまとめました。

検索で調査したところ、下記のWEBサイト（フランスの調査会社の様です）で都市情報がまとめられていました。
https://public.opendatasoft.com/
都市情報はこちら。
https://public.opendatasoft.com/explore/dataset/geonames-all-cities-with-a-population-1000/

下記「Whole dataset」のリンクを右クリックでコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/347bd8de-06d8-602c-f433-f7c2a95334d7.png)

PowerBIの「新しいソース」⇒「WEB」で先ほどコピーしたリンクをペーストして「OK」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/b0055d4a-0939-439e-c689-578a2cfacd7b.png)

うまくいくと下記の様に展開されるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/b7c7d20e-0443-9c99-adf7-44f9b7a54c9f.png)

「列の追加」⇒「カスタム列」で下記のM言語を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/c39c05bb-e918-4963-f253-515efe77b421.png)

コードはこちら。緯度経度を10度ずつブロックした「範囲」に適合するかどうかを検証する9桁のキーとなります。
`Text.PadStart(Number.ToText(Number.Round([coordinates.lon],-1)),5,"0")&Text.PadStart(Number.ToText(Number.Round([coordinates.lat],-1)),4,"0")`

「変換」⇒「グループ化」から下記の様にグループ化を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/0618dc04-2a23-73d0-fdb8-381d641bb3d0.png)
上記にあるグループ化の「すべての行」はM言語を使う上でとても重要な基礎技術になります。マスターする価値が大きいのでご存じない方は是非お試しください。

次にこのようにフィルタリングします。この意味は「緯度経度10度毎にまとめたブロックの中で、最大人口が10万人未満の都市しか有していないエリアのみ抽出する」ことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/b87a5583-fa15-9226-d500-da17463a69c5.png)

先ほど「すべての行」として格納したデータを展開します。
私の好みの展開を下図に記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/6b7cdc15-b553-25cb-fa0f-8a430d0a4082.png)
)

下図2列は割と邪魔なので「列の削除」で消してしまいましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/80f39d89-5171-d817-2c9b-900f258390b3.png)

ここまでの作業で「緯度経度を10度毎にブロック化したグループのうち、人口10万人未満の都市しか存在していないブロックを抽出」できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/e4c3b4a3-d6ed-765e-b19f-c3740c70399c.png)

今作成したクエリを下図のように「複製」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/93042a6d-03e7-0898-b494-240167c017d4.png)
（編集の都合上すでに複製されてますが優しい目で見てやってください）

複製されたクエリは「人口10万人以上の都市のみで構成されたクエリ」としたいので、グループ化の前に「10万人以上」でフィルター処理を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/80a78db6-b7f3-db3d-96c3-de3196a2a033.png)
（当然、グループ化の後のフィルター処理は消去してください）

ここまでの流れで「緯度経度を10度毎にブロック化したグループのうち、人口10万人未満の都市しか存在していない具ブロック群」と「緯度経度を10度毎にブロック化したグループのうち、人口10万人以上の都市で構成されたブロック群」の二つが作成できました。この二つを作る理由は、地方の緯度経度情報を取得した際、最寄りの都市がわからないという確率を最小限に下げつつ、効率よく最寄りの都市を探すための下地作りとなります。


「クエリの追加」⇒「クエリを新規クエリとして追加」を選択します。新規クエリとして追加するのはそのほうがわかりやすいと私が感じただけですので、今のクエリに追加してしまっても別段問題はありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/7572895a-fa62-8d2e-c724-166b6fa9a2a5.png)

二つのクエリを合流させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832168/1d695917-c53f-9284-a324-2ea43a30c085.png)

ここまでが下準備。次のステップとして、実際の緯度経度から「最寄りの都市」をM言語で抽出する方法を別の記事で記載する予定です。