上一章提到Cesium添加json格式数据的三种方式,在部分主要讲shp转换为json格式的工具和应用案列。
案例中用到的中国省界地图的shp格式数据可在此处下载:http://download.csdn.net/download/baidu_34304646/9991998
一、shp转换成json格式
此处整理了两种shp转为json格式的方式:一是使用工具;二是使用ArcGIS进行转换。
在转换之前先做一些准备工作:
第一步:使用ArcGIS将shp文件的地理坐标设置为WGS_198484并导出为shp数据。
1、打开ArcGIS的Toolbox工具箱,选择“定义投影”:
2、选择要转换的shp格式文件并选择地理坐标为 WGS_1984,单击确认。
3、将数据导出。
开始转换:
方法一:
第一步:打开网站http://www.mapshaper.org/
第二步:点击select按钮,选择目标shp图层
第三步:确认,inport导入:
第四步:点击右上角的export,选择GeoJson ,输入encoding=utf8,点击export,方法一转换完成:
方法二:
第一步:打开ArcGIS的Toolbox工具,选择转换工具中的要素转JSON,并选择前面设置过地理坐标的shp文件:
至此,已使用两种方式将shp格式数据转换为json格式数据。
二、Cesium添加geoJson数据(以中国省界数据为例)
第一步:添加Cesium的底图数据并在图层上叠加各国夜晚灯光亮度图:
var viewer = new Cesium.Viewer('cesiumContainer', {
imageryProvider:newCesium.ArcGisMapServerImageryProvider({
url:'https://server.arcgisonline.com/arcgis/rest/services/World_Terrain_Base/MapServer'
}),
baseLayerPicker:true//地图切换控件(底图以及地形图)是否显示,默认显示true
});
var layers = viewer.imageryLayers;
//添加各国夜晚灯光亮度图
var blackMarble =layers.addImageryProvider(Cesium.createTileMapServiceImageryProvider({
url: 'https://cesiumjs.org/blackmarble',
credit: 'Black Marble imagery courtesy NASA EarthObservatory',
flipXY: true // Only old gdal2tile.py generatedtilesets need this flag.
}));
blackMarble.alpha = 0.5; //透明度
blackMarble.brightness = 1.5; //亮度
第二步:使用前一篇文章中提到的Cesium添加GEOjson数据的方式,将前面转换得到的json格式中国省界数据叠加到Cesium的底图上。
//添加geojson格式地理数据(由shp格式文件转换得来)
Cesium.Math.setRandomNumberSeed(0);
var promise =Cesium.GeoJsonDataSource.load('Output_bou2_4p.json');
promise.then(function (dataSource) {
viewer.dataSources.add(dataSource);
var entities =dataSource.entities.values;
var colorHash = {};
for (var i = 0; i < entities.length;i++) {
var entity = entities[i];
var name = entity.name;
var color = colorHash[name];
if (!color) {
color =Cesium.Color.fromRandom({
alpha: 1.0
});
colorHash[name] = color;
}
entity.polygon.material = color;
entity.polygon.outline = false;
entity.polygon.extrudedHeight =5000.0;
}
});
viewer.flyTo(promise);
第三步:运行得到效果图:
延伸:如果shp格式文件中有包含各个面的面积或者周长的话,通过一下代码使得加载出来的json数据呈立体形状(因为此处省界数据)中没有各省的面积和周长的完整数据,就不再演示:
entity.polygon.extrudedHeight= entity.properties.Shape_Area / 100000.0;