Iframe
当Vue项目需要使用到cesium时,可以使用iframe标签进行开发
- 在static下面新建目录
- 引入Cesium.js文件
- 导入方法文件
- createGdMap.js代码
const BD_FACTOR = (3.14159265358979324 * 3000.0) / 180.0
const PI = 3.1415926535897932384626
const RADIUS = 6378245.0
const EE = 0.00669342162296594323
class GdTilingScheme extends Cesium.WebMercatorTilingScheme {
constructor(options) {
super(options)
let projection = new Cesium.WebMercatorProjection()
this._projection.project = function(cartographic, result) {
result = CoordTransform.WGS84ToGCJ02(
Cesium.Math.toDegrees(cartographic.longitude),
Cesium.Math.toDegrees(cartographic.latitude)
)
result = projection.project(
new Cesium.Cartographic(
Cesium.Math.toRadians(result[0]),
Cesium.Math.toRadians(result[1])
)
)
return new Cesium.Cartesian2(result.x, result.y)
}
this._projection.unproject = function(cartesian, result) {
let cartographic = projection.unproject(cartesian)
result = CoordTransform.GCJ02ToWGS84(
Cesium.Math.toDegrees(cartographic.longitude),
Cesium.Math.toDegrees(cartographic.latitude)
)
return new Cesium.Cartographic(
Cesium.Math.toRadians(result[0]),
Cesium.Math.toRadians(result[1])
)
}
class CoordTransform {
static BD09ToGCJ02(lng, lat) {
let x = +lng - 0.0065
let y = +lat - 0.006
let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * BD_FACTOR)
let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * BD_FACTOR)
let gg_lng = z * Math.cos(theta)
let gg_lat = z * Math.sin(theta)
return [gg_lng, gg_lat]
}
static GCJ02ToBD09(lng, lat) {
lat = +lat
lng = +lng
let z =
Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * BD_FACTOR)
let theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * BD_FACTOR)
let bd_lng = z * Math.cos(theta) + 0.0065
let bd_lat = z * Math.sin(theta) + 0.006
return [bd_lng, bd_lat]
}
static WGS84ToGCJ02(lng, lat) {
lat = +lat
lng = +lng
if (this.out_of_china(lng, lat)) {
return [lng, lat]
} else {
let d = this.delta(lng, lat)
return [lng + d[0], lat + d[1]]
}
}
static GCJ02ToWGS84(lng, lat) {
lat = +lat
lng = +lng
if (this.out_of_china(lng, lat)) {
return [lng, lat]
} else {
let d = this.delta(lng, lat)
let mgLng = lng + d[0]
let mgLat = lat + d[1]
return [lng * 2 - mgLng, lat * 2 - mgLat]
}
}
static delta(lng, lat) {
let dLng = this.transformLng(lng - 105, lat - 35)
let dLat = this.transformLat(lng - 105, lat - 35)
const radLat = (lat / 180) * PI
let magic = Math.sin(radLat)
magic = 1 - EE * magic * magic
const sqrtMagic = Math.sqrt(magic)
dLng = (dLng * 180) / ((RADIUS / sqrtMagic) * Math.cos(radLat) * PI)
dLat = (dLat * 180) / (((RADIUS * (1 - EE)) / (magic * sqrtMagic)) * PI)
return [dLng, dLat]
}
static transformLng(lng, lat) {
lat = +lat
lng = +lng
let ret =
300.0 +
lng +
2.0 * lat +
0.1 * lng * lng +
0.1 * lng * lat +
0.1 * Math.sqrt(Math.abs(lng))
ret +=
((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) *
2.0) /
3.0
ret +=
((20.0 * Math.sin(lng * PI) + 40.0 * Math.sin((lng / 3.0) * PI)) * 2.0) /
3.0
ret +=
((150.0 * Math.sin((lng / 12.0) * PI) +
300.0 * Math.sin((lng / 30.0) * PI)) *
2.0) /
3.0
return ret
}
static transformLat(lng, lat) {
lat = +lat
lng = +lng
let ret =
-100.0 +
2.0 * lng +
3.0 * lat +
0.2 * lat * lat +
0.1 * lng * lat +
0.2 * Math.sqrt(Math.abs(lng))
ret +=
((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) *
2.0) /
3.0
ret +=
((20.0 * Math.sin(lat * PI) + 40.0 * Math.sin((lat / 3.0) * PI)) * 2.0) /
3.0
ret +=
((160.0 * Math.sin((lat / 12.0) * PI) +
320 * Math.sin((lat * PI) / 30.0)) *
2.0) /
3.0
return ret
}
static out_of_china(lng, lat) {
lat = +lat
lng = +lng
return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55)
}
}
}
}
class GdMap extends Cesium.UrlTemplateImageryProvider {
constructor(options = {}) {
options.subdomains = ['01', '02', '03', '04']
options.tilingScheme = new GdTilingScheme()
super(options)
}
}
- 编写HTML页面
- 官网申请天地图key,初始化地图
function init () { viewer = new Cesium.Viewer('cesiumContainer',{ selectionIndicator: false, contextOptions:{ webgl : { alpha : true, depth : true, stencil : false, antialias: true } }, shadows: true, animation: false, //是否显示动画控件 baseLayerPicker: false, //是否显示图层选择控件 geocoder: false, //是否显示地名查找控件 timeline: false, //是否显示时间线控件 sceneModePicker: false, //是否显示投影方式控件 navigationHelpButton: false, //是否显示帮助信息控件 infoBox: false, //是否显示点击要素之后显示的信息 imageryProvider:false, fullscreenButton: false, homeButton:false }) viewer.scene.morphTo2D(0) viewer.cesiumWidget.creditContainer.style.display = "none"; viewer.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(112.99, 28.2, 200000.3623875733) }) }
- 写添加基础图层方法
//编写方法 function addGd (url) { const gdLayer = new GdMap({url}) viewer.imageryLayers.addImageryProvider(gdLayer) }
- 调用函数
//地图初始化 init() //添加地图图层 addGd('https://t1.tianditu.gov.cn/img_w/wmts?Service=WMTS&Request=GetTile&Version=1.0.0&Style=Default&Format=tiles&serviceMode=KVP&layer=img&TileMatrixSet=w&TileMatrix={z}&TileRow={y}&TileCol={x}&tk=6c6c18e4ec555ea8f0976ec71960021f') addGd('https://t1.tianditu.gov.cn/cia_w/wmts?Service=WMTS&Request=GetTile&Version=1.0.0&Style=Default&Format=tiles&serviceMode=KVP&layer=cia&TileMatrixSet=w&TileMatrix={z}&TileRow={y}&TileCol={x}&tk=6c6c18e4ec555ea8f0976ec71960021f')
- 完整代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"> <!-- Use Chrome Frame in IE --> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> //导入Cesium文件 <link href="./Cesium/Widgets/widgets.css" rel="stylesheet"> <script type="text/javascript" src="./Cesium/Cesium.js"></script> //导入jquery文件 <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> //导入createGdMap.js文件 <script type="text/javascript" src="./common/createGdMap.js"></script> </head> <body> <style> html, body, #cesiumContainer { width: 100%; height: 98%; margin: 0; padding: 0; overflow: hidden; } canvas { width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden; } </style> <span> </span> <div id="cesiumContainer" class="fullSize"></div> </body> <script type="text/javascript"> var viewer = null init() //天地图影像 addGd('https://t1.tianditu.gov.cn/img_w/wmts?Service=WMTS&Request=GetTile&Version=1.0.0&Style=Default&Format=tiles&serviceMode=KVP&layer=img&TileMatrixSet=w&TileMatrix={z}&TileRow={y}&TileCol={x}&tk=6c6c18e4ec555ea8f0976ec71960021f') //天地图注记 addGd('https://t1.tianditu.gov.cn/cia_w/wmts?Service=WMTS&Request=GetTile&Version=1.0.0&Style=Default&Format=tiles&serviceMode=KVP&layer=cia&TileMatrixSet=w&TileMatrix={z}&TileRow={y}&TileCol={x}&tk=6c6c18e4ec555ea8f0976ec71960021f') function init () { viewer = new Cesium.Viewer('cesiumContainer',{ selectionIndicator: false, contextOptions:{ webgl : { alpha : true, depth : true, stencil : false, antialias: true } }, shadows: true, animation: false, //是否显示动画控件 baseLayerPicker: false, //是否显示图层选择控件 geocoder: false, //是否显示地名查找控件 timeline: false, //是否显示时间线控件 sceneModePicker: false, //是否显示投影方式控件 navigationHelpButton: false, //是否显示帮助信息控件 infoBox: false, //是否显示点击要素之后显示的信息 imageryProvider:false, fullscreenButton: false, homeButton:false }) viewer.scene.morphTo2D(0) viewer.cesiumWidget.creditContainer.style.display = "none"; viewer.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(112.99, 28.2, 200000.3623875733) }) } //编写方法 function addGd (url) { const gdLayer = new GdMap({url}) viewer.imageryLayers.addImageryProvider(gdLayer) } </script> </html>
- 使用其他服务调用方法
function addcanvas () { viewer= new Cesium.WebMapTileServiceImageryProvider({ url: '服务地址', layer: '服务名称', style: 'default', format: 'image/webp', tileWidth: 256, tileHeight: 256, tilingScheme: new Cesium.GeographicTilingScheme(), tileMatrixLabels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"] }) viewer.imageryLayers.addImageryProvider(viewer) }
- 地理定位
- 搜索并调用天地图地理定位
天地图搜索接口:
http://api.tianditu.gov.cn/search?postStr={"keyWord":"${keyWord}","level":"15","mapBound":"116.40569,39.91088,116.45119,39.93542","queryType":"7","count":"1","start":"0","queryTerminal":"10000"}&type=query&tk=6c6c18e4ec555ea8f0976ec71960021f
keyword:搜索关键字
mapBound:搜索范围
tk替换成申请的token
ajax发送请求
$.ajax({
url:`http://api.tianditu.gov.cn/search?postStr={"keyWord":"${keyWord}","level":"15","mapBound":"116.40569,39.91088,116.45119,39.93542","queryType":"7","count":"1","start":"0","queryTerminal":"10000"}&type=query&tk=6c6c18e4ec555ea8f0976ec71960021f`,
type: 'get',
async: false,
success: function (response) {
if (response.pois === undefined) {
alert('无法获取地理位置!');
} else {
//定位到搜索地
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees('坐标经度', 坐标纬度, 摄像头高度),
orientation: {
heading: Cesium.Math.toRadians(0.0),
pitch: Cesium.Math.toRadians(-90.0),
roll: 0.0,
},
});
}
}
});
- 添加点击事件
function getClickPointAdd(_viewer) { // 注册屏幕点击事件 let handler = new Cesium.ScreenSpaceEventHandler(_viewer.scene.canvas); handler.setInputAction(function(event) { if (window.lnglatarr.length===0){ // 转换为不包含地形的笛卡尔坐标 let clickPosition = _viewer.scene.camera.pickEllipsoid(event.position); // 转经纬度(弧度)坐标 let radiansPos = Cesium.Cartographic.fromCartesian(clickPosition); // 转角度 lnglat.lng=Cesium.Math.toDegrees(radiansPos.longitude) lnglat.lat=Cesium.Math.toDegrees(radiansPos.latitude) lnglatarr.push(lnglat) console.log(lnglat) // 添加点 _viewer.entities.add({ id:'one', position: clickPosition, billboard: { // 图片 image: "./img/坐标-fill.png", // 图片大小 width: 25, height: 30, }, }) }else if (window.lnglatarr.length>0){ viewer.entities.removeAll(); lnglatarr=[] // 转换为不包含地形的笛卡尔坐标 let clickPosition = _viewer.scene.camera.pickEllipsoid(event.position); // 转经纬度(弧度)坐标 let radiansPos = Cesium.Cartographic.fromCartesian(clickPosition); // 转角度 lnglat.lng=Cesium.Math.toDegrees(radiansPos.longitude) lnglat.lat=Cesium.Math.toDegrees(radiansPos.latitude) lnglatarr.push(lnglat) console.log(lnglatarr) // 添加点 _viewer.entities.add({ id:'two', position: clickPosition, billboard: { // 图片 image: "./img/坐标-fill.png", // 图片大小 width: 25, height: 30, }, }) } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); }
通过点击把图标添加到画布上
以上为这个星期的总结还有其他问题正在研究当中