作成
[SQL]緯度経度から地図のメッシュコードを計算するSQL
メッシュコードとは地図を緯度経度ではなく番号でする手法です。粒度があり、1次メッシュ80km四方、2次メッシュは10km四方、3次メッシュは1km四方 のメッシュという感じです。以下に横浜駅の緯度経度(35.4660694,139.6226196)でメッシュコードを計算したSQLの例を紹介します。詳細は 総務省統計局・地域メッシュ統計(http://www.stat.go.jp/data/mesh/) から 説明が記載されている PDF(http://www.stat.go.jp/data/mesh/pdf/gaiyo1.pdf) などDLできます。 他にも市町村区の3次のメッシュコードのCSV(https://www.stat.go.jp/data/mesh/m_itiran.html)もあります。 ###center (横浜駅付近の3次メッシュの例) (img://18/321m) ###title 1次メッシュ ###dl - 辺の長さ -- 約80km - 経度差 -- 1度 - 緯度差 -- 40分 - 基準 -- 東経100度、北緯0度 (ざっくりいうとシンガポールあたり) ###source 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 ###ret (メッシュコード) 5339 ###memo 1次メッシュの考え方としては、シンプルで 35.4660694 の場合 35.4660694x1.5 → 53.1991 → #+*#53 139.622619 の場合 #+*#39 となり、CONCATした 5339 がメッシュコードとなります。東京周辺は 5339、札幌周辺は6441 という感じです。 ###title 2次メッシュ ###dl - 辺の長さ -- 約10km *1次メッシュの8等分 - 経度差 -- 7分30秒 - 緯度差 -- 5分 ###source 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 ###ret (メッシュコード) 533914 ###memo 2次メッシュは 1次メッシュが 5339 であればそこの #+*#左下から北に何番目、東に何番目 という感じの符号のつけ方です(0が始点なのでN+1番目)。5339#_#14 の場合は 左下から上方向に 0,1番目、右方向に 0,1,2,3,4番目 という感じです。以降3次メッシュなどはおなじのりで粒度をよくしていくかんじです。 ###title 3次メッシュ ###dl - 辺の長さ -- 約1km *2次メッシュの10等分 - 経度差 -- 45秒 - 緯度差 -- 30秒 ###source 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 ###ret (メッシュコード) 53391459 ###title 500m四方のメッシュ ### 4次メッシュといっても差し支えないようです。3次メッシュの半分のメッシュです。 ###dl - 辺の長さ -- 約500m - 経度差 -- 22.5秒 - 緯度差 -- 15秒 ###source 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 ###ret (1桁だけ増えます) 533914594 ###title 備考 ### 上記は mysql用ですが、postgreSQL で使う場合は SIGNED を INTEGER、CHAR を VARCHAR にすれば使えると思います。 ###disable メッシュコードから緯度経度 https://qiita.com/YujiHamada3/items/e1ca2b474b919396136c 緯度経度はメッシュの南西端(左下) function mash2latlng1(mesh_code) { var lat = mesh_code.slice(0, 2); var lon = mesh_code.slice(2, 4); return [(parseInt(lon) + 100) * 3600, lat / 1.5 * 3600] // 3600をかけて秒に直す function mash2latlng2(mesh_code) { var lat = mesh_code.slice(4, 5); var lon = mesh_code.slice(5, 6); return [lon * 7.5 * 60, lat * 5 * 60] // 60をかけて秒に直す } function mash2latlng3(mesh_code) { var lat = mesh_code.slice(6, 7); var lon = mesh_code.slice(7, 8); return [lon * 45, lat * 30] } function mash2latlng4(mesh_code) { let forth = mesh_code.slice(8, 9); let lat; let lon; if (is_south(forth)) { lat = 0 } else { lat = 15 } if (is_west(forth)) { lon = 0; } else { lon = 22.5; } return [lon, lat]; } var upper_lat = lat + 3.75/3600; var right_log = lon + 5.625/3600; }
wakatta 記法
投稿の仕方
基本的な記法
エンジニア向け記法
記法のサンプル
このコンテンツを見る