0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

地域メッシュコードと緯度経度の相互変換

Posted at

地域メッシュとは、統計に利用するために、緯度・経度に基づいて日本国内をほぼ同じ大きさの網の目(メッシュ)に分けたものです

地域メッシュ統計(総務省統計局)
https://www.stat.go.jp/data/mesh/index.html

粗いほうから第1次メッシュ、第2次メッシュ、第3次メッシュ、2分の1地域メッシュ、4分の1地域メッシュ、8分の1地域メッシュの6段階があり、もっとも細かい8分の1地域メッシュでは約125m四方ごとに地域を表すことができます

地域メッシュ統計の特質・沿革(総務省統計局)
https://www.stat.go.jp/data/mesh/pdf/gaiyo1.pdf

以下にJavaScriptで緯度経度と地域メッシュコードを相互変換するコードを示します

緯度経度 → 地域メッシュコード

latlonToMeshcode
function latlonToMeshcode( lat, lon){
  let meshCode = ("0" + Math.floor(lat*3/2)).slice(-2) + 
                   ("0" + Math.floor(lon*1)).slice(-2) + 
                   Math.floor( lat*12 % 8) + 
                   Math.floor( lon*8 % 8) + 
                   Math.floor( lat*120 % 10) + 
                   Math.floor( lon*80 % 10) + 
                   ( Math.floor( lat*240 % 2) * 2 + Math.floor( lon*160 % 2) + 1) +
                   ( Math.floor( lat*480 % 2) * 2 + Math.floor( lon*320 % 2) + 1) +
                   ( Math.floor( lat*960 % 2) * 2 + Math.floor( lon*640 % 2) + 1);
  return meshCode;
}

1次メッシュコードの場合は出力結果の上4桁を、2次メッシュコードの場合は上6桁を、3次メッシュコードの場合は上8桁を、2分の1地域メッシュコードの場合は上9桁を、4分の1地域メッシュコードの場合は上10桁を、8分の1地域メッシュコードの場合は上11桁すべてを使用してください

地域メッシュコード → 緯度経度

meshcodeToLatlon
function meshcodeToLatlon( meshCode){
  meshCode = meshCode.replace(/\-/g,"");
  let lat = 0, lon = 100;
  if( meshCode.length >= 4){
    lat = lat + meshCode.substring(0,2) / 1.5;
    lon = lon + meshCode.substring(2,4) * 1;
  }
  if( meshCode.length >= 6){
    lat = lat + meshCode.substring(4,5) / 12;
    lon = lon + meshCode.substring(5,6) / 8;
  }
  if( meshCode.length >= 8){
    lat = lat + meshCode.substring(6,7) / 120;
    lon = lon + meshCode.substring(7,8) / 80;
  }
  if( meshCode.length >= 9){
    lat = lat + Math.floor((meshCode.substring(8,9)-1)/2) / 240;
    lon = lon + (meshCode.substring(8,9)-1)%2 / 160;
  }
  if( meshCode.length >= 10){
    lat = lat + Math.floor((meshCode.substring(8,9)-1)/2) / 480;
    lon = lon + (meshCode.substring(8,9)-1)%2 / 320;
  }
  if( meshCode.length >= 11){
    lat = lat + Math.floor((meshCode.substring(8,9)-1)/2) / 960;
    lon = lon + (meshCode.substring(8,9)-1)%2 / 640;
  }
  return {"lat":lat, "lon":lon};
}

各地域メッシュコードの南西端の緯度経度を返します。60進法(度・分・秒)から10進法(度)への変換は含みません

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?