Skip to content

Instantly share code, notes, and snippets.

@frogcat
Created September 23, 2015 15:42
Show Gist options
  • Save frogcat/3e2df6a57b1754486358 to your computer and use it in GitHub Desktop.
Save frogcat/3e2df6a57b1754486358 to your computer and use it in GitHub Desktop.
地理院標高タイルを使った valhalla Elevation Service API Reference の実装 (複数点サポートの限定実装)
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>dem</title>
<script>
function llz2zxy(lat, lon, z) {
var r = lat * Math.PI / 180
var n = Math.pow(2, z);
var x = n * ((lon + 180) / 360);
var y = n * (1 - (Math.log(Math.tan(r) + 1 / Math.cos(r)) / Math.PI)) / 2;
return [ z, Math.floor(x), Math.floor(y) ];
}
function dem(p) {
var lat = p.lat;
var lon = p.lon;
return new Promise(function(resolve, reject) {
var zxy14 = llz2zxy(lat, lon, 14);
var zxy22 = llz2zxy(lat, lon, 22);
var url = "http://cyberjapandata.gsi.go.jp/xyz/dem/" + zxy14.join("/") + ".txt";
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var x = zxy22[1] % 256;
var y = zxy22[2] % 256;
var h = parseFloat(xhr.responseText.split("\n")[y].split(",")[x]);
resolve(h);
};
xhr.open("get", url, true);
xhr.send();
});
}
function elevation(json) {
if (json.encoded_polyline) {
alert("ToDo : support encoded polyline");
return;
}
var promises = [];
json.shape.forEach(function(p) {
promises.push(dem(p));
});
return new Promise(function(resolve, reject) {
Promise.all(promises).then(function(data) {
resolve({
shape : json.shape,
height : data
});
});
});
}
</script>
</head>
<body>
<pre id="pre">Please wait</pre>
<script>
elevation({
"shape" : [ {
"lat" : 35.68171,
"lon" : 139.76473
}, {
"lat" : 35.362878,
"lon" : 138.730965
} ]
}).then(function(json) {
document.getElementById("pre").innerHTML = JSON.stringify(json, null, " ");
});
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment