Skip to content

Instantly share code, notes, and snippets.

@kampar
Created September 14, 2020 01:20
Show Gist options
  • Save kampar/49df40a0c996f210554ecd6d6d2ffeb2 to your computer and use it in GitHub Desktop.
Save kampar/49df40a0c996f210554ecd6d6d2ffeb2 to your computer and use it in GitHub Desktop.
Quick and dirty class to create GeoJSON polygon according known RBI / NLP (Nomor Lembar Peta) or Map Sheet Number trying to comply Indonesian National Standard
class RBI{
constructor(rbi){
this.type="Feature";
this.north=0;
this.south=0;
this.west=0;
this.east=0;
this._rbi=rbi;
}
toGeoJSON=function(){
return {
"type": this.type,
"properties":{
"rbi":this._rbi,
"north":this.north,
"south":this.south,
"west":this.west,
"east":this.east
},
"geometry": this.geometry(),
};
}
geometry=function(){
return {
"type":"Polygon",
"coordinates":[
[
[this.west,this.north],
[this.east,this.north],
[this.east,this.south],
[this.west,this.south],
[this.west,this.north]
]
]
};
}
bounds = function(){
return {
"_southWest":{
"lat":this.south,
"lng":this.west
},
"_northEast":{
"lat":this.north,
"lng":this.east
}
}
}
}
/**
* RBI dimulai dengan skala 250 000
* dengan 4 angka:
* 2 angka pertama adalah kolom
* dimulai dengan 90 bujur timur hingga
* 37 untuk 145.5 bujur timur
* ==> rentang 55,5 derjat itu dibagi 37 adalah 1,5 derjat
* 2 angka kedua adalah baris, dengan 01 pada -15 lintang selatan
* semakin ke utara semakin bertambah
* 25 untuk 10 lintang utara
*
* jadi, tinggi satu kotak RBI 250 000 adalah 1 derjat lintang,
* dengan lebar adalah 1,5 derjat bujur.
*/
class RBI250 extends RBI{
constructor(rbi){
super(rbi);
this.north=rbi % 100 -15;
this.south=rbi % 100 -16;
this.west=(Math.round(rbi/100)-1)*1.5+ 90;
this.east=(Math.round(rbi/100)-1)*1.5+ 91.5;
//rbi 250 harus 4 angka Nomor Lembar Peta nya
//padding dengan 0 jika kurang dari 4
//this.rbi250=(''+rbi).padStart(4,'0');
this._rbi=(''+rbi).padStart(4,'0');
}
};
// nah sekarang yang lebih susah, adalah RBI 100
// adalah RBI 250 dibagi 6, masing-masingnya adalah
// setengah derjat x setengah derjat
// dan nomornya adalah dari 1 sampai 6
// dari kiribawah ke kanan lalu ke atas
// 4 5 6
// 1 2 3
class RBI100 extends RBI{
constructor(rbi){
super(rbi);
var _p = new RBI250(Math.floor(rbi/10)); // parent RBI100 kita adalah RBI250
//sekarang baru check digit terakhir, 1 sd 6
var _digitakhir = rbi % 10;
// 1 2 3 maka south nya sama dengan induk
// north nya adalah south induk tambah 0.5 derjat
// 4 5 6 maka north nya sama dengan north induk
// south nya adalah north induk kurang 0.5 ataupun boleh juga south induk tambah 0.5, karena sama saja
// 1 dan 4 west nya sama dengan induk, east nya west induk tambah 0.5
// 2 dan 5, west nya adalah west induk + 0.5
// 3 dan 6, west nya adalah west induk tambah 1 derjat
// 1 dan 4, east adalah west induk + 0.5
// 2 dan 5, east adalah west induk + 1
// 3 dan 6, east nya adalah east induk
//south and north
switch(_digitakhir){
case 1: case 2: case 3:
this.south = _p.south;
this.north = _p.south + 0.5;
break;
case 4: case 5: case 6:
this.south = _p.south + 0.5;
this.north = _p.north;
break;
}
switch(_digitakhir){
case 1: case 4:
this.west = _p.west;
this.east = _p.west + 0.5;
break;
case 2: case 5:
this.west = _p.west + 0.5;
this.east = _p.west + 1;
break;
case 3: case 6:
this.west = _p.west + 1;
this.east = _p .east;
break;
}
this._rbi=(''+Math.floor(rbi/10)).padStart(4,'0')+'-'+(rbi % 10);
}
};
/**
*rbi50 adalah rbi100 dibagi 4
*
* 3 4
* 1 2
*/
class RBI50 extends RBI{
constructor(rbi){
super(rbi);
var _p= new RBI100(Math.floor(rbi/10)); // parent RBI kita
var _digitakhir = rbi % 10;
//south and north
switch(_digitakhir){
case 1: case 2:
this.south = _p.south; // 1 dan 2 sama south dengan induk
this.north = _p.south + 0.25; // 0.25 adalah rentang induk dibagi 2
break;
case 3: case 4:
this.south = _p.south + 0.25;
this.north = _p.north;
break;
}
//sekarang kita hitung west dan east berdasarkan _digitakhir
switch(_digitakhir){
case 1: case 3:
this.west = _p.west;
this.east = _p.west + 0.25;
break;
case 2: case 4:
this.west = _p.west + 0.25;
this.east = _p.east;
break;
}
this._rbi=(''+Math.floor(rbi/100)).padStart(4,'0')+'-'+(rbi % 100);
}
};
/**
* RBI 25 ini mirip dengan pemecahan 100 ke 50
* karena rbi 25 adalah rbi50 dipecah 4,
* bedanya, jarak rbi 50 adalah 0.25 derjat, sedangkan
* rbi 25 jaraknya adalah 0.125 derjat
*/
class RBI25 extends RBI{
constructor(rbi){
super(rbi);
var _p = new RBI50(Math.floor(rbi/10)); // parent RBI kita
var _digitakhir = rbi % 10;
//south and north
switch(_digitakhir){
case 1: case 2:
this.south = _p.south; // 1 dan 2 sama south dengan induk
this.north = _p.south + 0.125; // 0.25 adalah rentang induk dibagi 2
break;
case 3: case 4:
this.south = _p.south + 0.125;
this.north = _p.north;
break;
}
//sekarang kita hitung west dan east berdasarkan _digitakhir
switch(_digitakhir){
case 1: case 3:
this.west = _p.west;
this.east = _p.west + 0.125;
break;
case 2: case 4:
this.west = _p.west + 0.125;
this.east = _p.east;
break;
}
this._rbi=(''+Math.floor(rbi/1000)).padStart(4,'0')+'-'+(rbi % 1000);
}
};
/**
* rbi10 ribu adalah rbi25 ribu dipecah 9
* masing-masing kotak panjangnya 0.125 / 3 derjat atau 15menit/3 = 5 menit
*
* 7 8 9
* 4 5 6
* 1 2 3
*
*/
class RBI10 extends RBI{
constructor(rbi){
super(rbi);
var _p = new RBI25(Math.floor(rbi/10)); // parent RBI kita
var _digitakhir = rbi % 10;
// tahap 1, hitung dulu semua selatan dan utara nya
//south and north
switch(_digitakhir){
case 1: case 2: case 3:
this.south = _p.south;
this.north = _p.south + (0.125/3);
break;
case 4: case 5: case 6:
this.south = _p.south + (0.125/3);
this.north = _p.south + (0.125/3) +(0.125/3);
break;
case 7: case 8: case 9:
this.south = _p.north - (0.125/3);
this.north = _p.north;
break;
}
// 7 8 9
// 4 5 6
// 1 2 3
//east and west
switch(_digitakhir){
case 1: case 4: case 7:
this.west = _p.west;
this.east = _p.west + (0.125/3);
break;
case 2: case 5: case 8:
this.west = _p.west + (0.125/3);
this.east = _p.east - (0.125/3);
break;
case 3: case 6: case 9:
this.west = _p.east - (0.125/3);
this.east = _p.east;
break;
}
this._rbi=(''+Math.floor(rbi/10000)).padStart(4,'0')+'-'+(rbi % 10000);
}
};
/**
* rbi 5 adalah rbi 10 dipecah 4 lagi ...
* ini tidak official, hanya buatan saya saja
* Muhammad Jazman <kampar@gmail.com>
* WA: 0812 1012 7812
* silahkan hubungi saya, jika saya salah
*
* kenapa saya pecah 4?
* karena meniru dari rbi100 ke rbi50
* namun, sekarang jarak antar extents peta adalah (0.125/6)
* atau 0.020833333333333332
* atau 8x0.125/8x6 = 1/48 derjat
*
* 3 4
* 1 2
*
* @param rbi unsigned-integer nomor lembar peta
*/
class RBI5 extends RBI{
constructor(rbi){
super(rbi);
var _p= new RBI10(Math.floor(rbi/10)); // parent RBI kita
var _digitakhir = rbi % 10;
//south and north
switch(_digitakhir){
case 1: case 2:
this.south = _p.south; // 1 dan 2 sama south dengan induk
this.north = _p.south + (0.125/6); // 0.25 adalah rentang induk dibagi 2
break;
case 3: case 4:
this.south = _p.south + (0.125/6);
this.north = _p.north;
break;
}
//sekarang kita hitung west dan east berdasarkan _digitakhir
switch(_digitakhir){
case 1: case 3:
this.west = _p.west;
this.east = _p.west + (0.125/6);
break;
case 2: case 4:
this.west = _p.west + (0.125/6);
this.east = _p.east;
break;
}
this._rbi=(''+Math.floor(rbi/100000)).padStart(4,'0')
+'-'+(Math.floor((rbi % 100000)/10))
+'-'+(rbi % 10);// biar formatnya XXXX-XXXX-X
}
};
/**
* rbi 2500 adalah rbi 5 ribu dipecah 4 lagi ...
* ini juga tidak official, hanya buatan saya saja (kampar@gmail.com)
* WA: 0812 1012 7812
*
* 3 4
* 1 2
*
* akibatnya, rentang kotak kita sekarang adalah 1/48 dibagi 2,
* yaitu 1/96 derjat atau 37.5 detik
*
* @param rbi unsigned-integer nomor lembar peta
*/
class RBI2500 extends RBI{
constructor(rbi){
super(rbi);
var _p = new RBI5(Math.floor(rbi/10)); // parent RBI kita
var _digitakhir = rbi % 10;
//south and north
switch(_digitakhir){
case 1: case 2:
this.south = _p.south; // 1 dan 2 sama south dengan induk
this.north = _p.south + (1/96); // 0.25 adalah rentang induk dibagi 2
break;
case 3: case 4:
this.south = _p.south + (1/96);
this.north = _p.north;
break;
}
//sekarang kita hitung west dan east berdasarkan _digitakhir
switch(_digitakhir){
case 1: case 3:
this.west = _p.west;
this.east = _p.west + (1/96);
break;
case 2: case 4:
this.west = _p.west + (1/96);
this.east = _p.east;
break;
}
this._rbi=(''+Math.floor(rbi/1000000)).padStart(4,'0')
+'-'+(Math.floor((rbi % 1000000)/100))
+'-'+(rbi % 100);// biar formatnya XXXX-XXXX-XX
}
};
/**
* rbi 1 ribu adalah rbi 2500 dipecah 9
* masing-masing kotak panjangnya 1/96 dibagi 3
* atau 0.003472222222222222
* atau 1/288 derjat
* atu 12.5 detik
*
* 7 8 9
* 4 5 6
* 1 2 3
*
*/
class RBI1000 extends RBI{
constructor(rbi){
super(rbi);
var _p = new RBI2500(Math.floor(rbi/10)); // parent RBI kita
var _digitakhir = rbi % 10;
// tahap 1, hitung dulu semua selatan dan utara nya
//south and north
switch(_digitakhir){
case 1: case 2: case 3:
this.south = _p.south;
this.north = _p.south + (0.003472222222222222);
break;
case 4: case 5: case 6:
this.south = _p.south + (0.003472222222222222);
this.north = _p.south + (0.003472222222222222) +(0.003472222222222222);
break;
case 7: case 8: case 9:
this.south = _p.north - 0.003472222222222222;
this.north = _p.north;
break;
}
// 7 8 9
// 4 5 6
// 1 2 3
//east and west
switch(_digitakhir){
case 1: case 4: case 7:
this.west = _p.west;
this.east = _p.west + 0.003472222222222222;
break;
case 2: case 5: case 8:
this.west = _p.west + 0.003472222222222222;
this.east = _p.east - 0.003472222222222222;
break;
case 3: case 6: case 9:
this.west = _p.east - 0.003472222222222222;
this.east = _p.east;
break;
}
this._rbi=(''+Math.floor(rbi/10000000)).padStart(4,'0')
+'-'+(Math.floor((rbi % 10000000)/1000))
+'-'+(rbi % 1000);// biar formatnya XXXX-XXXX-XXX
}
};
@kampar
Copy link
Author

kampar commented Sep 14, 2020

sebenarnya, saya sudah mencoba mencari cara lebih matematis untuk membuat formula seperti Slippy Map algorithm

https://wiki.openstreetmap.org/wiki/Slippy_Map

yang menggunakan trigonometry ...

tetapi ... saya rasa pendekatan ini lebih ringan ... setidaknya di otak orang non matematician seperti saya ... hahahaha

silahkan komen atau WA saya saja kalau ada trabel dengan code saya ... sudah jarang online sekarang, setidaknya dibanding sebelum beranak 3 ...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment