最近项目中需要一个使用经纬度计算图幅号的功能,在网上找了一个C语言版的代码,翻译成了ActionScript。
package map
{
public class MapSheetTool
{
private static const LatCharArray:Array = ['A','B','C','D','E','F','G','H','I','J','K'
,'L','M','N','O','P','Q','R','S','T','U','V'];
private static const scaleArray:Array = [1000000,500000,250000,100000,50000,25000,10000,5000]; // 图幅比例尺
private static const latDArray:Array = [14400,7200,3600,1200,600,300,150,75]; // 图幅纬差,单位秒
private static const lonDArray:Array = [21600,10800,5400,1800,900,450,225,112.5]; // 图幅经差单位秒
public static const SCALE_1000000:Number= 0;
public static const SCALE_500000:Number = 1;
public static const SCALE_250000:Number = 2;
public static const SCALE_100000:Number = 3;
public static const SCALE_50000:Number = 4;
public static const SCALE_25000:Number = 5;
public static const SCALE_10000:Number = 6;
public static const SCALE_5000:Number = 7;
public function MapSheetTool()
{
}
/**
* @param lat:纬度 10进制表示
* @param lon:经度 10进制表示
* @param scaleID 比例尺编号(0-7) 可以使用 MapSheet.SCALE_1000000,MapSheet.SCALE_500000...输入
*/
public static function getSheetNumber(lat:Number,lon:Number,scaleID:Number):String{
var f:Number = lat*3600;//以秒表示的纬度
var r:Number = lon*3600;//以秒表示的经度
var MapNo:Array = new Array(10);
var numString:String = "";
var a:int = f/(4*3600); //纬度序号
var b:int = r/(6*3600)+31; //经度序号
var c:int = (int)(4*3600/latDArray[scaleID])-(int)((f%(4*3600))/latDArray[scaleID]); //在1:1000000万图幅中的序号 纬度
var d:int = (int)((r%(6*3600))/lonDArray[scaleID])+1; //在1:1000000万图幅中的序号 经度
numString += LatCharArray[a];
numString += ""+b;
if(scaleID==0){ //1:1000000万
return numString;
}
numString +=LatCharArray[scaleID];
if(c<10){
numString+="00";
numString+=c;
}else if(c<100)
{
numString +="0";
numString+=c;
}
else if(c<1000)
{
numString += c;
}else{
return "";
}
if(d<10){
numString +="00";
numString +=d;
}else if(d<100) {
numString +="0";
numString+=d;
}else if(d<1000){
numString +=d;
}else{
return "";
}
return numString;
}
}
}