梅登黑德定位系統(tǒng),也是大家常說的業(yè)余無線電網(wǎng)格定位系統(tǒng),可以用來電臺間互相報告各自的位置。該系統(tǒng)因1980年業(yè)余無線電VHF管理人員在英國倫敦附近的梅登黑德開會時被提出而得名。這是一種利用4或6個字符即可報告電臺精確位置的方法。通過使用該方法可以讓一些設(shè)立在非著名城市的電臺在報告位置時不用過多解釋自己的位置信息,同時也避免了通過經(jīng)緯度來報送自己位置時的一長串?dāng)?shù)字,在CW時 發(fā)送抄收數(shù)字更加不易。(以上整理自 《業(yè)余無線電通信》第四版 P30)
1 梅登黑德網(wǎng)格編碼
該格網(wǎng)系統(tǒng)將全球分為三級:場(field)、方(square)、塊(block)。
場的定義為:將全球剖分為18x18個區(qū)域,按照經(jīng)差20,緯差10度作為一個場的大小,使用字母A~R表示。
方的定論為:將一個場內(nèi)部再劃分為10*10個相樣間隔的區(qū)域,每個方的經(jīng)差為2度緯差為1度,使用數(shù)字 0~9表示。
塊的定義為:在每一個方的內(nèi)部再按 5秒x2.5秒劃分為24x24個區(qū)域,使用字母A~X表示。
可以看到該定位系統(tǒng)使用6位定位時,可以表示約10公里x5公里的范圍(精細(xì)定位);在使用4位定位時可以表示約220公里*110公里的范圍(國家或省份級別的定位)。
1.1 位置->編碼
《業(yè)余無線電通信》一書中在P31 給出了由經(jīng)緯度算出格網(wǎng)編號的BASIC程序,在當(dāng)今這個時代很難找到曾經(jīng)紅極一時的BASIC環(huán)境了。但時代的發(fā)展給了我們更多更好的選則,今天我們就使用瀏覽器環(huán)境來重新實現(xiàn)書中描述的功能。
通過經(jīng)緯度坐標(biāo),按照三個級別分別算出各個位上的字符。
function index2Char(idx) {
return String.fromCharCode('A'.charCodeAt(0) + idx);
}
/**
通過經(jīng)緯度獲取梅登黑德格網(wǎng)編號
*/
function getCode(lon, lat) {
// 計算場(field)
let field1 = Math.floor((180 + lon) / 20);
let field2 = Math.floor((90 + lat) / 10);
console.log(`${field1}-${field2}`);
let Field = index2Char(field1) + index2Char(field2);
console.log(Field);
// 計算方(square)
let square1 = Math.floor(Math.floor(lon + 180) % 20 / 2);
let square2 = Math.floor(lat + 90) % 10;
let code = Field + square1 + square2;
// 計算塊
let block1 = Math.floor((lon - Math.floor(lon / 2) * 2) * 60 / 5);
let block2 = Math.floor((lat - Math.floor(lat)) * 60 / 2.5);
console.log(`${block1} - ${block2}`);
code = code + index2Char(block1) + index2Char(block2);
console.log(code);
return code;
}
其中主要用到了向下取整Math.floor、除(/)、取余(%)三種操作,另外使用輔助方法 index2Char將序號轉(zhuǎn)換為A~X的字母,相信大家不難理解上面翻譯后的實現(xiàn)。
1.2 編碼->位置(范圍)
另一個場景是大家抄收到對方電臺梅登黑德編號時想要定位對方電臺的位置。
這時我們需要反向計算,得出該編號相應(yīng)的范圍。
/**
根據(jù)梅登黑德編號得出范圍
*/
function getBound(code) {
let lon = char2Index(code[0]) * 20 + code[2] * 2 + char2Index(code[4]) * 5 / 60 - 180;
let lat = char2Index(code[1]) * 10 + code[3] *1 + char2Index(code[5]) * 2.5 / 60 - 90;
return [lon, lat, lon + 5 / 60, lat + 2.5 / 60];
}
基于編號和格網(wǎng)劃分的三級經(jīng)緯差,即可算出編號格網(wǎng)的錨點(左下角點),然后通過一個塊的大小5x2.5秒,得出一個6位梅登黑德塊對應(yīng)的地理范圍了。
如果我們就在這里結(jié)束,那我們并沒有走的比書上的遠(yuǎn),只是為那段內(nèi)容找了一個新的宿主,廣大無線電愛好者還是很難用上,畢竟拿到經(jīng)緯度不是那么直接(用智能手機的羅盤是可以,但在使用遠(yuǎn)程電臺時,我們并不在電臺的附近)。
我們可以借助地址編碼技術(shù)來解決這一問題。
2 地址編碼
地址編碼是將地址變換為位置的過程,這里我們使用百度的地址編碼服務(wù),將地名轉(zhuǎn)換為位置,方便我們通過地址得到位置。
var button = document.getElementById('btn_query');
button.addEventListener('click', () => {
const usr_input = document.getElementById('address').value;
var myGeo = new BMap.Geocoder();
myGeo.getPoint(usr_input, function (point) {
if (point) {
map.centerAndZoom(point, 12);
let marker = new BMap.Marker(point);
let mcode = getCode(point.lng, point.lat);
let grid_bound = getBound(mcode);
console.log(grid_bound);
var pStart = new BMap.Point(grid_bound[0], grid_bound[1]);
var pEnd = new BMap.Point(grid_bound[2],grid_bound[3]);
var grid_rectangle = new BMap.Polygon([
new BMap.Point(pStart.lng, pStart.lat),
new BMap.Point(pEnd.lng, pStart.lat),
new BMap.Point(pEnd.lng, pEnd.lat),
new BMap.Point(pStart.lng, pEnd.lat)
], { strokeColor: "blue", strokeWeight: 2, strokeOpacity: 0.5 }); //創(chuàng)建矩形
map.addOverlay(grid_rectangle);
var label = new BMap.Label(usr_input + '<br>' + mcode, { offset: new BMap.Size(20, 0) });
marker.setLabel(label);
map.addOverlay(marker);
console.log(mcode);
} else {
alert("您選擇地址沒有解析到結(jié)果!");
}
});
});
結(jié)合地圖使用,我們可以用很方便的接口獲取地址對應(yīng)的經(jīng)緯度,這樣就可以使我們快速的得到地址的梅登黑德格網(wǎng)編號了,我們同時框出了該格網(wǎng)對應(yīng)的范圍。
在線示例
