地图分幅计算 之二 新图幅号计算及实现(C++)

在了解了新旧图幅号的基础之后,就可以开始图幅号的计算了,本文是用C++编写。

在知道比例尺后,经度和维度的差值是确定的,如下表所示:

比例尺1:100万1:5万1:25万1:10万1:5万1:2.5万1:1万1:5千
经差6.03.01.50.50.250.1250.06250.03125
纬差4.02.01.01.0/3.01.0/6.01.0/12.01.0/24.01.0/48.0

经纬差及对应的比例尺关系:

	detlon[0]=6.0;
	detlon[1]=3.0;
	detlon[2]=1.5;
	detlon[3]=0.5;
	detlon[4]=0.25;
	detlon[5]=0.125;
	detlon[6]=0.0625;
	detlon[7]=0.03125;

	detlat[0]=4.0;
	detlat[1]=2.0;
	detlat[2]=1.0;
	detlat[3]=1.0/3.0;
	detlat[4]=1.0/6.0;
	detlat[5]=1.0/12.0;
	detlat[6]=1.0/24.0;
	detlat[7]=1.0/48.0;

	nsubblock[0]=1;
	nsubblock[1]=2;
	nsubblock[2]=4;
	nsubblock[3]=12;
	nsubblock[4]=24;
	nsubblock[5]=48;
	nsubblock[6]=96;
	nsubblock[7]=192;

1.由经纬度、比例尺计算图幅号

stMapNumber CMapSubdivision::MapNumbering(double lon, double lat, int scale)
{
	int a,b,c,d;
	double dlat,dlon;
	stMapNumber mapnumber;

	dlat=detlat[scale];
	dlon=detlon[scale];
	a=INT(lat/4.0)+1;
	b=INT(lon/6.0)+31;
	c=4.0/dlat-INT(RES(lat,4.0)/dlat);
	d=INT(RES(lon,6.0)/dlon)+1;

	mapnumber.nlat=a;
	mapnumber.nlon=b;
	mapnumber.scale=scale;
	mapnumber.nsublat=c;
	mapnumber.nsublon=d;

	return mapnumber;
}

CString	CMapSubdivision::MapNumber2String(stMapNumber mapnumber)
{
	CString sa,sc,sb,sd,sscale,sresult;
	int a,b,c,d,scale;
	char ctemp;

	a=mapnumber.nlat;
	b=mapnumber.nlon;
	c=mapnumber.nsublat;
	d=mapnumber.nsublon;
	scale=mapnumber.scale;

	ctemp='A'+a-1;
	sa=ctemp;

	if(b<10)
		sb.Format(_T("0%d"),b);
	else
		sb.Format(_T("%d"),b);

	ctemp='A'+scale;
	sscale=ctemp;

	if(c<10)
		sc.Format(_T("00%d"),c);
	else if(c<100)
		sc.Format(_T("0%d"),c);
	else
		sc.Format(_T("%d"),c);

	if(d<10)
		sd.Format(_T("00%d"),d);
	else if(d<100)
		sd.Format(_T("0%d"),d);
	else
		sd.Format(_T("%d"),d);

	if(scale>0)
		sresult=sa+sb+sscale+sc+sd;
	else
		sresult=sa+sb;

	return sresult;	
}

2.计算四角点坐标

bool CMapSubdivision::MapNumber2Val(stMapNumber mapnumber, double lon[2], double lat[2])
{
	int a,b,c,d,scale;
	double dlon,dlat;

	if(mapnumber.scale==0)
	{
		a=mapnumber.nlat;
		b=mapnumber.nlon;

		lat[0]=(a-1)*4.0;
		lon[0]=(b-31)*6.0;
		lat[1]=lat[0]+4.0;
		lon[1]=lon[0]+6.0;
	}
	else if(mapnumber.scale>0&&mapnumber.scale<8)
	{
		a=mapnumber.nlat;
		b=mapnumber.nlon;
		scale=mapnumber.scale;
		c=mapnumber.nsublat;
		d=mapnumber.nsublon;
		dlat=detlat[scale];
		dlon=detlon[scale];
		lat[0]=(a-1)*4.0+(4.0/dlat-c)*dlat;
		lon[0]=(b-31)*6.0+(d-1)*dlon;
		lat[1]=lat[0]+dlat;
		lon[1]=lon[0]+dlon;
	}
	else
	{
		smartlog<<"mapnumber.scale取值有误!";
		return false;
	}
	return true;
}

bool  CMapSubdivision::MapString2Val(CString mapstring, double lon[2], double lat[2])//将地图分幅号转化为地图四个角点的坐标
{
	stMapNumber mapnumber;
	mapnumber=String2MapNumber(mapstring);//将图幅号字符串转化为自定义的地图结构体
	return MapNumber2Val(mapnumber, lon, lat);//将地图结构体转化为四个角点坐标
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值