SmartStone's Technical Blog

天下没有免费的午餐,即使有,那也是有毒的!
posts - 150, comments - 96, trackbacks - 2, articles - 1

//char *MapNo:图幅号

 //int lon_deg:经度-度

//lon_min:经度-分

//lon_sec:经度-秒

//lat_deg:纬度-度

//lat_min:纬度-分

//lat_sec:纬度-秒

//long lscale:比例尺

bool Trans(char *MapNo,int lon_deg,lon_min,lon_sec,lat_deg,lat_min,lat_sec,long lscale)

{  
    int ScaleID;
    char buf[10];
    char S[] = "ABCDEFGHIJKLMNOPQRSTUV"; // 1:1000000地形图图幅所在纬度带字符码
    long Scale[] = {1000000,500000,250000,100000,50000,25000,10000,5000}; // 图幅比例尺
    double df[] = {14400,7200,3600,1200,600,300,150,75}; // 图幅纬差,单位秒
    double dr[] = {21600,10800,5400,1800,900,450,225,112.5}; // 图幅经差单位秒
    long r=lon_deg*3600+lon_min*60+lon_sec; // 经度, 单位秒
    long f=lat_deg*3600+lat_min*60+lat_sec; // 纬度单位秒
    for(ScaleID=0;ScaleID<8;ScaleID++){
        if(Scale[ScaleID]==lscale){
            break;
        }
    }
    if(ScaleID==8){
        return false;
    }
    int a = f/(4*3600);
    int b = r/(6*3600)+31;
    int c = (int)(4*3600/df[ScaleID])-(int)((f%(4*3600))/df[ScaleID]);
    int d = (int)((r%(6*3600))/dr[ScaleID])+1;
    MapNo[0] = S[a];
    strcpy(MapNo+1,itoa(b,buf,10));
    if(ScaleID==0){
        return true;
    }
    MapNo[3] = S[ScaleID];
    itoa(c,buf,10);
    if(c<10){
        MapNo[4]=MapNo[5]='0';
        strcpy(MapNo+6,buf);
    }else if(c<100) {
        MapNo[4]='0';
        strcpy(MapNo+5,buf);}
    else if(c<1000){
        strcpy(MapNo+4,buf);
    }else{
        return false;
    }
    itoa(d,buf,10);
    if(d<10){
        MapNo[7]=MapNo[8]='0';
        strcpy(MapNo+9,buf);
    }else if(d<100) {
        MapNo[7]='0';
        strcpy(MapNo+8,buf);
    }else if(d<1000){
        strcpy(MapNo+7,buf);
    }else{
        return false;
    }
    MapNo[10] = '"0';
    return true;
}