cesium选择省区域,geojson的加载和使用

1,950 阅读3分钟

欢迎转载,转载需带着文章出处链接~~,希望我的经验能帮到你,有问题可以点我头像加我微信 本文章仅对遇到的问题提供一个解决思路,对于迫切想要实现功能效果的人来说,希望能稍微沉下心观看,或者直接观看思路部分,或者直接观看完整代码 本文章的代码并不能直接拿来使用,完整代码只是本篇文章解决的问题需要用到的代码,如果直接使用可能会有报错,只要修改一下代码既可使用~~~

cesium选择省区域,geojson的加载和使用

-参考-

世界国家geojson大全,各国地图json数据下载 阿里云可视化学院 Cesium官网例子GeoJSON and TopoJSON Cesium中监听MOUSE_MOVE事件获取经纬度和高度

-说明-

在cesium加载世界的geojson数据,鼠标移动显示对应的国家信息

-思路-

1、找到geojson文件,世界和中国 2、加载geojson文件 3、监听鼠标移动事件

-过程-

1、geojson文件

GeoJSON是一种对各种地理数据结构进行编码的格式,基于Javascript对象表示法(JavaScript Object Notation, 简称JSON)的地理空间信息数据交换格式。GeoJSON对象可以表示几何、特征或者特征集合。GeoJSON支持下面几何类型:点、线、面、多点、多线、多面和几何集合。GeoJSON里的特征包含一个几何对象和其他属性,特征集合表示一系列特征。 说白了,就是一种有着特殊写法的json文件,目前cesium直接加载json也可以,只要符合geojson的写法,这个是没有问题的。

2、加载geojson文件

将geojson文件下载到目录中,加载本地文件并显示

let zhongguoJSON = Cesium.GeoJsonDataSource.load("./china.json")
viewer.dataSources.add( zhongguoJSON );

3、监听鼠标移动事件

需要注意,点击事件和鼠标移动事件,获取的movement的参数不一致,不能直接拿过来使用

handler.setInputAction(function (movement) {
  var pickingEntity = viewer.scene.pick(movement.endPosition);
  console.log(pickingEntity)
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

4、调整代码

加载完的效果 加载GEOJSON的cesium 会发现有两点问题

  1. 部分叠加显示错误,这个应该是渲染的问题,具体我也不清楚,如果不显示区域,或者区域调成透明应该可以解决(正在解决)
  2. 部分详细的地方因为会加载单独的geojson,所以会出现重叠,选择的时候提示会提示选择了第一个geo和第二个geo,造成错乱,这部分直接将大geojson文件中的部分给删除即可,详细的geojson文件保留。
  3. 修改选中代码
let selectname = "" // 保存当前选择的名字

// mouse_move事件内代码
if(!pickingEntity) return false
if(pickingEntity.id._name == "China") return false
if(selectname == pickingEntity.id._name) return false
selectname = pickingEntity.id._name
console.log(pickingEntity.id._name)

-完整代码-

// 底图可以选择不使用天地图,使用其他网上地图或者本地地图
let tk = "" // 天地图秘钥,需要去天地图申请
const viewer = new Cesium.Viewer('cesiumContainer', {
    imageryProvider: new Cesium.WebMapTileServiceImageryProvider({
        url: 'http://t{s}.tianditu.com/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=${tk}',
        layer: "天地图影像",
        style: "default",
        format: "image/jpeg",
        subdomains: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18'],
        tileMatrixSetID: "GoogleMapsCompatible",
    }),
});

// 加载GEOJSON文件
let geo1JSON = Cesium.GeoJsonDataSource.load("./geo1.geojson") // 注意本地需要有geojson文件
let world = viewer.dataSources.add( geo1JSON );

// 加载GEOJSON文件
let geo2JSON = Cesium.GeoJsonDataSource.load("./geo2.json") // 注意本地需要有geojson文件
viewer.dataSources.add( geo2JSON );

let selectname = ""
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
  handler.setInputAction(function (movement) {
  var pickingEntity = viewer.scene.pick(movement.endPosition);
  if(!pickingEntity) return false

  if(pickingEntity.id._name == "China") return false
  if(selectname == pickingEntity.id._name) return false
  selectname = pickingEntity.id._name

  console.log(pickingEntity.id._name)
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);