Arsip Tag: WebGIS

JavaScript untuk membuat WLD dan AUX.XML file NASA GIBS

GIBS NASA menggunakan EPSG:4326, yang sedikit berbeda dengan Pseudo Mercator / EPSG:3857 atau yang lebih dikenal dengan Google Map. Zoom pada GIBS pun dinamakan Matrixset m, jadi bukan z.

Ukuran gambar dibuat dengan perbandingan 2:1, untuk lebar dua kali lipat tinggi.

Ukuran tile pun 512×512 pixels, tidak seperti kebanyakan tile server lain yang 256×256 pixels.

Gambar baru “benar-benar” full saat m = 3, dimana terdapat 5 baris dan 10 kolom

Leaflet JS membuat Polygon untuk Matrik 3

Untuk membuat polygon batas masing-masing tile tersebut, kita gunakan saja Leaflet, karena dukungan GIS nya memang sangat mumpuni. Berikut petikan awal snippet JavaScript saya:

// fungsi untuk membuat polygon berdasarkan nomor row dan col
// untuk matrik 3
// matrik 3 adalah 10 col dan 5 row
function m3(row,col){
  //ingat L.polygon adalah latlong
  return new L.polygon(
    [
      [ 90-36*row , -180 + 36*col],
      [ 90-36*row , -180 + 36*(col+1)],
      [ 90-36*(row+1) , -180 + 36*(col+1)],
      [ 90-36*(row+1) , -180 + 36*(col)]
    ]
  );
}

Fungsi di atas untuk membuat sebuah polygon di Leflet, untuk spesifik nomor baris dan kolom tertentu.

Perhatikan bahwa Leaflet menggunakan LatLng, latitude dulu baru , baru longitude!

Untuk zoom level 3, kita tahu ada 10 kolom gambar untuk 360 derjat longitude. Dari sini, kita bisa tahu bahwa lebar sebuah ubin adalah 36 derjat.

Untuk zoom level 3, kita tahu ada 5 baris gambar yang menutupi bumi 90 derjat utara dan 90 derjat selatan, total 180 derjat latitude bumi.

180 dibagi 5 adalah …. 36 derjat juga …

Extents (batas) gambar dari NASA adalah seluruh bumi, dari -180 sampai 180 untuk longitude, dan dari 90 utara hingga minus 90 untuk selatan…

Longitude bertambah terus 36 derjat setiap kolom ubinnya, dari -180 (ujung barat bumi) hingga 180 (timur).

Latitude berkurang terus 36 derjat untuk penambahan baris ubin, mulai positif 90 di kutub utara, hingga minus 90 untuk kutub selatan.

Sekarang Anda tahu darimana datang angka-angka koordinat polygon nya!

LeafletJS Download GeoJSON untuk semua Matrik 3

Silahkan pelajari petikan kode berikut:

function downloadm3(){
	// Create an empty GeoJSON collection
	var collection = {
		"type": "FeatureCollection",
		"features": []
	};
	
	//sekarang loop tiap row dan col
  // m3 ada 5  baris 10 kolom
  var row=5,col=10;
	for(r=0;r<row;r++){
		for(c=0;c<col;c++){
			g = m3(r,c).toGeoJSON();//dari leaflet polygon langsung ke GeoJSON saja
      //nah, berhubung properties nya masih kosong, kita tambahin saja
      g.properties={m:3,r:r,c:c};
			collection.features.push(g);
		}
	}
	
	saveAs(new Blob([JSON.stringify(collection)], {type: "text/plain;charset=utf-8"}),'m3.geojson')
	
}  

Nah, jika fungsi tersebut dipanggil, Anda akan disuruh unduh eh download sebuah file bernama m3.geojson, yaitu geojson untuk semua batas ubin GIBS nasa untuk matriks 3.

Untuk sukses menjalankannya, Anda butuh FileSaver.min.js

Logika dibelakang kode ini adalah seperti berikut:

Kita buatkan dulu sebuah koleksi untuk menampung fitur kita. Ini merupakan aturan pembuatan FeatureCollection pada GeoJSON.

Lalu, kita push masing-masing ubin kita ke koleksi tadi.

Untuk lebih memudahkan kita identifikasi nomor baris dan kolom, kita tambahkan tabel atribut untuk GeoJSON kita. Pada GeoJSON, tabel atribut namanya adalah PROPERTIES!

Untuk memudahkan mendownload file GeoJSON, saya gunakan FileSaver JS, sehingga dengan fungsi saveAs nya kita bisa langsung bisa simpan berkas dari memori javascript kita.

Lanjut …

Setelah sukses untuk GeoJSON zoom level 3, kita coba untuk membuat zoom level berikutnya.

//m3 adalah 10x5, col nya adalah 360 / 10, masing masing 36 derjat
//m4 adalah 20x10, col nya adalah 360/ 20, masing-masing 18 derjat
//m5 adalah 40x20, col nya adalah 360/ 40, masing-masing berarti 9 deg
// m6  80x40     360/80 = 9/2 deg = 4.5 deg
// 7  160    36/16   36/2^4
function mx(m,row,col){
  //ingat L.polygon adalah latlong
  var deg = 36/2**(m-3);
  return new L.polygon(
    [
      [ 90-deg*row , -180 + deg*col],
      [ 90-deg*row , -180 + deg*(col+1)],
      [ 90-deg*(row+1) , -180 + deg*(col+1)],
      [ 90-deg*(row+1) , -180 + deg*(col)]
    ]
  );

}

NASA GIBS mengikuti gaya tile server pada umumnya, yaitu pada zoom level berikutnya eh matriks berikutnya, adalah matriks sekarang dipecah 2 sehingga menjadi 4 ubin,

m3 adalah 10 kolom x 5 baris.

Seperti dibahas tadi, masing-masing panjang dan tinggi nya adalah 36 derjat.

Untuk zoom berikut, dibagi 2,

m4 berisi 20 kolom dan 10 baris, karena merupakan hasil pembagian dua dari m3.

Masing-masing ubin di m4 jadinya berukuran 18 derjat x 18 derjat.

Dapatkah Anda melihat pola berikut?

m3 -> 36

m4 ->18

m5 -> 9

Berapakah derjat untuk angka m berikutnya?

var deg = 36/2**(m-3);

Jawabannya adalah petikan kode di atas …

dua buah asterik pada javascript adalah pangkat.

2**3 = 2 ^ 3 = 8

perhatikan tanda pangkat di JavaScript

Download GeoJSON untuk zoom berapa saja

Setelah kita tahu cara membuat polygon setiap zoom berapa saja , saatnya kita buatkan fungsi untuk mendownload GeoJSON untuk zoom berapa saja.

Kodenya sebagai berikut:


/**
 * fungsi untuk mendownload spesifik m atau zoom level NASA
*/
function dlm(m){
  // Create an empty GeoJSON collection
  var collection = {
    "type": "FeatureCollection",
    "features": []
  };
  
  //sekarang loop tiap row dan col
  // m3 ada 5  baris 10 kolom
  //var row=5,col=10;
  // m4 20
  var col=2**(m-3) * 10;
  var row=col/2;
  
  
  for(r=0;r<row;r++){
    for(c=0;c<col;c++){
      g = mx(m,r,c).toGeoJSON();//dari leaflet polygon langsung ke GeoJSON saja
      //nah, berhubung properties nya masih kosong, kita tambahin saja
      g.properties={m:m,r:r,c:c};
      collection.features.push(g);
    }
  }
  
  saveAs(new Blob([JSON.stringify(collection)], {type: "text/plain;charset=utf-8"})
    ,'m'+m+'.geojson')
  
}    
    

Jika Anda menjalankan dlm(8), maka Anda akan disuguhkan download file m8.geojson, yang berisi SEMUA polygon untuk zoom 8.

Masih belum muntah?

Membuat file WLD

Kelebihan kita telah memiliki polygon untuk setiap ubin, kita bisa tahu extents atau bound di Leaflet.

Perhatikan kode konsol JavaScript berikut:

var mx311 = mx(3,1,1)

