網(wǎng)站建設(shè) 軟件開(kāi)發(fā)站長(zhǎng)之家統(tǒng)計(jì)
很多地圖軟件都能隨鼠標(biāo)移動(dòng)動(dòng)態(tài)顯示高程。這里介紹一種方法,我所得出的。
1 下載高程數(shù)據(jù)
一般有12.5m數(shù)據(jù)下載,可惜精度根本不夠,比如mapbox的免費(fèi)在線的,或者91衛(wèi)圖提供百度網(wǎng)盤(pán)打包下載的,沒(méi)法用,差距太大。而91衛(wèi)圖自己使用的,精度估計(jì)是5m的,是可以的。
所以還是用框選的辦法在91中下載,你沒(méi)有企業(yè)版也下載不了,再找其他辦法吧。
可以一次下載全省:點(diǎn)廣東省——下載……數(shù)據(jù)太大,不好處理
所以還是放大到8級(jí),把經(jīng)緯度打開(kāi),顯示幾個(gè)經(jīng)緯度,按框選下載18級(jí)的dem高程數(shù)據(jù)

廣東省分成了這么十幾個(gè)框
2 導(dǎo)出geotif文件
下載后導(dǎo)出數(shù)據(jù),每個(gè)導(dǎo)出文件為1G多,為tif文件
3 將tif轉(zhuǎn)換為terrainRGB
將tif文件其中一個(gè)拷貝到dem2terrainRGB文件夾內(nèi)
用命令
D:\dem2terrainrgb>python main.py --dem ./liyuzhou.tif --dist ./tiles --zoom 18
filled NODATA value successfully: ./tmp/liyuzhou_without_nodata.tif
rgbified successfully: ./tmp/liyuzhou_RGB.tif
created tileset successfully: ./tiles
生成**_without_nodata.tif(907M)和**_RGB.tif(279M),再切割成瓦片到tiles目錄下
這個(gè)過(guò)程請(qǐng)參考我的文檔。
4 重命名
由于它生成的瓦片命名是TMS標(biāo)準(zhǔn)的,我們leaflet需要WMTS標(biāo)準(zhǔn)的,所以要重新命名
代碼寫(xiě)好了,不過(guò)是golang語(yǔ)言的,編譯好的exe也提供了,放到與tiles文件夾同級(jí)的目錄下運(yùn)行exe,它自動(dòng)遞歸tiles文件夾里所有文件,根據(jù)tiles文件夾里目錄的數(shù)字,對(duì)png文件命名進(jìn)行轉(zhuǎn)換,自己看代碼吧。
5 將png文件發(fā)布
比如放到engineercms的static目錄下某個(gè)文件夾里
地址寫(xiě)好放到leaflet框架下的js文件中調(diào)用。
6 用leaflet-topography獲得高程
用leaflet這個(gè)插件[leaflet-topography](https://github.com/slutske22/leaflet-topography),實(shí)現(xiàn)鼠標(biāo)移動(dòng),高程數(shù)據(jù)不斷變化。
原理就是鼠標(biāo)移動(dòng)后,取得鼠標(biāo)所在經(jīng)緯度,請(qǐng)求這個(gè)經(jīng)緯度所在的png文件,這個(gè)插件根據(jù)png文件的RGB三色值,計(jì)算得出高程數(shù)值,顯示到頁(yè)面。
7 地形切剖面
思路:取得lineString對(duì)象,用turf.length和turf.lineChunk進(jìn)行分割,返回分割后的線段對(duì)象
用turf.coordEach循環(huán)分割后的對(duì)象,根據(jù)循環(huán)返回值其中的坐標(biāo),用eaflet-topography取得高程,并將高程賦予坐標(biāo)中。
再用Leaflet.Elevation生成剖面。
// let line = turf.lineString(data.data);var line = turf.lineString([[-95, 40],[-93, 45],[-85, 50]]);// var chunk = turf.lineChunk(line, 15, {units: 'miles'});var options = { units: 'kilometers' };var length = turf.length(line, options);var along = turf.lineChunk(line, length / 100, options);var bbox = turf.bbox(line);console.log(along);// var features = turf.featureCollection([// turf.point([26, 37], {"foo": "bar"}),// turf.point([36, 53], {"hello": "world"}),// line,// ]);turf.coordEach(along, function(currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {currentCoord[2] = 333;//=currentCoord//=coordIndex//=featureIndex//=multiFeatureIndex//=geometryIndex});console.log(along);