cesium加载shp文件

在这里插入图片描述

一、CesiumVectorTile.js加载shp文件

Cesium VectorTileImageryProvider 支持小数据量的geojson、shape文件矢量动态切片,实现贴地
下载CesiumVectorTile.js文件并在index.html中引入

<script src="./CesiumVectorTile.js"></script>

加载shp文件,shp文件同级目录下需要有dbf文件,prj文件,不可隐藏地球球体

var VectorTileImageryProvider = Cesium.VectorTileImageryProvider;

var worldLayer = null;
var worldProvider = new VectorTileImageryProvider({
  source: "./static/hubei.shp",
  defaultStyle: {
    outlineColor: "#02a9ff",
    lineWidth: 1,
    fill: false,
    tileCacheSize: 200,
    showMaker: false,
    showCenterLabel: true,
    fontColor: "#02a9ff",
    labelOffsetX: -10,
    labelOffsetY: -5,
    fontSize: 13,
    fontFamily: "黑体",
    centerLabelPropertyName: "NAME"
  },
  maximumLevel: 20,
  minimumLevel: 1,
  simplify: false
});
worldProvider.readyPromise.then(function () {
worldLayer = viewer.imageryLayers.addImageryProvider(worldProvider);
});

在这里插入图片描述

二、借助插件shapefile.js加载dbf和shp文件,转成geojson后加载

下载shapefile.js文件并引入

import * as shapefile from "./shapefile";

读取shp文件并生成geojson,加载到cesium中。
shp文件同级目录下需要有dbf文件。

const url = './static/hubei.shp'
const urlArr = url.split('.shp')
const dbfUrl = urlArr[0] + '.dbf'

this.createAndLoad(url, dbfUrl, { encoding: "utf-8" });
createAndLoad(shpData, dbfData, options) {
      const $this = this;
      var myFeatures = [];
      shapefile
        .open(shpData, dbfData, options)
        .then((source) =>
          source.read().then(function log(result) {
            if (result.done) {
              var _mGeoJson = {
                type: "FeatureCollection",
                features: myFeatures,
              };
              const layer = viewer.dataSources.add(
                Cesium.GeoJsonDataSource.load(_mGeoJson, {
                  clampToGround: false,
                  stroke: Cesium.Color.fromCssColorString("#02a9ff"), //new Cesium.Color(0/255, 0/255, 0/255, 0),
                  fill: new Cesium.Color(222/255, 216/255, 192/255, 0.3),
                })
              );
              viewer.zoomTo(layer);
              return;
            } else {
              var _result = result.value;
              var _curFeature = {
                type: _result.type,
                geometry: {
                  type: _result.geometry.type,
                  coordinates: _result.geometry.coordinates,
                },
                properties: _result.properties,
              };
              myFeatures.push(_curFeature);
              return source.read().then(log);
            }
          })
        )
        .catch((error) => console.error(error.stack));
    },

三、在页面直接上传shp文件和dbf文件后转换并加载

本地shp数据或者在线shp数据,将shp数据转化为geojson数据并下载,在cesium中加载。