JSON.stringify(mx311.getBounds())
"{"_southWest":{"lat":18,"lng":-144},"_northEast":{"lat":54,"lng":-108}}"

Setiap fitur polygon di Leaflet memiliki fungsi getBounds(), yang sangat berguna bagi kita untuk mengetahui EXTENTS gambar ubin kita.

Nah, kalau kita sudah memiliki EXTENTS, kita bisa buatkan World Filenya

function bound2WLD(bound){
  //baris pertama adalah resolusi x
  var a=[];
  a.push((bound._northEast.lng-bound._southWest.lng)/512);
  a.push(0);
  a.push(0);
  a.push( -1* (bound._northEast.lat - bound._southWest.lat)/512);
  a.push(bound._southWest.lng);
  a.push(bound._northEast.lat);
  return a;

} 

Nah, berhubung citra ubin kita adalah 512 x 512 pixel, makanya resolusi adalah dibagi 512.

Kesimpulan sementara

Polygon -> bound -> WLD

Download WLD otomatis

untuk sementara, kita coba download semua file WLD untuk zoom level 3 saja dahulu … nanti kalau bener, baru kita download semua …

//download semua file WLD untuk zoom 3
function wld3zip(){
  //coba pake JSZIP
  var zip = new JSZip();
  //untuk zoom 3, row adalah 5, cols adalah 10
  var row=5,col=10;
  for(r=0;r<row;r++){
    for(c=0;c<col;c++){
      zip.file((3+'-'+r+'-'+c+'.wld') , bound2WLD(mx(3,r,c).getBounds()).join('\r\n'));
    }
  }
  
  zip.generateAsync({type:"blob"})
    .then(function (blob) {
    saveAs(blob, "m3.zip");
  });
	
}

Nah, berhubung kita mendownlod banyak file, sebaiknya dizip saja, menggunakan JSZIP. Hal ini memudahkan kita mendownload 50 file, karena dijadikan 1 saja, m3.zip.

Download WLD untuk zoom berapa saja

Setelah sukses download semua WLD untuk zoom level 3, kita lanjutkan ke level berapa saja ….

Kodenya mirip dengan sebelumnya, hanya ada beberapa yang perlu kita ubah …


//fungsi untuk mendownload semua file WLD untuk zoom level m
// @input m zoom
// @output ZIP file containing all WLD files
function wldzip(m){
  // pake JSZIP
  var zip = new JSZip();
  var col=2**(m-3) * 10;
  var row=col/2;
	for(r=0;r<row;r++){
		for(c=0;c<col;c++){
			zip.file((m+'-'+r+'-'+c+'.wld') , bound2WLD(mx(m,r,c).getBounds()).join('\r\n'));
		}
	}
  
  zip.generateAsync({type:"blob"})
    .then(function (blob) {
    saveAs(blob, "m"+m+".zip");
  });
	
}

Perhatikan bahwa kita perlu mengubah juga nama file WLD nya ya dan juga nama zip download nya, dan juga mx(3,r,c) sekarang menjadi mx(m,r,c).

Download ZIP file PNG.AUX.XML

Berikut kode untuk membuat file auxiliary dari semua ubin yang kita unduh. Kita butuh file png.aux.xml ini agar tidak perlu ditanya terus CRS / Kode EPSG untuk gambar kita.


//download zip file containing all png.aux.xml 
function zipAUX(m){
  var zip = new JSZip();
  var col=2**(m-3) * 10;
  var row=col/2;
	for(r=0;r<row;r++){
		for(c=0;c<col;c++){
			zip.file(
        (m+'-'+r+'-'+c+'.png.aux.xml') //filename
        , '<PAMDataset>\r\n' 
          +'  <SRS>GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]</SRS>\r\n'
          + '</PAMDataset>'
      );
		}
	}
  
  zip.generateAsync({type:"blob"})
    .then(function (blob) {
    saveAs(blob, "PNG_AUX_XML_m"+m+".zip");
  });

}

Logikanya mirip dengan sebelumnya …

Voila .. sekarang kita sudah punya semuanya … ubin (download via wget), WLD dan juga AUX nya

Sekarang, gambar ubin apapun dari NASA, bisa kita unduh dan tampil cantik di QGIS kita!

