基于Cesium实现轨迹线(OD线)

基于Cesium实现轨迹线(OD线)

使用Cesium原生的方法绘制轨迹线和点,也可以使用第三方库绘制材质线,也就是material

话不多说直接上代码,首先是轨迹线的创建和销毁事件

	//生成轨迹线,参数为中心点坐标
    facilitiesQuery(msg) {
        this.eentitiesDestroy();
        let center = [];
        center.push(msg.x);
        center.push(msg.y);
        this.addPolylines(center);
    },
    //移除轨迹线的事件
    eentitiesDestroy() {
      viewer.entities.removeAll();
      this.facilitiesDatas = [];
    },

然后是线的绘制

    //添加线
	addPolylines(center) {
      // 生成随机周边设施
      let circlePoints = this.generateCirclePoints(center, 1000); //圆周边坐标
      //获取中心点
      let startP = Cesium.Cartesian3.fromDegrees(center[0], center[1], 0);
      // 添加中心点图标
      this.addCenterBillboard(startP)
      let endP;
      let positions;

      circlePoints .forEach((item) => {
        endP = Cesium.Cartesian3.fromDegrees(item[0], item[1], 0);
        positions = this.generateCurve(startP, endP);
        //使用entity对象生成轨迹线
        viewer.entities.add({
          polyline: {
            positions: positions,
            width: 4,
            material: Cesium.Color.YELLOW
          },
        });
        //也可以在终点添加标记点(可以使用label标签或者billborder广告牌)
        viewer.entities.add({
        //广告牌
        // billboard: {
        //   image: require("../../assets/img/landmanage/symbol1.png"),
        //   scaleByDistance: new Cesium.NearFarScalar(1200, 1, 5200, 0.1), //设置随图缩放距离和比例
        //   distanceDisplayCondition: new Cesium.DistanceDisplayCondition(
        //     0,
        //     60000
        //   ), //设置可见距离
        // },
        //标签
          label: {
          text: ‘点’
          font: "700 40px Microsoft YaHei", // 15pt monospace
          scale: 0.6,
          style: Cesium.LabelStyle.FILL_AND_OUTLINE,
          fillColor: Cesium.Color.WHITE,
          showBackground: true,
          backgroundColor: color,
          disableDepthTestDistance: 500,
          scaleByDistance: new Cesium.NearFarScalar(1000, 1.0, 10000, 0),
          pixelOffset: new Cesium.Cartesian2(0, -20),
          pixelOffsetScaleByDistance: new Cesium.NearFarScalar(
            0,
            1.5,
            10000,
            0
          ),
        },
        });
      });
    },

生成随级坐标的事件

  //获取一个圆的随机边缘坐标
    generateCirclePoints(center, radius) {
      let points = [];
      for (let i = 0; i < 360; i += 20) {
        points.push(
          this.getCirclePoint(center[0], center[1], i, radius * Math.random())
        );
      }
      return points;
    },
    getCirclePoint(lon, lat, angle, radius) {
      let dx = radius * Math.sin((angle * Math.PI) / 180.0);
      let dy = radius * Math.cos((angle * Math.PI) / 180.0);
      let ec = 6356725 + ((6378137 - 6356725) * (90.0 - lat)) / 90.0;
      let ed = ec * Math.cos((lat * Math.PI) / 180);
      let newLon = ((dx / ed + (lon * Math.PI) / 180.0) * 180.0) / Math.PI;
      let newLat = ((dy / ec + (lat * Math.PI) / 180.0) * 180.0) / Math.PI;
      return [newLon, newLat];
    },

添加中心点图标的事件

  //中心点图标
    addCenterBillboard(startP) {
      window.earth.entities.add({
        position: startP,
         billboard: {
           image: require("../../assets/img/landmanage/symbol2.png"),
           scaleByDistance: new Cesium.NearFarScalar(1200, 1, 5200, 0.1), //设置随图缩放距离和比例
          distanceDisplayCondition: new Cesium.DistanceDisplayCondition(
             0,
             60000
           ), //设置可见距离
          }
        },
      });
    },
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cesium是一款基于WebGL的虚拟地球和地理信息可视化库,可以用来可视化各种类型的地理数据。要可视化OD线,你可以按照以下步骤进行: 1. 准备数据:OD数据通常是一个包含起点、终点和OD数量的数据表,可以使用Excel或其他工具制作。 2. 转换数据格式:将OD数据转换为GeoJSON或其他Cesium支持的地理数据格式。 3. 加载数据:使用Cesium的DataSource加载数据,并将数据添加到Cesium的场景中。 4. 定义OD线样式:使用Cesium的PolylineGeometry和PolylineMaterial定义OD线的样式,如颜色、宽度等。 5. 添加OD线:使用Cesium的Entity添加OD线到场景中。 6. 调整视角:使用Cesium的Camera调整场景视角,以便查看OD线。 以下是一个简单的示例代码: ```javascript // 准备数据 var odData = [ { from: [116.3975, 39.9082], to: [121.4737, 31.2304], count: 100 }, { from: [121.4737, 31.2304], to: [113.2644, 23.1291], count: 50 }, // 更多数据... ]; // 转换数据格式 var geojson = { type: "FeatureCollection", features: odData.map(function (od) { return { type: "Feature", geometry: { type: "LineString", coordinates: [od.from, od.to], }, properties: { count: od.count, }, }; }), }; // 加载数据 var dataSource = new Cesium.GeoJsonDataSource(); dataSource.load(geojson); // 定义OD线样式 var material = new Cesium.PolylineDashMaterialProperty({ color: Cesium.Color.RED, dashLength: 16, }); var polyline = new Cesium.PolylineGeometry({ positions: Cesium.Cartesian3.fromDegreesArray([116.3975, 39.9082, 121.4737, 31.2304]), width: 5, }); var polylineInstance = new Cesium.GeometryInstance({ geometry: polyline, id: "OD line", }); var polylinePrimitive = new Cesium.Primitive({ geometryInstances: [polylineInstance], appearance: new Cesium.PolylineMaterialAppearance({ material: material, }), }); // 添加OD线 viewer.scene.primitives.add(polylinePrimitive); viewer.dataSources.add(dataSource); // 调整视角 viewer.camera.flyTo({ destination: Cesium.Cartesian3.fromDegrees(117, 30, 2000000), }); ``` 这是一个简单的示例,你可以根据自己的需求调整样式和视角。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值