C-square 一種經緯度轉換器,把經緯度轉換成單一個表示方式
如 經度南緯 42.85度 且緯度為東經147.28度
CS表示方式則為:3414:227:3 (經準度為0.5度square)
則3414:227:3 轉為經緯則是 -42.75,147.25
優點:
用這樣好處就是在資料庫儲存可以少一欄位
查詢時比相對加速,且不會有看錯正負號及統一表示方法的好處
缺點:
精準度不夠高,且沒有直觀性,一但經過轉換成CS表示法,
你一定要再轉回去你才比較容易去判讀。
此類數值轉換我用在我幫忙公司建置的海上系統上。
附上最簡易的python代碼:
math.fabs 為絕對值
math.trunc 為去掉小數
def Csqure(n, la, lo): #N是精準度,la、lo是緯度、精度,分別以正負浮點數表示
result = ""
bla = (math.trunc((math.fabs(la) + 10) / 100)) * 0.000001
blo = (math.trunc((math.fabs(lo) + 20) / 200)) * 0.000001
fabsla = math.fabs(la) - bla
fabslo = math.fabs(lo) - blo
s1 = 4 - (((2 * math.trunc(1 + (lo / 200))) - 1) * ((2 * math.trunc(1 + (la / 200))) + 1))
s2 = math.trunc(fabsla / 10)
s3 = math.trunc(fabslo / 10)
ss1 = s1 * 1000 + s2 * 100 + s3
result += str(ss1) + ":"
la = round(fabsla - (s2 * 10), 7)
lo = round(fabslo - (s3 * 10), 7)
s4 = (2 * math.trunc(la * 0.2)) + math.trunc(lo * 0.2) + 1
result += str(s4)
s5 = math.trunc(la)
result += str(s5)
s6 = math.trunc(lo)
result += str(s6) + ":"
la = round((la - s5) * 10, 7)
lo = round((lo - s6) * 10, 7)
s7 = (2 * math.trunc(la * 0.2)) + math.trunc(lo * 0.2) + 1
result += str(s7)
if n == 0.5:
return result
s8 = math.trunc(la)
result += str(s8)
s9 = math.trunc(lo)
result += str(s9)
return result
#版權為張怡臻撰寫由MRcoding轉為python
C#版本:
public static string csquare(double n, double la, double lo)
{
string result = "";
double bla = (Math.Truncate((Math.Abs(la) + 10) / 100)) * 0.000001;
double blo = (Math.Truncate((Math.Abs(lo) + 20) / 200)) * 0.000001;
double absla = Math.Abs(la) - bla;
double abslo = Math.Abs(lo) - blo;
double s1 = 4 - (((2 * Math.Truncate(1 + (lo / 200))) - 1) * ((2 * Math.Truncate(1 + (la / 200))) + 1));
//result += s1.ToString();
double s2 = Math.Truncate(absla / 10);
//result += s2.ToString();
double s3 = Math.Truncate(abslo / 10);
double ss1 = s1 * 1000 + s2 * 100 + s3;
result += ss1.ToString() + ":";
la = Math.Round(absla - (s2 * 10), 7);
lo = Math.Round(abslo - (s3 * 10), 7);
double s4 = (2 * Math.Truncate(la * 0.2)) + Math.Truncate(lo * 0.2) + 1;
result += s4.ToString();
double s5 = Math.Truncate(la);
result += s5.ToString();
double s6 = Math.Truncate(lo);
result += s6.ToString() + ":";
la = Math.Round((la - s5) * 10, 7);
lo = Math.Round((lo - s6) * 10, 7);
double s7 = (2 * Math.Truncate(la * 0.2)) + Math.Truncate(lo * 0.2) + 1;
result += s7.ToString();
if (n == 0.5)
return result;
double s8 = Math.Truncate(la);
result += s8.ToString();
double s9 = Math.Truncate(lo);
result += s9.ToString();
return result;
//#版權為張怡臻撰寫
}
英文更精準的解釋CSQ 跟算式:
點此下載
@copyright MRcodingRoom
觀看更多文章請點MRcoding筆記
觀看更多文章請點MRcoding筆記
Math.Truncate(NUM) 太長了
直接用 (int) NUM 轉型更方便
def Csqure(n, la, lo):
# N 是精度、la 是緯度、lo 是經度,分別以正負浮點數表示
result = “”
abs_la = abs(la) – int(abs(la) / 100) * .000001
abs_lo = abs(lo) – int(abs(lo) / 200) * .000001
result+= str(
(4 – (((2 * int(1 + (lo / 200))) – 1 ) * ((2 * int(1 + (la / 200))) + 1))) * 1000
+ int(abs_la / 10) * 100
+ int(abs_lo / 10)) + “:”
la = round(abs_la – int(abs_la / 10) * 10, 7)
lo = round(abs_lo – int(abs_lo / 10) * 10, 7)
result+= str(2 * int(la * .2) + int(lo * .2) + 1) + str(int(la)) + str(int(lo)) + “:”
la = round((la – int(la)) * 10, 7)
lo = round((lo – int(lo)) * 10, 7)
result+= str((2 * int(la * .2)) + int(lo * .2) + 1)
if n == .5: return result
return result + str(int(la) + int(lo))
print(Csqure(.5, -42.75, 147.25)) # 精度 0.5、南緯 42.75、東經 147.25,得 3414:227:3
# 張怡臻 撰寫
# MRcoding 轉 python
# 呂豪笙 優化
乾蝦笙哥