Mabok?

temui saya di Gedung Baru FST UIN Suska … kita bahas secaran offline, biasanya lebih nancap!

MS4W Rewrite tileServer for your leaflet js webgis

If you want to serve tiles for Leaflet TileServer, probably using MapServer CGI is one of best options: quick and easy to setup.

One of my favorite “hacks” is doing RewriteEngine Apache Directive with .htaccess file, to make your URL more search-engine friendly.

Instead of serving long CGI URL like this one:

http://localhost/cgi-bin/mapserv.exe?map=D:/ms4w/apps/ptpn5/data/2015-09-12/ms.map&mode=tile&layers=NDVI&tilemode=gmap&tile=25546%2016315%2015

which will expose your map-file path and probably some security concern, — it will be better if you use Rewrite with your Apache

following snippet is my real DOT htaccess file ( .htaccess )

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule  tile/(.*)/(.*)/(.*)/(.*)/(.*)\.png$ "/cgi-bin/mapserv.exe?map=/ms4w/apps/ptpn5/data/$1/ms.map&mode=tile&layers=$2&tilemode=gmap&tile=$4 $5 $3" [L]

WTF is that?

It means that if some one requesting file which is not available, instead of giving 404 Error, apache will re-write user request into following rule:

those (.*) is not for boob … it’s a “whatever” in ReGex.

count those boobs … one two three four five … yeah … there are five boob …

you will mark those boob with $1 to $5 …

$1 is for path-to-my-directory

$2 is for layers in my map file

$3 is for z coordinate (zoom level in tileServer)

$4 is for x coordinate — slippy tile

$5 is for y coordinate

TL;DR

End user will now able to access any directory within apps’ data, any layer, any XYZ tile! simply by putting URL request like this:

tile/directoryname/layername/z/x/y.png

http://localhost/cgi-bin/mapserv.exe?map=D:/ms4w/apps/ptpn5/data/2015-09-12/ms.map&mode=tile&layers=NDVI&tilemode=gmap&tile=25546%2016315%2015

will became

http://localhost/ptpn5/tile/2015-09-12/NDVI/15/25546/16315.png

Some how easier to read, easier to code with Leaflet JS!

   var tile_20150912_ndvi = L.tileLayer('/ptpn5/tile/2015-09-12/NDVI/{z}/{x}/{y}.png', {
            minZoom: 10,
            maxZoom: 20,
            tms: false,
        });

    
    var tile_20150912_tc = L.tileLayer('/ptpn5/tile/2015-09-12/TrueColor/{z}/{x}/{y}.png', {
            minZoom: 10,
            maxZoom: 20,
            tms: false,
        });

    
    var tile_20150912_b4 = L.tileLayer('/ptpn5/tile/2015-09-12/B04/{z}/{x}/{y}.png', {
            minZoom: 10,
            maxZoom: 20,
            tms: false,
        });

    
    var tile_20150912_b8 = L.tileLayer('/ptpn5/tile/2015-09-12/B08/{z}/{x}/{y}.png', {
            minZoom: 10,
            maxZoom: 20,
            tms: false,
        });

U.S. Army Map Service 1943 Sumatra, Series T511, 1:250,000, sHEET30 pAKANBARU

Buat manusia, sila lihat demonya saja langsung:

http://suskatilesvr.000webhostapp.com/txu-oclc-6606499-30/

Buat yang ngga normal, boleh lanjut … tapi sakit kepala tanggung sendiri …

*Prelude*

Sebenarnya lagi sakit (hati) karena ternyata ndak banyak hosting yang dukung mapscript apalagi mapserver. Terpaksa akhirnya generet ubin sendiri lalu diupload ke server, lalu nanti dikonsumsi orang lain secara statis.

Nah, peta PAKANBARU (sesuai judul) yang awalnya 3,7Mb sekarang menjadi 56Mb. Kenapa? karena peta tersebut terpaksa dipotong-potong agar menjadi ubin. Peta Pakanbaru tersebut saya potong untuk zoom level 10 sampai dengan zoom level 13 saja, dan itu sudah 50MB, hampir 20 kali lipat dari ukuran awalnya.

Kenapa peta perlu di fotong fotong jadi ubin?

Agar peta dapat dikonsumsi oleh hp, laptop, peta yang “besar” harus dibuatnkan bertentuk WEBGIS. Nah, agar tampil gambar tersebut di web, tidak mungkin gambar yang besar tersebut dikirim ke client, karena selain menghabiskan bandwidth user, bisa saja tidak mampu ditampilkan oleh user kita nantinya (karena kegedean).

Biar gambar peta yang besar tadi bisa masuk ke henpon, eh smartphone, maka peta tersebut dipotong-potong dulu menjadi ubin atau tile, lalu dengan javascript ditampilkan kembali seolah-olah mereka menyatu. Dengan metode ini, webgis/peta dapat dinikmati dengan cepat dan ringan dan interaktif.

Ubin ? Tile? Sule?

Ngga … bukan artis … istilah ubin adalah versi bahasa untuk tile, yaitu gambar kecil kecil yang disusun seperti menyusun marmer ubin di lantai. Kenapa dibilang ubin? karena berbentuk petak petak kecil-kecil, biasanya 256×256 pixel.

Kenapa gambar kecil? karena kita hanya ingin menampilkan potongan peta yang diperlukan oleh client saja. Untuk apa menampilkan seluruh peta kalau toh user tidak butuh.

Jadi, bagaimana membuat ubin?

Ubin bisa dihasilkan otomatis oleh MapServer atau GeoServer. Namun, mencari server tempat memberikan layanan ini sangat susah. Ada sih, tapi biayanya sekitar 100USD per bulan. Sangat tidak ekonomis. Cara lain adalah dengan setup VPS sendiri lalu install GeoServer atau MapServer di sana.

Padahal, hosting yang banyak adalah shared-hosting PHP yang biasanya untuk menghosting blog (WordPress) atau sistem informasi lain yang masih menggunakan ‘bahasa’ eh priprosesor PHP.

PHP dukung menghasilkan ubin sendiri, tapi harus menggunakan extensi php-mapscript. Nah, hampir seluruh server berbayar (murah, ekonomis) yang saya check, tidak memberikan layanan ini).

Kalaulah hostingan mendukung mapscript, tentu yang perlu saya unggah hanyalah peta awal, yang hanya 3 megaan, lalu world filenya, lalu aux nya, lalu sebuah file map. Ndak kan nyampai 4 mega byte, dan bisa sampai zoom unlimited. Namun, ubin dengan cara ini akan dihasilkan on-the-fly, secara otomatis, secara ‘dinamis’ oleh server, sehingga akan menghabiskan CPU dan memory.

Solusi? Buat dulu ubin dari rumah, lalu upload semua ubin ke server hosting pakai FTP

Jadi, kalau ubin kita seed dahulu, tentu web-server (hosting) nantinya lebih ringan, karena hanya tinggal memberikan file gambar ubinnya.

Kalau pakai MapServer, kelebihannya semua ubin dihasilkan otomatis saat hanya dibutuhkan oleh client saja. Ukuran penyimpanan lebih hemat, namun SANGAT BOROS CPU DAN MEMORY. Makanya server hosting biasanya tidak mau memberikan layanan ini …

makanya di sini saya sakit

cerita baiknya, isyunya salah seorang mahasiswa saya mau meminjamkan resource VPS nya untuk uji ketahanan server ubinnya.

Mudah-mudahan jadi …

Alternatif lain kemaren adalah menggunakan layanan DDNS, lalu men-setting modem internet di rumah agar bisa memberikan port-forwarding ke ‘server’ eh laptop lama gw yang bertidan sebagai tile server. Namun, ini akan mengganggu sedikit bandwidth upload indihome rumah saya, sehingga kalau ada mahasiswa yang main game Mobile Legend di rumah bisa agak terganggu. Donlot yutub ndak terganggu, karena hanya menggunakan bandwidth download.

756 Layer WMTS Landsat NASA

