Cesium 开发笔记 底图问题 加载二维 shp 数据

102 阅读2分钟

1 遇到地图无法加载的问题

可能是 JavaScript 代码中没有授权,去 Cesium 上面申请一个 token 即可

// 加上授权
Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NicCI6IkpXVCJ9.eyJqdGkiOiIyMjEwMWY4Ny1hODQwLTQwMjDNlOS04YzdkOTQ5MDc4YWEiLCJpZCI6MTI3MjMyLCJpYXQi2ODYxMDI4NDN9.TxhLjxdDlMjAxtf35vIgOMr9RTIwHEH3efARZUlvYaQ';

2 将 shp 转换为 GeoJson 文件并且加载的全部代码

2.1 Shp2GeoJson 转换先使用下面的网址转换即可

后期或许需要使用 Java 后端进行自动的数据转换;

mapshaper.org/

2.2 加载使用 JavaScript 代码正常加载即可

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Hello Cesium</title>
	<script src="./Build/Cesium/Cesium.js"></script>
	<link rel="stylesheet" href="./Build/Cesium/Widgets/widgets.css">


    <script src="https://cesium.com/downloads/cesiumjs/releases/1.83/Build/Cesium/Cesium.js"></script>
    <script src="https://cesium.com/downloads/extensions/cesium-timebar/cesium-timebar.js"></script>
    <link href="https://cesium.com/downloads/extensions/cesium-timebar/cesium-timebar.css" rel="stylesheet">

	<style>
		html,body {
			height: 100%;
			margin: 0px;
			padding: 0px;
		}
	</style>
</head>

<body>
	<div id="cesiumContainer" style="height: 100%;"></div>

    <script>
        // 在这里写入您的Cesium和TimeBar相关的代码
        
        // 加上授权
		Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIyMjEwMWY4Ny1hODQwLTQwMjAtODNlOS04YzdkOTQ5MDc4YWEiLCJpZCI6MTI3MjMyLCJpYXQiOjE2ODYxMDI4NDN9.TxhLjxdDlMjAxtf35vIgOMr9RTIwHEH3efARZUlvYaQ';

        var viewer = new Cesium.Viewer("cesiumContainer");

        // 将视角跳转到设置的经纬度上面
        viewer.camera.flyTo({
			// 经度、纬度、视角高度
			destination : Cesium.Cartesian3.fromDegrees(0, 0, 10000000)
		});

        // 定义 GeoJSON 数据的 URL
        // 这里添加的是 geojson 数据的相对路径,也就是在项目中的文件相对路径
        var geoJsonUrl = 'testdata/GeoJson/simplestyles.geojson';

        // 加载 GeoJSON 数据
        var dataSource = Cesium.GeoJsonDataSource.load(geoJsonUrl);

        var geoJsonUrlroad = 'testdata/GeoJson/daolu.geojson';

        // 加载 GeoJSON 数据
        var dataSource = Cesium.GeoJsonDataSource.load(geoJsonUrlroad);

        // 将数据源添加到 Cesium Viewer
        viewer.dataSources.add(dataSource).then(function() {
        // 缩放到加载的数据范围
        viewer.zoomTo(dataSource);
        }).otherwise(function(error) {
        console.error(error);
        });
        



    </script>

</body>
</html> 

因为加载的是道路数据,并且将视角设置到了经纬度都是 0 的样子,所以刚开始可能不能直接到达实际的数据所在的北京的位置 image.png

image.png

3 前端开发注意 f12 的控制台输出的使用

4 问题?

4.1 怎么把二维的矢量进行一个三维的展示?

在 Cesium 中,将二维的 GeoJSON 数据转换为三维的主要步骤是将其投影到地球表面并设置高度值。这可以通过使用 Cesium 的实体(Entity)和属性(Property)来实现。

以下是将二维 GeoJSON 数据转换为三维的基本示例:

{
    "type" : "FeatureCollection",
    "features" : [{
        "type" : "Feature",
        "geometry" : {
            "type" : "Point",
            "coordinates" : [102.0, 0.5]
        },
        "properties" : {
            "prop0" : "value0"
        }
    }, {
        "type" : "Feature",
        "geometry" : {
            "type" : "LineString",
            "coordinates" : [[102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]]
        },
        "properties" : {
            "prop0" : "value0",
            "prop1" : 0.0
        }
    ]}
}
// 创建 GeoJsonDataSource 对象
var dataSource = new Cesium.GeoJsonDataSource();

// 加载 GeoJSON 数据
dataSource.loadUrl('path/to/your/geojson_file.geojson')
  .then(function() {
    // 获取 GeoJSON 数据源的实体集合
    var entities = dataSource.entities.values;

    // 遍历实体集合,将二维数据转换为三维
    entities.forEach(function(entity) {
      // 获取实体的几何属性
      var geometry = entity.geometry;

      // 将几何属性投影到地球表面
      var surfaceGeometry = Cesium.Ellipsoid.WGS84.scaleToGeodeticSurface(geometry);

      // 设置实体的位置属性为投影后的几何属性
      entity.position = surfaceGeometry;

      // 设置实体的高度属性
      entity.addProperty('height', 0); // 设置默认高度为0,可以根据需求设置具体高度值
    });
  })
  .otherwise(function(error) {
    console.error('加载 GeoJSON 数据时出现错误:', error);
  });

// 将数据源添加到 Viewer 中显示
viewer.dataSources.add(dataSource);

首先创建一个 GeoJsonDataSource 对象,并通过 loadUrl 方法加载 GeoJSON 数据。然后,我们获取数据源的实体集合,并遍历每个实体。

在遍历过程中,我们将每个实体的几何属性投影到地球表面,使用 Cesium.Ellipsoid.WGS84.scaleToGeodeticSurface() 方法实现。接着,我们将投影后的几何属性设置为实体的位置属性,并使用 addProperty() 方法添加一个名为 "height" 的属性,并设置默认的高度值。

最后,将数据源添加到 Viewer 中显示。

请注意,上述示例仅提供了基本的转换方法,实际应用中可能需要根据具体需求进行更复杂的转换和处理操作。