twitter facebook

[SQL]緯度経度から地図のメッシュコードを計算するSQL

メッシュコードとは地図を緯度経度ではなく番号でする手法です。粒度があり、1次メッシュ80km四方、2次メッシュは10km四方、3次メッシュは1km四方 のメッシュという感じです。以下に横浜駅の緯度経度(35.4660694,139.6226196)でメッシュコードを計算したSQLの例を紹介します。詳細は 総務省統計局・地域メッシュ統計 から 説明が記載されている PDF などDLできます。 他にも市町村区の3次のメッシュコードのCSVもあります。
横浜駅付近の3次メッシュの例

1次メッシュ

辺の長さ
約80km
経度差
1度
緯度差
40分
基準
東経100度、北緯0度 (ざっくりいうとシンガポールあたり)
SELECT
    CONCAT(
      CAST(CAST(floor(35.4660694*60/40) AS SIGNED) AS CHAR),
      CAST(CAST(floor(139.6226196-100) AS SIGNED) AS CHAR)
    ) AS mesh_code
メッシュコード
5339
1次メッシュの考え方としては、シンプルで
35.4660694 の場合 35.4660694x1.5 → 53.1991 → 53
139.622619 の場合 39
となり、CONCATした 5339 がメッシュコードとなります。東京周辺は 5339、札幌周辺は6441 という感じです。

2次メッシュ

辺の長さ
約10km *1次メッシュの8等分
経度差
7分30秒
緯度差
5分
SELECT
    CONCAT(
      CAST(CAST(floor( 35.4660694*60/40) AS SIGNED) AS CHAR),
      CAST(CAST(floor(139.6226196-100) AS SIGNED) AS CHAR),
      CAST(CAST(floor(( 35.4660694*60)@/5) AS SIGNED) AS CHAR),
      CAST(CAST(floor((139.6226196-floor(139.6226196))*60/7.5) AS SIGNED) AS CHAR)
    ) AS mesh_code
メッシュコード
533914
2次メッシュは 1次メッシュが 5339 であればそこの 左下から北に何番目、東に何番目 という感じの符号のつけ方です(0が始点なのでN+1番目)。533914 の場合は 左下から上方向に 0,1番目、右方向に 0,1,2,3,4番目 という感じです。以降3次メッシュなどはおなじのりで粒度をよくしていくかんじです。

3次メッシュ

辺の長さ
約1km *2次メッシュの10等分
経度差
45秒
緯度差
30秒
SELECT
    CONCAT(
      CAST(CAST(floor(35.4660694*60/40) AS SIGNED) AS CHAR),
      CAST(CAST(floor(139.6226196-100) AS SIGNED) AS CHAR),
      CAST(CAST(floor((35.4660694*60)@/5) AS SIGNED) AS CHAR),
      CAST(CAST(floor((139.6226196-floor(139.6226196))*60/7.5) AS SIGNED) AS CHAR),
      CAST(CAST(floor(((35.4660694*60)@)%5*60/30) AS SIGNED) AS CHAR),
      CAST(CAST(floor(((139.6226196-floor(139.6226196))*60)%7.5*60/45) AS SIGNED) AS CHAR)
    ) AS mesh_code
メッシュコード
53391459

500m四方のメッシュ

4次メッシュといっても差し支えないようです。3次メッシュの半分のメッシュです。
辺の長さ
約500m
経度差
22.5秒
緯度差
15秒
SELECT
    CONCAT(
      CAST(CAST(floor(35.4660694*60/40) AS SIGNED) AS CHAR),
      CAST(CAST(floor(139.6226196-100) AS SIGNED) AS CHAR),
      CAST(CAST(floor((35.4660694*60)@/5) AS SIGNED) AS CHAR),
      CAST(CAST(floor((139.6226196-floor(139.6226196))*60/7.5) AS SIGNED) AS CHAR),
      CAST(CAST(floor(((35.4660694*60)@)%5*60/30) AS SIGNED) AS CHAR),
      CAST(CAST(floor(((139.6226196-floor(139.6226196))*60)%7.5*60/45) AS SIGNED) AS CHAR),
      CAST(CAST(floor(((35.4660694*60)@)%5*600/15)*2 + floor(((139.6226196-floor(139.6226196))*60)%7.5*60E/22.5)+1 AS SIGNED) AS CHAR)
    ) AS mesh_code
1桁だけ増えます
533914594

備考

上記は mysql用ですが、postgreSQL で使う場合は SIGNED を INTEGER、CHAR を VARCHAR にすれば使えると思います。
AUTHOR
@えのえの
最終更新日 2021/05/05
FAVORITE good stock
LINK TAG
記法を見る