地域メッシュとメッシュコード

GIS

地域メッシュとは

地域メッシュとは、緯度・経度を基準に地域を隙間なく網の目(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;
}

コメント

タイトルとURLをコピーしました