Bagi Anda yang mengerti WebGIS, tentu tahu tempe dengan Leaflet JS. Nah, sekarang sudah saya buatkan sedikit snippet untuk mengambil semua 756 Layer (bahkan sebahagian besar update tiap hari dan bisa diakses historynya). Silahkan lihat contekannya dari file Ms. Excel berikut:

Untuk tiap-tiap layer tersebut sudah saya bantu dikit JavaScript nya, sehingga nanti tinggal di tempel setelah deklarasi variabel map nya leaflet

```

var Agricultural_Lands_Croplands_2000 = L.tileLayer('https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/Agricultural_Lands_Croplands_2000/default/GoogleMapsCompatible_Level7/{z}/{y}/{x}.png'
,{attribution: '< a href="\'https :/ /gibs.earthdata.nasa.gov/colormaps/v1.3/Agricultural_Lands_Croplands_2000.xml\'">NASA'
,maxZoom:7
}).addTo(map);

```
var Agricultural_Lands_Pastures_2000 = L.tileLayer('https://gibs.earthdata.nasa.gov/wmts/epsg3857/best/Agricultural_Lands_Pastures_2000/default/GoogleMapsCompatible_Level7/{z}/{y}/{x}.png'
,{attribution: '< a href="\'https: / /gibs.earthdata.nasa.gov/colormaps/v1.3/Agricultural_Lands_Pastures_2000.xml\'">NASA'
,maxZoom:7
});

Waduh …WordPress merusak kode saya …

Tapi, seharusnya kalau Anda sudah semester 5 ke atas sudah tempe banget dengan kode di atas.

Silahkan Anda coba satu persatu, masukin jadi tile layer Anda di Leaflet.

Caranya bisa dengan nama layer ditambahkan titik addTo(map)

contoh:

Agricultural_Lands_Pastures_2000.addTo(map)

Tentu ini diasumsikan anda membuat nama variabel map di Leaflet Anda sebagai map.

Namun, kalau ingin membuat pakai radio button, nanti pengguna bisa memilih milih basemap, boleh berikut contekannya:

    var baseMaps = {
"Croplands (Global Agricultural Lands, 2000)":Agricultural_Lands_Croplands_2000

//...
//tambahkan lagi semua layernya ciat ciat, dengan format: koma nama layer HTML nya, lalu titik dua, lalu namavariabel javascriptnya
//...

, "Tulisan" : namaVariableTileLayerNya
};

L.control.layers(baseMaps,checkboxedLayers).addTo(map);        

Jika ingin pake cebok, sehingga ngga bau, pengguna bisa centang ceklis nya, bisa menggunakan variabel checkboxedLayers … dua-dua nya (baseMaps dan checkboxedLayers) mesti ada dulu …

Silahkan pamerkan ke teman Anda … dijamin lebih bingung daripada Anda bingung baca ampe sini … hehehehehe

BTW, ngga pake skrinsyot berarti PALESU ™

Berikut skrinsot saya ….

Eh … BTW eniwey baswey, setelah melihat zoom nya hanya ampe segitu, dan dibandingkan satelit mata-mata DG, mungkin Anda terbersit pikiran … kok jelek banget hasil kerjaan NASA ya? Ya ngga lah .. kan resolusi yang dikasih ke kita … dan itu juga diambil dari satelit yang jauh orbitnya … bukan satelit mata-mata

Download ubin dan montage lalu georeferencer dengan script ini

Terkadang, citra satelit matamata dari satelit luar negeri lebih baik dari hasil foto udara. Namun, bagi sebahagian orang, lebih suka kalau citra ubin tersebut digabung menjadi satu, sehingga dapat digunakan sebagai basemap (petadasar) di QGIS atau ArcGIS.

Sebenarnya, banyak cara untuk menampilkan ubin itu ke QGIS atau ArcGIS, namun dengan mengunduhnya terlebih dahulu dan mengabungkannya (montage), ada pula kelebihannya, terutama kalau kampus Anda punya koneksi internet parah (karena kampus memang ditaroh di ujung kota).

Permasalahan yang dihadapi setelah digabungkan adalah tidak tahu koordinat gambar tersebut. Nah, disinilah guna script ini.

Script ini berguna untuk membuat berkas .points tersebut, sehingga nantinya dapat Anda gunakan pada plugin Georeferencer di QGIS. Anda hanya butuh dua titik koordinat ubin, yang dapat Anda ketahui dari debug layer pada link berikut:

https://sifsuska.github.io/tile-download-and-montage-generator/uin.html

Setelah dapat pasangan koordinat ubin x, y,  dan zoom level, z, baru generate .points, batch wget dan perintah untuk menggabungkan ubin tersebut dengan ImageMagick montage.

Yang anda butuhkan adalah wget.exe (untuk unduh berkas ubin), saya suka ini karena bisa saveas otomatis. Anda bisa menggunakan download manager lain, kalau Anda suka.

Downloadlah semua ubinnya terlebih dahulu, lalu gunakan montage.exe dari ImageMagick untuk menggabungkan ubin

sehingga terdapat satu gambar besar hasil gabungan semua ubin

nah, gunakan hasil script ini untuk membuat file .points

Sesuaikan nama file tersebut dengan nama hasil montage Anda, sehingga begitu di

QGIS + plugin: Georeferencer (otomatis terinstall, tapi belum di enable secara default)

Anda akan lebih gampang meng-geo-referencingkan.

Beberapa hal penting untuk Anda ketahui:

Google menggunakan EPSG:3857 atau lebih dikenal dengan WGS 84 / Pseudo Mercator

Lebih baik gambar hasil georeferencing cukup dibuatkan file *.WLD nya saja (create world file),

nanti setelah di-load ke QGIS, Anda masih ditanya EPSG, masukkan 3857,

Nah, dari menu raster di QGIS, baru di warp raster Anda ke EPSG lain, sesuai kebutuhan Anda (misalnya untuk Pekanbaru adalah UTM Zona 47N, EPSG:32647)

Sebenarnya, file world dapat dibuat otomatis oleh script ini, kalau Anda tahu perhitungan 6 barisnya, namun, saya lebih suka menggunakan Georeferencer (plugin di QGIS), karena lebih presisi saja.

Source code dapat Anda lihat di GitHub, karena semuanya saya host di Github, agar bisa dikeroyokin rame-rame.

oh, iya, lupa …

Script nya di sini:

https://sifsuska.github.io/tile-download-and-montage-generator/

Download ubin dari ESRI World_Imagery

Sebenarnya ini ilegal, tapi kadang kita butuh ubin dari ESRI, terutama World Imagery yang merupakan citra dari satelit. Untuk menjalankan ini, Anda butuh VBA (saya menggunakan Excel), butuh wget.exe untuk download filenya, dan butuh imagemagick untuk menyatukan ubin menjadi gambar yang utuh.

berikut GIST saya:

 

pada gist terlihat contoh bukittinggi,  dan hasilnya dapat dilihat di atas

Nah, yang jadi masalah buat mahasiswa saya adalah, bagaimana kita tahu koordinat dari titik yang mau diambil?

Anda bisa mengikuti TA mahasiswi bimbingan saya, Anita Pauziah Hasibuan, S.Kom, atau silahkan baca sendiri Slippy Hill Algorithm.

Nah, kalau tertarik mau melihat PoC (proof of concept) dapat melihat gist ini:

Atau, kalau ingin melihat RAW GIT kode di atas, sila ke sini:

https://cdn.rawgit.com/kampar/853e7da4afd2b002546548732bcb23d2/raw/c5551bc32bbd4fab7cd7f07c97daf32b82d1b69f/leaflet_coord.html

 

 

Akhirnya saya mengerti kenapa ESRI menggunakan Z Y X

setelah bermain-main dengan ImageMagick, akhirnya saya mengerti…

Default TileServer adalah ZXY, tetapi kenapa ESRI malah menggunakan ZYX? ternyata kalau kita gunakan ImageMagick untuk menggabungkan gambar, akan lebih mudah digabungkan kalau dia koordinatnya ZYX, bukan ZXY.

montage -mode concatenate -tile

Sila lihat hasil montage Indonesia level 5 berikut kalau default:

Kalau menggunakan ZYX: