代码
https://github.com/Dongvdong/v2_1_Cesium_GNSS-/tree/main

链接:https://pan.baidu.com/s/15cEwluH8qr5ApN58XmDaOQ?pwd=4kat
提取码:4kat

解压缩注意修改
文件名字默认带有一个- 导致找不到

MO
1 注册账号
https://ion.cesium.com/tokens?page=1
10511
L4
2 获取秘钥
https://ion.cesium.com/tokens?page=1

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIyZmVmYjIwZC01MWMwLTQ1ODMtOTgyYi01NWRlYjI5MDQzZTQiLCJpZCI6MzY5MTAsImlhdCI6MTcxODQ0MzQyM30.W67FXIW320E6hr9RLPj-I107TqSjrzEZoIB6cDXO50A
3 部署python flask
pip install Flask
4 部署censuim代码 离线库
https://ion.cesium.com/tokens?page=1


主要依赖库位置

调用工程

依赖cesuim库代码位置修改
<head> <script src="Cesium-1.118/Build/Cesium/Cesium.js"></script> <link href="Cesium-1.118/Build/Cesium/Widgets/widgets.css" rel="stylesheet"> <link href="style.css" rel="stylesheet"> </head>
5开发
5-1运行
activate py38 python gnss_show.py

界面

5-2代码
输入 txt数据
DJI_0002.JPG 34.032505638888885 108.76779925 514.638 DJI_0005.JPG 34.03267641666667 108.76781155555555 514.464 DJI_0011.JPG 34.03394725 108.76789833333333 514.635 DJI_0015.JPG 34.03487661111111 108.76796561111111 514.642 DJI_0018.JPG 34.03509530555555 108.76797844444444 514.615 DJI_0022.JPG 34.03506447222222 108.76773913888889 514.582 DJI_0025.JPG 34.03463080555555 108.76770336111112 514.66 DJI_0028.JPG 34.03403180555556 108.76765755555556 514.578 DJI_0031.JPG 34.033382777777774 108.76761005555555 514.547 DJI_0035.JPG 34.03253316666667 108.7675511111111 514.661 DJI_0041.JPG 34.032487583333335 108.76718336111111 514.831 DJI_0042.JPG 34.03248605555555 108.76717719444444 514.781 DJI_0048.JPG 34.03325102777778 108.76728608333333 514.608 DJI_0051.JPG 34.03387375 108.76732563888889 514.609 DJI_0052.JPG 34.034081083333334 108.76734075 514.59 DJI_0055.JPG 34.03470161111111 108.76738266666666 514.587 DJI_0061.JPG 34.03516225 108.76709783333334 514.61 DJI_0065.JPG 34.03492263888889 108.7670823888889 514.535 DJI_0068.JPG 34.03433427777777 108.76704025 514.691 DJI_0072.JPG 34.033466999999995 108.76698133333333 514.629 DJI_0075.JPG 34.03280680555555 108.76694088888888 514.528 DJI_0078.JPG 34.03247211111111 108.76691944444444 514.524 DJI_0081.JPG 34.03250063888889 108.76672519444445 514.701 DJI_0085.JPG 34.032728444444444 108.7665366388889 514.542 DJI_0091.JPG 34.03391938888889 108.76662430555555 514.618 DJI_0092.JPG 34.03412261111111 108.76664058333333 514.588 DJI_0098.JPG 34.03518033333333 108.76671308333333 514.628 DJI_0101.JPG 34.035119083333335 108.76656191666666 514.596 DJI_0102.JPG 34.03512708333333 108.76638525 514.611 DJI_0105.JPG 34.03509647222222 108.76637558333333 514.643 DJI_0111.JPG 34.033914833333334 108.76629880555555 514.529 DJI_0115.JPG 34.03300075 108.76621002777777 514.643 DJI_0118.JPG 34.032449694444445 108.76618838888889 514.69 DJI_0122.JPG 34.03240563888889 108.765901 514.69 DJI_0125.JPG 34.032411055555556 108.76582372222222 514.662 DJI_0128.JPG 34.03271611111111 108.76583419444444 514.517 DJI_0131.JPG 34.03324172222222 108.76585058333333 514.588 DJI_0135.JPG 34.03400922222222 108.76589261111111 514.61 DJI_0141.JPG 34.03509111111111 108.76597241666667 514.656 DJI_0142.JPG 34.03511819444444 108.76597658333333 514.619
数据格式读取位置

gnss_show.py
#激活环境
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import time
from flask import *
app = Flask(__name__)
import os
pathnow=os.getcwd()
pathnow=pathnow.replace('\\','/')
#print(pathnow) #获取当前工作目录路径
#print (os.path.abspath('mainPage0.html'))
app = Flask(
__name__,
template_folder='.', # 表示在当前目录 (myproject/) 寻找模板文件
static_folder='', # 空 表示为当前目录 (myproject/) 开通虚拟资源入口
static_url_path='',
)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(host='0.0.0.0',port='8080')
基本例子为了理解
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<script src="Cesium-1.118/Build/Cesium/Cesium.js"></script>
<link href="Cesium-1.118/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
<style>
body {
overflow: hidden;
margin: 0px;
padding: 0px;
height: 100%;
}
#cesiumContainer {
height: 100%;
}
</style>
</head>
<body>
<div id="cesiumContainer"></div>
<script type="module">
//<link href="style.css" rel="stylesheet">
// Get your token from https://cesium.com/ion/tokens 秘钥
Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIyZmVmYjIwZC01MWMwLTQ1ODMtOTgyYi01NWRlYjI5MDQzZTQiLCJpZCI6MzY5MTAsImlhdCI6MTcxODQ0MzQyM30.W67FXIW320E6hr9RLPj-I107TqSjrzEZoIB6cDXO50A';
//1创建地球可视化
const viewer = new Cesium.Viewer('cesiumContainer', {
terrain: Cesium.Terrain.fromWorldTerrain(),
});
const osmBuildings = await Cesium.createOsmBuildingsAsync();
viewer.scene.primitives.add(osmBuildings);
//1飞到指定地点 经纬度高度
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(-122.384, 37.62, 4000)
});
//2创建连续点对
const flightData = JSON.parse(
'[{"longitude":-122.39053,"latitude":37.61779,"height":-27.32},{"longitude":-122.39035,"latitude":37.61803,"height":-27.32},{"longitude":-122.39019,"latitude":37.61826,"height":-27.32},{"longitude":-122.39006,"latitude":37.6185,"height":-27.32},{"longitude":-122.38985,"latitude":37.61864,"height":-27.32}]');
// Create a point for each.
for (let i = 0; i < flightData.length; i++) {
const dataPoint = flightData[i];
const airplaneEntity= viewer.entities.add({
//点击这个点出现的描述
description: `Location: (${dataPoint.longitude}, ${dataPoint.latitude}, ${dataPoint.height})`,
//点的位置
position: Cesium.Cartesian3.fromDegrees(dataPoint.longitude, dataPoint.latitude, dataPoint.height),
//点的类型
point: { pixelSize: 10, color: Cesium.Color.BLUE }
});
// viewer.flyTo(airplaneEntity);
}
</script>
</body>
</html>
例子2 读取txt可视化

<!DOCTYPE html>
<html lang="en">
<head>
<script src="Cesium-1.118/Build/Cesium/Cesium.js"></script>
<link href="Cesium-1.118/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
<!--
<script src="https://cdnjs.cloudflare.com/ajax/libs/cesium/1.95.0/Cesium.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/cesium/1.95.0/Widgets/widgets.css" rel="stylesheet">
-->
<style>
body {
overflow: hidden;
margin: 0px;
padding: 0px;
height: 100%;
}
#cesiumContainer {
height: 100%;
}
</style>
</head>
<body>
<div id="cesiumContainer"></div>
<!-- 1选择文件 -->
<div class="nav" style=" position:absolute;left:0px;top:0px">
<input type="file" id="fileUpload" name="fileUpload" onchange="SelectMapDir(true) ">
</div>
<!-- 2选择颜色 -->
<label for="colors">选择颜色:</label>
<select id="colors_select" name="colors">
<option value="rgba(0, 255, 0, 255)">绿色</option>
<option value="rgba(255, 0, 0, 255)">红色</option>
<option value="rgba(0, 0, 255, 255)">蓝色</option>
<option value="rgba(255, 255, 0, 255)">黄色</option>
</select>
<script type="module">
window.SelectMapDir = SelectMapDir;// 声明选择文件函数位置
var gps_txt_value=[];
/**************************************************
*name :SelectMapDir(flag)
*function :加载文件夹按钮绑定函数
**************************************************/
function SelectMapDir(flag)
{
if (flag) {
//文件夹路径
var selectDictory = document.getElementById('fileUpload'); //input 类型文件 SelectDictMap
//文件夹列表
var selectDictory_files = selectDictory.files;
for (var file of selectDictory_files)
{
console.log('文件名', file.name); //文件名
var reader = new FileReader();
reader.readAsText(file);
reader.onload = function ()
{
gps_txt_value = this.result;//获取结果哦
//console.log("读取全部内容:",this.result);
//var jsonData = JSON.parse(temp);// json解析
var map_txt_value=Readtxt_map(gps_txt_value);//使用结果
var selectBox_colors = document.getElementById("colors_select");
var selected_color_i = selectBox_colors.options[selectBox_colors.selectedIndex].value;
console.log("颜色",selected_color_i,selectBox_colors.selectedIndex);
//alert(selectBox_colors);
Draw_Point(viewer,map_txt_value,selected_color_i);
Draw_Line(viewer,map_txt_value,selected_color_i);
};// 传递外部参数进去
}
}
}
/**************************************************
*name :Readtxt_map(txt, map_value)
*function :读取GPS.txt(时间戳 经度 纬度 高度),用于绘制地图范围
* 3 -122.163428479 47.6249706197 243.199996948
* 4 -122.163428479 47.625278944 243.199996948
*param :txt 存储所有真实GPS文件路径
*param :map_value 真实GPS集合
* [[3 -122.163428479 47.6249706197 243.199996948]
* [4 -122.163428479 47.625278944 243.199996948]]
**************************************************/
function Readtxt_map(txt) {
var map_value=[];
var fenge='\n';
var line_list = txt.split(fenge);
var j = 0;
while (j < line_list.length - 1) {
var data_list=line_list[j].split(' ');
var real_name = data_list[0];
var real_lon = data_list[2];
var real_lat = data_list[1];
var real_alt = data_list[3];
// // 坐标系偏移
// var wgs84coord =
// coordtransform.wgs84togcj02(parseFloat(real_lon), parseFloat(real_lat));
// real_lon = wgs84coord[0];
// real_lat = wgs84coord[1];
var line_i_lon_lat_h=[real_name, parseFloat(real_lon), parseFloat(real_lat), parseFloat(real_alt),parseFloat(j),]
map_value.push(line_i_lon_lat_h);
console.log('j', line_i_lon_lat_h);
j = j + 1;
}
//console.log('map_value', map_value);
return map_value;
}
/**************************************************
*name :Draw_Point(viewer,flightData,colors_i_)
*function : 将数据点flightData根据colors_i_颜色以不同的形式可视化在地图viewer中
*param :flightData
* [[3 47.6249706197 -122.163428479 243.199996948]
* 4 47.625278944 -122.163428479 243.199996948]]
*param :types 轨迹类型
*param :viewer 地图控件
**************************************************/
function Draw_Point(viewer,flightData,colors_i_) {
//随机颜色
// var colori = Cesium.Color.fromRandom({
// red: 1.0,
// alpha: 0.65
// });
var colori = Cesium.Color.fromCssColorString(colors_i_);
//可以根据types 指定颜色
for (let i = 0; i < flightData.length; i++) {
const dataPoint = flightData[i];
var id=dataPoint[4];
var longitude=dataPoint[1];
var latitude=dataPoint[2];
var height=dataPoint[3];
var name=dataPoint[0];
var airplaneEntity= viewer.entities.add({
//点击这个点出现的描述
description: `帧号: ${id} <br> 名字: ${name} <br> 位置: (${longitude}, ${latitude}, ${height}) `,
//点的位置
position: Cesium.Cartesian3.fromDegrees(longitude, latitude, height),
//点的类型
//point: { pixelSize: 10, color: Cesium.Color.BLUE }
point: { pixelSize: 0, color: colori }
});
viewer.flyTo(airplaneEntity);
}
}
/**************************************************
*name :Draw_Line(viewer,flightData,colors_i_)
*function : 将数据线flightData根据colors_i_颜色以不同的形式可视化在地图viewer中
*param :flightData
* [[3 47.6249706197 -122.163428479 243.199996948]
* 4 47.625278944 -122.163428479 243.199996948]]
*param :types 轨迹类型
*param :viewer 地图控件
**************************************************/
function Draw_Line(viewer,flightData,colors_i_) {
//随机颜色
// var colori = Cesium.Color.fromRandom({
// red: 1.0,
// alpha: 0.65
// });
//可以根据types 指定颜色
var rgba = colors_i_.match(/rgba\((\d+), (\d+), (\d+), (\d+)\)/);
// 如果有值,转换为 Cesium Color
if (rgba) {
var r = parseInt(rgba[1]);
var g = parseInt(rgba[2]);
var b = parseInt(rgba[3]);
var a = parseInt(rgba[4]) ; // 透明度转为 0-1
}
var positionData=[];
for (let i = 0; i < flightData.length; i++) {
const dataPoint = flightData[i];
var id=dataPoint[4];
var longitude=dataPoint[1];
var latitude=dataPoint[2];
var height=dataPoint[3];
var name=dataPoint[0];
const position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
positionData.push(position);
}
// 贴地线
var line_groud = viewer.entities.add({
polyline: {
positions: positionData,
clampToGround: false,// 贴地
followSurface: false ,// 是否跟随地形(如果需要)
width: 3,
//material: new Cesium.ColorMaterialProperty(Cesium.Color.fromBytes(0, 0, 255, 255)) // 设置线的颜色和透明度
material: new Cesium.ColorMaterialProperty(Cesium.Color.fromBytes(r, g, b, a) ) // 设置线的颜色和透明度
//material: new Cesium.PolylineGlowMaterialProperty({ // 设置材质为发光线
// glowPower: 0,////一个数字属性,指定发光强度,占总线宽的百分比
// color: Cesium.Color.fromCssColorString(colors_i_) // 设置线的颜色为蓝色
// })
}
});
}
//<link href="style.css" rel="stylesheet">
// Get your token from https://cesium.com/ion/tokens 秘钥
Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIyZmVmYjIwZC01MWMwLTQ1ODMtOTgyYi01NWRlYjI5MDQzZTQiLCJpZCI6MzY5MTAsImlhdCI6MTcxODQ0MzQyM30.W67FXIW320E6hr9RLPj-I107TqSjrzEZoIB6cDXO50A';
//1创建地球可视化
const viewer = new Cesium.Viewer('cesiumContainer', {
terrain: Cesium.Terrain.fromWorldTerrain(),
});
// 显示3D建筑物
//const osmBuildings = await Cesium.createOsmBuildingsAsync();
//viewer.scene.primitives.add(osmBuildings);
//1飞到指定地点 经纬度高度
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(108.76597241666667, 34.03509111111111, 514.656)
});
</script>
</body>
</html>
浙公网安备 33010602011771号