loadShp4Server() {
  var _shpData, _dbfData;
  _shpData = document.getElementById("urlPath").value.trim();
  if (_shpData.indexOf(".shp") < 0) {
    console.log("注意:输入的shp服务端地址有误!");
    return;
  }
  _dbfData = _shpData.substr(0, _shpData.length - 3) + "dbf";
  this.CreateAndLoadShp(_shpData, _dbfData, { encoding: "utf-8" });
},
loadShp4Localhost() {
  const $this = this;
  var shpFile, dbfFile, _shpData, _dbfData;
  var filesSelect = Array.from(document.getElementById("_shpFile").files);
  if (filesSelect.length != 2) {
    console.log(
      "注意:所选择内容只能是一个图层的.shp和.dbf文件!"
    );
    return;
  }
  filesSelect.forEach((element) => {
    if (element.name.indexOf(".shp") > 0) {
      shpFile = element;
    } else if (element.name.indexOf(".dbf") > 0) {
      dbfFile = element;
    }
  });
  if (!shpFile || !dbfFile) {
    console.log(
      "注意:所选择内容必须包括同一个图层的.shp和.dbf文件!"
    );
    return;
  }
  var readShp = new FileReader();
  readShp.readAsArrayBuffer(shpFile, "UTF-8"); //读取文件的内容
  readShp.onload = function () {
    _shpData = this.result;
    var readDbf = new FileReader();
    readDbf.readAsArrayBuffer(dbfFile, "UTF-8"); //读取文件的内容
    readDbf.onload = function () {
      _dbfData = this.result;
      $this.CreateAndLoadShp(_shpData, _dbfData, { encoding: "utf-8" });
    };
  };
},
CreateAndLoadShp(shpData, dbfData, options) {
  const $this = this;
  var myFeatures = [];
  shapefile
    .open(shpData, dbfData, options)
    .then((source) =>
      source.read().then(function log(result) {
        if (result.done) {
          var _mGeoJson = {
            type: "FeatureCollection",
            features: myFeatures,
          };
          if ($this.boolDownload) {
            $this.funDownload(JSON.stringify(_mGeoJson), "default.geojson");
          }
          const layer = viewer.dataSources.add(
            Cesium.GeoJsonDataSource.load(_mGeoJson, {
              clampToGround: false,
              stroke: Cesium.Color.fromCssColorString("#02a9ff"), //new Cesium.Color(0/255, 0/255, 0/255, 0),
              fill: new Cesium.Color(222/255, 216/255, 192/255, 0.3),
            })
          );
          viewer.zoomTo(layer);
          return;
        } else {
          var _result = result.value;
          var _curFeature = {
            type: _result.type,
            geometry: {
              type: _result.geometry.type,
              coordinates: _result.geometry.coordinates,
            },
            properties: _result.properties,
          };
          myFeatures.push(_curFeature);
          return source.read().then(log);
        }
      })
    )
    .catch((error) => console.error(error.stack));
},
funDownload(content, filename) {
  var eleLink = document.createElement("a"); // 创建隐藏的可下载链接
  eleLink.download = filename;
  eleLink.style.display = "none";
  var blob = new Blob([content]); // 将字符内容转成blob
  eleLink.href = URL.createObjectURL(blob);
  document.body.appendChild(eleLink); // 点击触发
  eleLink.click();
  document.body.removeChild(eleLink); // 然后移除创建的元素
  console.log("下载完成");
},
getLocation() {
  let handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
  handler.setInputAction(function (event) {
    let earthPosition = viewer.scene.pickPosition(event.position);
    if (Cesium.defined(earthPosition)) {
      let cartographic = Cesium.Cartographic.fromCartesian(earthPosition);
      let lon = Cesium.Math.toDegrees(cartographic.longitude).toFixed(5);
      let lat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(5);
      let height = cartographic.height.toFixed(2);
      console.log(earthPosition, {
        lon: lon,
        lat: lat,
        height: height,
      });
    }
  }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
}
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Cesium Vector Tile(瓦片)是一种地理矢量数据的格式,是由Cesium开发的一款开放源代码的地球可视化引擎。瓦片是一种将地理空间数据切割成小块、预先渲染并存储的格式,可以快速加载和呈现地图数据。 Cesium Vector Tile使用矢量瓦片格式来存储地理数据,矢量数据可以包括线、点、多边形等地理要素。与传统的栅格瓦片相比,矢量瓦片具有更高的灵活性和可定制性。它可以通过不同的样式和样式表来呈现数据,使用户能够根据自己的需求自由定制地图的外观和元素。 Cesium Vector Tile的一个优势是其出色的性能。矢量数据相对于栅格数据来说更小,可以更快速地下载和渲染。此外,由于矢量瓦片是在客户端动态渲染的,因此可以根据用户的交互行为实时更新数据,提供更好的交互体验。 Cesium Vector Tile还提供了一些高级功能,比如数据筛选、查询和聚合等。用户可以使用矢量瓦片来对地理数据进行空间查询、统计和可视化分析,从而更好地理解和利用地理信息。 总之,Cesium Vector Tile是一种高效、灵活和可定制的地理矢量数据格式。它提供了出色的性能和丰富的功能,可以帮助用户在地理数据可视化和分析方面取得更好的效果。 ### 回答2: Cesium Vector Tile 是一种地理信息数据格式,用于在Cesium平台上渲染矢量地图数据。它基于矢量数据,并使用了基于Web的矢量瓦片(Vector Tile)技术,可以在Web浏览器中高效地显示大规模的地理信息数据。 Cesium Vector Tile 采用了类似瓦片(Tile)的方式来切分地理信息数据,将其分为一系列小块的矢量数据。每个矢量瓦片都包含了该区域内的地理要素(如道路、建筑物、河流等)的几何形状和属性信息。这种切分方式可以方便地对地图进行分级显示,同时能够提高地图的加载速度和渲染性能。 由于采用了矢量数据格式,Cesium Vector Tile 不仅可以在任意缩放级别下进行无损的清晰显示,还可以进行实时的编辑和交互操作。用户可以对地图进行平移、放大、缩小等操作,并且可以对地图上的要素进行选择、标注、查询等功能。 Cesium Vector Tile 还支持多种地理信息数据类型,包括点、线、面等,可以呈现出丰富多样的地图效果。同时,它还支持自定义的样式和渲染规则,可以根据用户的需求进行个性化的地图设计和样式设置。 总之,Cesium Vector Tile 是一种用于在Cesium平台上显示矢量地图数据的格式,它具有高效加载、实时编辑和交互、多样化显示等特点,为用户提供了强大的地理信息展示和分析工具。 ### 回答3: Cesium Vector Tile是一种基于矢量切片技术的地理空间数据格式,用于在Cesium上呈现地理信息。矢量切片是一种将地理数据以多个小矩形片段的方式进行划分和存储的方式,每个矩形片段都包含有关地理实体的几何形状和属性信息。 Cesium Vector Tile的使用具有多种优势。首先,由于数据以矢量形式存储,因此能够提供更精确的地理信息呈现。这意味着可以呈现更详细、更准确的地形、建筑物、道路等地理实体。 其次,Cesium Vector Tile的矢量切片格式使数据存储和传输变得更高效。矢量切片只需传输和渲染可见区域的数据,而不是全局数据,这减少了数据传输和处理的负担,提高了数据加载速度和渲染性能。 此外,Cesium Vector Tile支持多种地图样式和符号化方式,用户可以根据自己的需求定制地理实体的呈现样式,包括颜色、填充、边框等。 Cesium Vector Tile还支持与其他地理信息系统(GIS)和数据服务的无缝集成。通过将矢量切片作为数据源,可以在Cesium中与各种地理数据进行交互,例如在地图上添加标记、查询POI、进行路径规划等。 总之,Cesium Vector Tile是一种优秀的地理空间数据格式,能够为Cesium提供高精度、高效率的地理信息呈现和交互功能,为用户提供更丰富的地理数据展示和应用体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值