cesium-examples/map/2d/OV.js

341 lines
9.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @Descripttion:
* @version: 1.0
* @Author: zhangti
* @Date: 2019-11-27 10:20:37
* @LastEditors : sueRimn
* @LastEditTime : 2020-01-17 17:38:21
*/
//常用配置
const CODEDIR = '/map/2d/code'; //code
const STATICDIR = '/map/2d/static'; //static 静态资源
const DATADIR = '/map/2d/data'; //data
const LIBSDIR = '/map/libs'; //lib包
/**
* 二维地图封装接口类
* 不含实际业务操作
* 辅助类
*/
import Tools from './code/Tools.js';
import HTML from './code/Html.js';
export default class OV {
static OSM_LAYER = {
layerName: 'OSM',
layerType: 'OSM',
isDefault: true,
opaque: true, //图层是否不透明
layerUrl: 'https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png'
}
static GOOGLE_LAYER = {
layerName: 'Google',
layerType: 'Google',
isDefault: true,
opaque: true, //图层是否不透明
layerUrl: 'http://www.google.cn/maps/vt?lyrs=m@189&gl=cn&x={x}&y={y}&z={z}'
}
static GAODE_LAYER = {
layerName: 'GaoDe',
layerType: 'GaoDe',
isDefault: true,
opaque: true, //图层是否不透明
layerUrl: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}'
}
constructor(dom,initOption){
if(!dom){
return false;
}
this.layers = [
OV.OSM_LAYER,
OV.GOOGLE_LAYER,
OV.GAODE_LAYER
]
return this.init(dom,initOption)
}
/**
* 加载资源
*/
init(dom,initOption){
return new Promise((resolve,reject)=>{
new Read().load((res) =>{
console.log(res);
this.initolMap(dom,initOption);
resolve(this);//返回当前对象
});
})
}
/**
* 初始化地图
* @param {*} dom
* @param {*} opt
*/
initolMap(dom,opt){
let baseLayers = opt.layer ?opt.layer: this.layers;
this.omap = new HMap(dom, {
controls: {
loading: opt.loading == undefined? true : opt.loading,
zoomSlider: opt.zoomSlider == undefined? true : opt.zoomSlider,
fullScreen: opt.fullScreen == undefined? true : opt.fullScreen,
rotate: opt.rotate == undefined? true : opt.rotate,
zoomCtl: opt.zoomCtl == undefined? false : opt.zoomCtl,
overviewMap:opt.overviewMap == undefined? false : opt.overviewMap,
},
interactions: {
shiftDragZoom: false
},
view: {
center: opt.center == undefined?[101.4173, 37.9204]:opt.center,
projection: 'EPSG:4326',
zoom: opt.zoom == undefined? 5 : opt.zoom
},
baseLayers: baseLayers
});
}
/**
* 初始化标绘
*/
initPlot(){
/* eslint-disable-next-line */
this.plot = new olPlot(this.omap.getMap(), {
zoomToExtent: true
});
//事件监听
this.omap.on('click',(event)=>{
const feature = this.omap.forEachFeatureAtPixel(event.pixel, function (feature) {
return feature
})
if (feature && feature.get('isPlot') && !this.plot.plotDraw.isDrawing()) {
this.plot.plotEdit.activate(feature)
} else {
this.plot.plotEdit.deactivate()
}
});
// 绘制结束后添加到FeatureOverlay显示。
this.plot.plotDraw.on('drawEnd', (event)=>{
const feature = event.feature
this.plot.plotEdit.activate(feature)
})
this.plot.plotDraw.on('active_textArea', (event)=> {
const style = this.plot.plotUtils.getPlotTextStyleCode(event.overlay)
console.log(style)
})
// 指定标绘类型,开始绘制。
this.plot.activate = function (type){ //plot对象
this.plotEdit.deactivate()
this.plotDraw.active(type)
}
this.plot.getFeatures = function(){ //plot对象
const features = this.plotUtils.getFeatures()
console.log(JSON.stringify(features))
this.plotUtils.removeAllFeatures()
this.plotEdit.deactivate()
this.plotUtils.addFeatures(features)
};
return this.plot;
}
/**
* 底图切换
*/
layerSwitch(){
this.omap.on('loadMapSuccess', (event) => {
if (event) {
var config_ = [
{
layerName: 'GaoDe',
name: '高德地图',
icon: STATICDIR + '/img/maptype_vector.png'
},
{
layerName: 'OSM',
name: 'OSM',
icon: STATICDIR + '/img/maptype_pano.png'
},
{
layerName: 'Google',
name: '谷歌地图',
icon: STATICDIR + '/img/maptype_yunran.png'
}
]
var LayerSwitcher = new ol.control.LayerSwitcher({
itemWidth: 86,
itemHeight: 60,
layers: config_
})
this.omap.addControl(LayerSwitcher)
var tt = this.omap.getLayersArrayByKeyValue('isBaseLayer', true) // polyfill
LayerSwitcher.baseLayers_ = tt
console.log(tt)
}
})
}
/**
* 比例尺
*/
ScaleLineH(){
var controlScaleLine = new ol.control.ScaleLineH({
units: 'metric_cn'
})
this.omap.addControl(controlScaleLine)
}
/**
* 鼠标移动信息
*/
mouseInfo(){
var controlMousePosition = new ol.control.MousePositionH({})
this.omap.addControl(controlMousePosition)
}
/**
* 地图对比
*/
compareLayer(){
var layer1 = this.omap.getLayerByLayerName('GaoDe')
var layer2 = this.omap.getLayerByLayerName('Google')
var olControlCompareLayer = new ol.control.CompareLayer(layer1, layer2)
this.omap.addControl(olControlCompareLayer)
}
/**
* 量测
*/
initMeasure(){
var measureTool = new ol.interaction.MeasureTool()
this.omap.addInteraction(measureTool)
return measureTool;
}
/**
* 加载geojson数据
* 自定义
*/
loadGeoJson(url,opt){
let _self = this,data = [];
let draw = function (event) {
var context = event.context;
context.save();
context.globalAlpha = 1;
context.fillStyle = '#08304b';
for (var i = 0; i < data.length; i++) {
var coords = data[i].geometry.coordinates[0];
for (let j = 0; j < coords.length; j++) {
const point = _self.omap.getPixelFromCoordinate(ol.proj.transform([coords[j][1], coords[j][0]], 'EPSG:4326', 'EPSG:3857'));
if (j === 0) {
context.beginPath();
context.moveTo(point[0], point[1]);
} else {
context.lineTo(point[0], point[1]);
}
}
context.fill();
}
context.restore();
}
let canvas = new ol.layer.CanvasLayer({
map: _self.omap.getMap(),
projection: 'EPSG:3857',
render: draw
});
fetch(DATADIR + url, {method: 'GET'}).then(function(response) {
return response.json();
}).then(function(json) {
data = json.features;
_self.omap.addLayer(canvas);
}).catch(function (error) {
console.error(error)
});
}
/**
* 场景树
* @param {c} trees
*/
sceneTree(trees){
if(this.Tools.nullBool(trees)){
console.log("使用默认场景!");
return false;
}
//生成底图切换
if(trees.layerSwitch != undefined){
if(trees.layerSwitch){
this.mapmap.layerSwitch();
}
}
//鹰眼
if(trees.scaleLineH != undefined){
if(trees.scaleLineH){
this.mapmap.ScaleLineH();
}
}
}
}
/**
* @file ready
* @version 1.0
* ready 类
* 加载异步资源
* */
var $self; //当前页面
class Read {
static URLS = {
useJS : [
CODEDIR + '/ol-plot.js',
LIBSDIR + '/jquery/3.1.1/jquery.min.js',
LIBSDIR + '/dat.gui.min.js',
LIBSDIR + '/JSLite.js'
],
useCSS : [
STATICDIR + '/css/ol-plot.css',
STATICDIR + '/css/iconfont.css',
]
}
constructor(){
/**
* 初始化
*/
this.Tools = new Tools();
this.Html = new HTML();
$self = this;
}
/**
* 加载资源方案
* @param {*} resolve
* @param {*} reject
*/
loadUse(resolve, reject){
$self.Tools.arrForEach(Read.URLS.useCSS, function (url, index) {
$self.Html.loadCSS(url);
});
$self.Tools.arrForEach(Read.URLS.useJS, function (url, index) {
$self.Html.loadJS(url);
if(index == Read.URLS.useJS.length - 1){
setTimeout(() => {
resolve('-- 2d load --'); //结束出发回调事件
}, 100);
}
});
}
/**
* 加载
*/
load(call){
let pro1 = new Promise((resolve, reject) => {
this.Html.loadCSS(STATICDIR + '/css/hmap.css');
let map = this.Html.loadJS(CODEDIR + '/hmap.js');
map.onload = function(){resolve('loadOl');}
});
pro1.then(res => {
setTimeout(() => {
let pro2 = new Promise(this.loadUse);
pro2.then((res)=>{call(res)});
},50)
});
}
};