私のチームと私は Cesium GeoserverTerrainProvider プラグインを使用していますが、数値標高モデルが読み込まれると正しく表示されません:
「styled」画像形式または「bil/dds」プラグインを使用すると、2 つの地形タイルが結合している場所で、地形の高度値に鋭いカットがほとんどありません。
「変換された」画像形式(下記参照)を使用すると、地形に高度のピークがあります
理解を深めるために、次のリンクを参照してください: http://matteodipaolo.bitbucket.org/Geoserver/ 左上のボタンを使用すると、地形を (3 つの形式のいずれかで - 以下を参照) タイルを分割しながら読み込むことができます。スペインの関心のある地域に描かれた白い線で強調されています。
デジタル標高モデル データを操作および表示するためにたどる手順は、次のとおりです。
ソース データ: スペイン地理研究所の DEM データを使用します。
解像度 5 m の数値標高モデルを使用しています。ファイル形式は ESRI ASCII グリッド (asc) です。対応するゾーンでの測地基準系 ETRS89 UTM 投影。
データ処理: GDAL を使用して、関心のある領域の 2 つの ASC を処理しています。
元の ASC ファイルを 1 つの GeoTIFF にマージし、内部タイル、圧縮、および NODATA 値の割り当てを行います。
gdal_merge.py -o merged.tif -co "TILED=YES" -co "BLOCKXSIZE=512" -co "BLOCKYSIZE=512" - co "COMPRESS=DEFLATE" -co "ZLEVEL=9" -init -999 -a_nodata -999 -n -999 -ot Int16 MDT05-1002-H30.asc MDT05-1003-H30.asc
正しい CRS を割り当てます。
gdal_translate -a_srs "EPSG:25830" -co "TILED=YES" -co "BLOCKXSIZE=512" -co "BLOCKYSIZE=512" -co "COMPRESS=DEFLATE" -co "ZLEVEL=9" merged.tif merged_CRS.tif
概要を作成します
gdaladdo -r nearest --config COMPRESS_OVERVIEW DEFLATE --config GDAL_TIFF_OVR_BLOCKSIZE 512 merged_CRS.tif 2 4 8 16 32 64
5 レベルのピラミッドを作成します
gdal_retile.py -v -r bilinear -levels 5 -ps 1024 1024 -co "TILED=YES" -co "BLOCKXSIZE=512" -co "BLOCKYSIZE=512" -co "COMPRESS=DEFLATE" -co "ZLEVEL=9" -targetDir pyramid/ merged_CRS.tif
Geoserver での提供: BIL/DDS プラグインを使用して、https : //github.com/kaktus40/Cesium-GeoserverTerrainProvider の指示に従いました。
Cesium および Javascript コード: viewer.scene.globe に新しい Terrain Provider を設定し、geoserver プラグインでサポートされている画像形式から選択できるようにしました。
1) スタイル:
var terrainProvider = new Cesium.GeoserverTerrainProvider({
service: "WMS",
url : "http://geoserver.deimos-space.com/geoserver/elevation/wms",
xml: "http://geoserver.deimos-space.com/geoserver/elevation/wms?SERVICE=WMS&REQUEST=GetCapabilities&tiled=true",
layerName: "IGN_22_July_DEM_Pyramid_Transparent_Int16",
styleName: "mySLD",
hasStyledImage: true,
formatImage: {format : "image/png",extension: "png"},
formatArray: {
format : "image/bil",
/**
* bufferIn : buffer to process (switch byte order and check the data limitations)
* size: defines the dimension of the array (size.height* size.width cells)
* highest: defines the highest altitude (without offset) of the data.
* lowest: defines the lowest altitude (without offset) of the data.
* offset: defines the offset of the data in order to adjust the limitations
*/
postProcessArray : function(bufferIn, size,highest,lowest,offset) {
var resultat;
var viewerIn = new DataView(bufferIn);
var littleEndianBuffer = new ArrayBuffer(size.height * size.width * 2);
var viewerOut = new DataView(littleEndianBuffer);
if (littleEndianBuffer.byteLength === bufferIn.byteLength) {
// time to switch bytes!!
var temp, goodCell = 0, somme = 0;
for (var i = 0; i < littleEndianBuffer.byteLength; i += 2) {
temp = viewerIn.getInt16(i, false)-offset;
if (temp > lowest && temp < highest) {
viewerOut.setInt16(i, temp, true);
somme += temp;
goodCell++;
} else {
var val = (goodCell == 0 ? 1 : somme / goodCell);
viewerOut.setInt16(i, val, true);
}
}
resultat = new Int16Array(littleEndianBuffer);
}
return resultat;
}
}
});
2) 変換:
var terrainProvider = new Cesium.GeoserverTerrainProvider({
service: "WMS",
url : "http://geoserver.deimos-space.com/geoserver/elevation/wms",
xml: "http://geoserver.deimos-space.com/geoserver/elevation/wms?SERVICE=WMS&REQUEST=GetCapabilities&tiled=true",
layerName: "IGN_22_July_DEM_pyramid_Transparent_Converted",
hasStyledImage: false,
formatImage: {format : "image/png",extension: "png"},
formatArray: {
format : "image/bil",
/**
* bufferIn : buffer to process (switch byte order and check the data limitations)
* size: defines the dimension of the array (size.height* size.width cells)
* highest: defines the highest altitude (without offset) of the data.
* lowest: defines the lowest altitude (without offset) of the data.
* offset: defines the offset of the data in order to adjust the limitations
*/
postProcessArray : function(bufferIn, size,highest,lowest,offset) {
var resultat;
var viewerIn = new DataView(bufferIn);
var littleEndianBuffer = new ArrayBuffer(size.height * size.width * 2);
var viewerOut = new DataView(littleEndianBuffer);
if (littleEndianBuffer.byteLength === bufferIn.byteLength) {
// time to switch bytes!!
var temp, goodCell = 0, somme = 0;
for (var i = 0; i < littleEndianBuffer.byteLength; i += 2) {
temp = viewerIn.getInt16(i, false)-offset;
if (temp > lowest && temp < highest) {
viewerOut.setInt16(i, temp, true);
somme += temp;
goodCell++;
} else {
var val = (goodCell == 0 ? 1 : somme / goodCell);
viewerOut.setInt16(i, val, true);
}
}
resultat = new Int16Array(littleEndianBuffer);
}
return resultat;
}
}
});
3) BIL/DDS:
var terrainProvider = new Cesium.GeoserverTerrainProvider({
service: "WMS",
url : "http://geoserver.deimos-space.com/geoserver/elevation/wms",
xml: "http://geoserver.deimos-space.com/geoserver/elevation/wms?SERVICE=WMS&REQUEST=GetCapabilities&tiled=true",
layerName: "IGN_22_July_DEM_Pyramid_Transparent_Int16",
hasStyledImage: false,
});