サーバーにある画像ファイルを読み込んで Canvas に貼り付けて、画像を描画するだけならば簡単であるが、 開発を予定している地図システムでは少し複雑な仕組みを使う。
少なくとも一度はサーバーから画像ファイルをクライアント端末(パソコンやスマホ)に読み込むが、 それはローカルファイルに保存される。
したがって、通常は、ローカルファイルの読み込みが多くなる。 ローカルにないとき、もしくは、ローカルファイルが古いとき、サーバーから読み込み、 ローカルファイルを更新しておく。
ローカルファイルをダイレクトに Canvas に貼り付けるのではなく、 メモリ上のキャッシュ(画像データ配列)に載せる。
描画はこのキャッシュにある画像データを使う。 地図のスクロールやズームイン/ズームアウトで頻繁に画像描画が必要になるが、 これを高速に行うためにキャッシュを使う。
ローカルにあれば、それが古い場合も、一旦はそれがキャッシュに読み込み、地図を描画する。 新しい画像ファイルをサーバーから入手して、キャッシュを書き換えたら、再描画により地図を新しくする。
let request = XMLHttpRequest();
open(メソッド, URL[, 非同期[, ユーザー名[, パスワード]]])
let request = new XMLHttpRequest();
request.open('GET', 'http://cyberjapandata.gsi.go.jp/xyz/std/14/14552/6451.png', true);
※ 3 番目の引数の true は省略しても同じ(非同期)である。
XMLHttpRequest.readyState プロパティは以下の値をとる。
0 未初期化(openメソッドが呼ばれていない) 1 ロード中(openメソッドは済み、sendメソッドが未) 2 ロード済(sendメソッドは済みでレスポンス待ち) 3 受信中(レスポンス受信中) 4 完了(レスポンスの受信完了)
XMLHttpRequest.readyState == 4 になったとき、受信完了である。
let request = new XMLHttpRequest();
request.onreadystatechange = function(){
if (request.readyState == 4){
// 受信したデータの処理を記述する
}
}
request.open('GET', 'http://cyberjapandata.gsi.go.jp/xyz/std/14/14552/6451.png', true);
テキストファイルの場合、 let data = request.responseText; で受け取る。
request.onreadystatechange = function(){
if (request.readyState == 4){
if (request.status == 200){
let data = request.responseText;
console.log(data);
}
}
}
画像ファイルについては blob を使う。
var oReq = new XMLHttpRequest();
oReq.open("GET", 'http://cyberjapandata.gsi.go.jp/xyz/std/14/14552/6451.png', true);
oReq.responseType = "blob";
oReq.onload = function(oEvent) {
var blob = oReq.response;
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
document.body.appendChild(a);
a.download = 'tile.png';
a.href = url;
a.click();
a.remove();
};
oReq.send();
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js"></script>
<script>
var oReq = new XMLHttpRequest();
oReq.open("GET", "http://cyberjapandata.gsi.go.jp/xyz/std/14/14552/6451.png", true);
oReq.responseType = "blob";
oReq.onload = function(oEvent) {
var blob = oReq.response;
//console.log(oReq.readyState);
saveAs(blob, 'test.png');
};
oReq.send();
</script>