地域メッシュとは
地域メッシュとは、緯度・経度を基準に地域を隙間なく網の目(Mesh)状に区切ったそれぞれの区域を意味します。
範囲を図に示します。
メッシュコードとは
メッシュコードとは、メッシュを識別するためのコードを意味します。標準地域メッシュは区分の方法により、大きさの異なるいくつかの区画が定められています。
標準地域メッシュの種類
第1次地域区画(1次メッシュ)
全国の地域を偶数緯度及びその間隔(120分)を3等分した緯度における緯線並びに1度ごとの経線とによって分割してできる区域です。
緯度の間隔:40分
経度の間隔:1度
一辺の長さ:約80㎞
メッシュコードの例:5438
第2次地域区画(2次メッシュ)
第1次地域区画を緯線方向及び経線方向に8等分してできる区域です。
緯度の間隔:5分
経度の間隔:7分 30秒
一辺の長さ:約10㎞
メッシュコードの例:5438-32
第3次地域区画(3次メッシュ)
第2次地域区画を緯線方向及び経線方向に10等分してできる区域です。
緯度の間隔:30秒
経度の間隔:45秒
一辺の長さ:約1㎞
メッシュコードの例:5438-32-43
分割地域メッシュ
2分の1地域メッシュ(4次メッシュ)
基準地域メッシュ(第3次地域区画)を緯線方向、経線方向に2等分してできる区域です。
緯度の間隔:15秒
経度の間隔:22.5秒
一辺の長さ:約500m
メッシュコードの例:5438-32-43-3
4分の1地域メッシュ(5次メッシュ)
2分の1地域メッシュを緯線方向、経線方向に2等分してできる区域です。
緯度の間隔:7.5秒
経度の間隔:11.25秒
一辺の長さ:約250m
メッシュコードの例:5438-32-43-3-3
8分の1地域メッシュ(6次メッシュ)
4分の1地域メッシュを緯線方向、経線方向に2等分してできる区域です。
緯度の間隔:3.75秒
経度の間隔:5.625秒
一辺の長さ:約125m
メッシュコードの例:5438-32-43-3-3-3
その他
3次メッシュの10分の1細分区画(100mメッシュ)
基準地域メッシュ(第3次地域区画)を緯線方向、経線方向に10等分してできる区域です。
緯度の間隔:3秒
経度の間隔:4.5秒
一辺の長さ:約100m
メッシュコードの例:5438-32-43-43
3次メッシュの20分の1細分区画(50mメッシュ)
3次メッシュの10分の1細分区画を緯線方向、経線方向に2等分してできる区域です。
緯度の間隔:1.5秒
経度の間隔:2.25秒
一辺の長さ:約50m
メッシュコードの例:5438-32-43-43-3
メッシュコードの求め方
緯度・経度の数値からメッシュコードを求めます。以下はC言語による求め方の例です。
typedef struct {
int the1stLat; // 第1次地域区画(1次メッシュ)
int the1stLon; // 第1次地域区画(1次メッシュ)
int the2ndLat; // 第2次地域区画(2次メッシュ)
int the2ndLon; // 第2次地域区画(2次メッシュ)
int the3rdLat; // 第3次地域区画(3次メッシュ)
int the3rdLon; // 第3次地域区画(3次メッシュ)
int the4th; // 2分の1地域メッシュ(4次メッシュ)
int the5th; // 4分の1地域メッシュ(5次メッシュ)
int the100mLat; // 3次メッシュの10分の1細分区画(100m メッシュ)
int the100mLon; // 3次メッシュの10分の1細分区画(100m メッシュ)
int the50m; // 3次メッシュの20分の1細分区画(50m メッシュ)
} meshcode;
void getMeshCode(meshcode* mesh, double theLongitude, double theLatitude)
{
double a, b, c, d, e, s, t;
double f, g, h, i, j, x, y;
double l, m, n, o;
mesh->the1stLat = (int)(theLatitude * 1.5);
a = theLatitude * 60.0 - mesh->the1stLat * 40.0;
mesh->the2ndLat = (int)(a / 5);
b = a - mesh->the2ndLat * 5;
mesh->the3rdLat = (int)(b * 2);
c = b * 60.0 - mesh->the3rdLat * 30.0;
s = (int)(c / 15.0);
d = c - s * 15.0;
t = (int)(d / 7.5);
e = d - t * 7.5;
mesh->the100mLat = (int)(c / 3.0);
l = c - mesh->the100mLat * 3.0;
n = (int)(l / 1.5);
mesh->the1stLon = (int)theLongitude - 100; //39
f = theLongitude - (int)theLongitude;
mesh->the2ndLon = (int)(f * 8); //5
g = f * 60 - mesh->the2ndLon * 7.5;
mesh->the3rdLon = (int)(g * 60.0 / 45.0); //7
h = g * 60.0 - mesh->the3rdLon * 45.0;
x = (int)(h / 22.5);
i = h - x * 22.5;
y = (int)(i / 11.25);
j = i - y * 11.25;
mesh->the100mLon = (int)(h / 4.5);
m = h - mesh->the100mLon * 4.5;
o = (int)(m / 2.25);
mesh->the4th = (int)((s * 2) + (x + 1));
mesh->the5th = (int)((t * 2) + (y + 1));
mesh->the50m = (int)((n * 2) + (o + 1));
}
void main(int argc, char* argv[])
{
meshcode code;
getMeshCode(&code, 138.395979, 34.960310);
}
メッシュコードの使い方
メッシュコードからメッシュの4隅の緯度・経度を求めます。以下はC言語による求め方の例です。
void getLonLat(char* meshcode, double* llon, double* llat, double* rlon, double* rlat) {
double lat;
double lon;
double latMargin;
double lonMargin;
if(strlen(meshcode) >= 4){ // 第1次地域区画(1次メッシュ)
lat = substr(meshcode, 0, 2) / 1.5;
lon = substr(meshcode, 2, 2) + 100.0;
latMargin = 40.0 / 60.0;
lonMargin = 1.0;
}else{
return;
}
if(substr(meshcode, 4, 2) != -1){ // 第2次地域区画(2次メッシュ)
lat = lat + substr(meshcode, 4, 1) * 5.0 / 60.0;
lon = lon + substr(meshcode, 5, 1) * 7.5 / 60.0;
latMargin = 5.0 / 60.0;
lonMargin = 1.0 / 8.0;
}
if(substr(meshcode, 6, 2) != -1){ // 第3次地域区画(3次メッシュ)
lat = lat + substr(meshcode, 6, 1) * 0.5 / 60.0;
lon = lon + substr(meshcode, 7, 1) * 0.75 / 60.0;
latMargin = 5.0 / 60.0 / 10.0;
lonMargin = 1.0 / 8.0 / 10.0;
}
if(substr(meshcode, 8, 1) != -1){ // 2分の1地域メッシュ(4次メッシュ)
latMargin = 5.0 / 60.0 / 10.0 / 2.0;
lonMargin = 1.0 / 8.0 / 10.0 / 2.0;
switch (substr(meshcode, 8, 1)){
case 1:
lat = lat;
lon = lon;
break;
case 2:
lat = lat;
lon = lon + lonMargin;
break;
case 3:
lat = lat + latMargin;
lon = lon;
break;
case 4:
lat = lat + latMargin;
lon = lon + lonMargin;
break;
}
}
if(substr(meshcode, 9, 1) != -1){ // 4分の1地域メッシュ(5次メッシュ)
latMargin = 5.0 / 60.0 / 10.0 / 2.0 / 2.0;
lonMargin = 1.0 / 8.0 / 10.0 / 2.0 / 2.0;
switch (substr(meshcode, 9, 1)){
case 1:
lat = lat;
lon = lon;
break;
case 2:
lat = lat;
lon = lon + lonMargin;
break;
case 3:
lat = lat + latMargin;
lon = lon;
break;
case 4:
lat = lat + latMargin;
lon = lon + lonMargin;
break;
}
}
*llon = lon;
*llat = lat;
*rlon = lon + lonMargin;
*rlat = lat + latMargin;
}
コメント