<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script type="text/javascript" src="vtk.js"></script>
<script type="text/javascript" src="libs/jquery-3.4.1.min.js"></script>
<title>ZMap</title>
<style>
</style>
</head>
<body>
<div class="content"></div>
<script>
var dataUrl = 'data/elevation/base_zmap_convert.csv';
var imgUrl = 'data/elevation/dem.jpg';
// ----------------------------------------------------------------------------
// Standard rendering code setup
// ----------------------------------------------------------------------------
const fullScreenRenderer = vtk.Rendering.Misc.vtkFullScreenRenderWindow.newInstance({
background: [0, 0, 0],
});
const renderer = fullScreenRenderer.getRenderer();
const renderWindow = fullScreenRenderer.getRenderWindow();
// ----------------------------------------------------------------------------
// Example code
// ----------------------------------------------------------------------------
var model = {
origin: [0, 0, 0],
xSpacing: 0.01568,
ySpacing: 0.01568,
zScaling: 0.08888,
xDirection: 1,
yDirection: -1,
requestCount: 0,
}
$.ajax({
// 后端程序的url地址
url: dataUrl,
// 也可以使用method,提交数据的方式,默认是'GET',常用的还有'POST'
type: 'get',
//dataType: 'json', // 返回的数据格式,常用的有是'json','html',"jsonp"
data: { // 设置发送给服务器的数据,如果是get请求,也可以写在url地址的?后面
"id": '100001'
}
})
.done(function (resp) { // 请求成功以后的操作
console.log(resp);
model.csv = resp;
model.elevation = [];
// Parse data
const lines = model.csv.split('
');
lines.forEach((line, lineIdx) => {
model.elevation.push(line.split(',').map((str) => Number(str)));
});
const polydata = vtk.Common.DataModel.vtkPolyData.newInstance();
polydata.getPoints().setData(new Float32Array(0, 0, 0, 1, 1, 1), 3);
if (model.elevation) {
const jSize = model.elevation.length;
const iSize = model.elevation[0].length;
// Handle points and polys
const points = polydata.getPoints();
points.setNumberOfPoints(iSize * jSize, 3);
const pointValues = points.getData();
const polys = vtk.Common.Core.vtkCellArray.newInstance({
size: 5 * (iSize - 1) * (jSize - 1),
});
polydata.setPolys(polys);
const polysValues = polys.getData();
let cellOffset = 0;
// Texture coords
const tcData = new Float32Array(iSize * jSize * 2);
const tcoords = vtk.Common.Core.vtkDataArray.newInstance({
numberOfComponents: 2,
values: tcData,
name: 'TextureCoordinates',
});
polydata.getPointData().setTCoords(tcoords);
for (let j = 0; j < jSize; j++) {
for (let i = 0; i < iSize; i++) {
const offsetIdx = j * iSize + i;
const offsetPt = 3 * offsetIdx;
// Fill points coordinates
pointValues[offsetPt + 0] =
model.origin[0] + i * model.xSpacing * model.xDirection;
pointValues[offsetPt + 1] =
model.origin[1] + j * model.ySpacing * model.yDirection;
pointValues[offsetPt + 2] =
model.origin[2] + model.elevation[j][i] * model.zScaling;
// fill in tcoords
tcData[offsetIdx * 2] = i / (iSize - 1.0);
tcData[offsetIdx * 2 + 1] = 1.0 - j / (jSize - 1.0);
// Fill polys
if (i > 0 && j > 0) {
polysValues[cellOffset++] = 4;
polysValues[cellOffset++] = offsetIdx;
polysValues[cellOffset++] = offsetIdx - 1;
polysValues[cellOffset++] = offsetIdx - 1 - iSize;
polysValues[cellOffset++] = offsetIdx - iSize;
}
}
}
}
const mapper = vtk.Rendering.Core.vtkMapper.newInstance();
const actor = vtk.Rendering.Core.vtkActor.newInstance();
mapper.setInputData(polydata);
actor.setMapper(mapper);
renderer.addActor(actor);
renderer.resetCamera();
renderWindow.render();
})
.fail(function (error) { // 请求失败以后的操作
console.log(error);
});
</script>
<script>
const head = document.querySelector('head');
if (head) {
[16, 32, 96, 160, 196].forEach((resolution) => {
const link = document.createElement('link');
link.setAttribute('rel', 'icon');
link.setAttribute(
'href',
`favicon-${resolution}x${resolution}.png`
);
link.setAttribute('sizes', `${resolution}x${resolution}`);
link.setAttribute('type', 'image/png');
head.appendChild(link);
});
}
</script>
</body>
</html>
阶段成果:


研究目标:

