ts代码:
import { Feature, Overlay } from 'ol';
import { Point, Polygon, LineString, Circle as GeomCircle } from 'ol/geom';
import { Vector as LayerVector } from 'ol/layer';
import { Style, Stroke, Circle, Fill } from 'ol/style';
import { Vector } from 'ol/source';
import { WKT } from 'ol/format';
import { fromLonLat } from 'ol/proj';
import d from '../assets/201929';
export default class Typhoon {
_map: any;
_speed: Number = 200;
_forcColorDict: any = {
中国: '#ec5d72',
中国香港: '#ec7cfe',
中国台湾: '#ecaa65',
日本: '#56f66e',
美国: '#53dbfe',
韩国: '#72a4ac',
欧洲: '#4c54a6',
};
_typhoonList: any = [];
_typhoonData: any = {};
_nameOverlays: any = {};
_typhoonPlayFlag: any = {};
_typhoonPlayIndex: any = {};
_warnLines: any = null;
_typhoonLayers: any = {};
_forecastFeatures: any = {};
_typhoonCircle: any = [];
wktformat:any = new WKT();
constructor(map: any) {
this._map = map;
}
init = () => {
// 添加警戒线
this.addWarnLine();
// 添加地图事件
this.addMapEvent();
this.showTyphoon(d.data[0]);
// 获取台风数据
// $.get('../../data/201929.json', (res) => {
// _typhoonList = res;
// showTyphoon(_typhoonList[0]);
// });
};
addWarnLine = () => {
const warnLineData = [
{
color: 'blue',
weight: 1,
opacity: 0.8,
dashArray: [0, 0],
points: [
[105, 0],
[113, 4.5],
[119, 11],
[119, 18],
[127, 22],
[127, 34],
],
},
{
color: 'green',
weight: 1,
opacity: 0.8,
dashArray: [10, 5],
points: [
[105, 0],
[120, 0],
[132, 15],
[132, 34],
],
},
];
const features = [];
for (var i = 0; i < warnLineData.length; i++) {
const d = warnLineData[i];
const geometry = new LineString(d.points);
geometry.transform('EPSG:4326', this._map.getView().getProjection());
const feature = new Feature({
geometry: geometry,
attr: d,
});
features.push(feature);
}
const source = new Vector({
features: features,
});
this._warnLines = new LayerVector({
source: source,
style: this.warnLineStyle,
opacity: 0.8,
});
this._map.addLayer(this._warnLines);
};
// 警戒线样式设置
warnLineStyle = (feat: any) => {
const attr = feat.get('attr');
return new Style({
stroke: new Stroke({
color: attr.color,
width: attr.weight,
lineDash: attr.dashArray,
}),
});
};
// 添加地图事件
addMapEvent = () => {
// 鼠标移动事件
this._map.on('pointermove', (evt: any) => {
const pixel = evt.pixel;
const dom = this._map.getTargetElement();
if (this._map.hasFeatureAtPixel(pixel)) {
dom.style.cursor = 'pointer';
const features = this._map.getFeaturesAtPixel(pixel);
const feature = features[0];
// console.log(feature.get('attr'));
} else {
dom.style.cursor = 'default';
}
});
this._map.on('click', (evt: any) => {
const pixel = evt.pixel;
if (this._map.hasFeatureAtPixel(pixel)) {
const features = this._map.getFeaturesAtPixel(pixel);
const feature = features[0];
const attr = feature.get('attr');
this._typhoonPlayIndex[attr.tfbh] = attr.index;
this.showForecast(attr.tfbh, attr);
}
});
};
// 展示台风
showTyphoon = (typhoonData: any) => {
const tfbh = typhoonData.tfbh;
this._typhoonData[tfbh] = typhoonData;
// 1. 添加台风名称
this.addNameOverlay(typhoonData);
// 2. 创建展示图层
this.addTyphoonLayer(tfbh);
// 3.开始播放
this.playTyphoon(tfbh);
};
// 移除台风
removeTyphoon = (tfbh: any) => {
// 删除台风名称
this._map.removeOverlay(this._nameOverlays[tfbh]);
// 删除展示图层
this._map.removeLayer(this._typhoonLayers[tfbh].layer);
// 消除定时器
clearInterval(this._typhoonPlayFlag[tfbh]);
};
// 添加台风名称
addNameOverlay = (typhoonData: any) => {
const nameDom = document.createElement('div');
nameDom.setAttribute('class', 'typhoon-name');
nameDom.innerHTML = typhoonData.name;
const pointStart = typhoonData.points[0];
// const position = fromLonLat([
// pointStart.longitude,
// pointStart.latitude,
// ]);
const nameOverlay = new Overlay({
element: nameDom,
position: [pointStart.longitude, pointStart.latitude],
positioning: 'center-left',
offset: [15, 0],
});
this._map.addOverlay(nameOverlay);
this._nameOverlays[typhoonData.tfbh] = nameOverlay;
this._typhoonCircle[typhoonData.tfbh]=this.drawTyphoonCircle(pointStart.longitude, pointStart.latitude);//台风圈
};
/**
* 绘制台风圈
*/
drawTyphoonCircle = (x: any, y: any) => {
/** 台风配置 */
var Configs = {
// CIRCLE_CENTER_X:104.21390114106414,
// CIRCLE_CENTER_Y:35.847595169932646,
CIRCLE_CENTER_X: x,
CIRCLE_CENTER_Y: y,
CIRCLE_R: {
"SE": 0.5,
"NE": 0.3,
"NW": 0.2,
"SW": 0.5
}
};
/** 台风算法 */
var wkt = "POLYGON((";
var wkt0 = "", _interval = 6;
for (var i = 0; i < 360 / _interval; i++) {
var _r = 0;
var _ang = i * _interval;
if (_ang > 0 && _ang <= 90) {
_r = Configs.CIRCLE_R.NE;
}
else if (_ang > 90 && _ang <= 180) {
_r = Configs.CIRCLE_R.NW;
}
else if (_ang > 180 && _ang <= 270) {
_r = Configs.CIRCLE_R.SW;
}
else {
_r = Configs.CIRCLE_R.SE;
}
var x = Configs.CIRCLE_CENTER_X + _r * Math.cos(_ang * 3.14 / 180);
var y = Configs.CIRCLE_CENTER_Y + _r * Math.sin(_ang * 3.14 / 180);
wkt = wkt + "" + x + " " + y + ", ";
if (i === 0) {
wkt0 = "" + x + " " + y + "";
}
}
wkt = wkt + wkt0 + "))";
var features = new Array();
features.push(this.wktformat.readFeature(wkt));
features.push(this.wktformat.readFeature("POINT(" + Configs.CIRCLE_CENTER_X + " " + Configs.CIRCLE_CENTER_Y + ")"));
var styleFunc = (feature: any, resolution: any) => {
return new Style({
fill: new Fill({
color: 'rgba(255, 0, 0, 0.2)'
}),
stroke: new Stroke({
color: '#ffcc33',
width: 2
}),
image: new Circle({
radius: 4,
fill: new Fill({
color: '#ff0000'
})
})
});
};
var layerVector = new LayerVector({
source: new Vector({
features: features,
}),
style: styleFunc
});
this._map.addLayer(layerVector);
return layerVector;
};
/**
* 删除台风圈
* @param tfbh 分组名称
*/
removeTyphoonCircle = (tfbh: any)=>{
// const source = this._typhoonCircle[tfbh].getSource();
// source.removeFeature(this._typhoonCircle[tfbh]);
this._typhoonCircle[tfbh].getSource().clear();
this._map.removeLayer(this._typhoonCircle[tfbh]);
}
// 根据编号添加台风图层
addTyphoonLayer = (tfbh: any) => {
const source = new Vector({
features: [],
});
const layer = new LayerVector({
source: source,
style: this.typhoonStyle,
});
this._map.addLayer(layer);
this._typhoonLayers[tfbh] = {
source: source,
layer: layer,
};
this._forecastFeatures[tfbh] = [];
};
// 播放台风
playTyphoon = (tfbh: any) => {
let index = 0;
const typhoonData = this._typhoonData[tfbh];
this.play(index, tfbh);
this._typhoonPlayFlag[tfbh] = setInterval(() => {
index++;
if (index === typhoonData.points.length) {
clearInterval(this._typhoonPlayFlag[tfbh]);
} else {
this.play(index, tfbh);
}
}, 200);
};
// 播放单个点
play = (index: any, tfbh: any) => {
// 删除预报
this.removeForecast(tfbh);
this.removeTyphoonCircle(tfbh);
this._map.removeLayer(this._typhoonCircle[tfbh]);
this._typhoonPlayIndex[tfbh] = index;
const points = this._typhoonData[tfbh].points;
const point = points[index];
point.type = 'live';
point.index = index;
point.tfbh = tfbh;
if (index > 0) {
const prePoint = points[index - 1];
point.start = [prePoint.longitude, prePoint.latitude];
}
point.end = [point.longitude, point.latitude];
//const position = fromLonLat(point.end);
const position = point.end;
//点的数据设置
const feature = new Feature({
geometry: new Point(position),
attr: point,
});
this._typhoonLayers[tfbh].source.addFeature(feature);
this._typhoonCircle[tfbh]=this.drawTyphoonCircle(point.longitude, point.latitude);//台风圈
// console.log("输出数据", this._typhoonCircle[tfbh].getSource().getFeatures()[0].getGeometry());
// this._typhoonCircle[tfbh].getSource().getFeatures()[0].getGeometry().setCoordinates(feature);
// debugger;
console.log("分类保存的台风圈");
// 最后一个实况点,展示预报路径
if (index === this._typhoonData[tfbh].points.length - 1) {
this.showForecast(tfbh, point);
}
};
// 删除预报数据
removeForecast = (tfbh: any) => {
const source = this._typhoonLayers[tfbh].source;
for (var i = 0; i < this._forecastFeatures[tfbh].length; i++) {
const f = this._forecastFeatures[tfbh][i];
source.removeFeature(f);
}
this._forecastFeatures[tfbh] = [];
};
// 展示预报数据
showForecast = (tfbh: any, livePoint: any) => {
const source = this._typhoonLayers[tfbh].source;
// 1. 删除预报数据
this.removeForecast(tfbh);
// 2. 添加预报
const forecast = livePoint.forecast;
const features = [];
for (var i = 0; i < forecast.length; i++) {
const f = forecast[i];
for (var j = 0; j < f.points.length; j++) {
const point = f.points[j];
const prePoint = f.points[j - 1];
point.sets = f.sets;
point.type = 'forc';
point.index = j;
point.start =
j === 0
? [livePoint.longitude, livePoint.latitude]
: [prePoint.longitude, prePoint.latitude];
point.end = [point.longitude, point.latitude];
//const coords = fromLonLat(point.end);
const coords = point.end;
const feature = new Feature({
geometry: new Point(coords),
attr: point,
});
features.push(feature);
}
}
source.addFeatures(features);
this._forecastFeatures[tfbh] = features;
};
// 根据风速获取点的颜色
getPointColor = (speed: any) => {
let _color = '';
if (speed >= 10.8 && speed < 17.2) {
_color = 'rgba(153, 255, 153, .9)';
} else if (speed >= 17.2 && speed < 24.5) {
_color = 'rgba(102, 204, 255, .9)';
} else if (speed >= 24.5 && speed < 32.7) {
_color = 'rgba(255, 255, 102, .9)';
} else if (speed >= 32.7 && speed < 41.5) {
_color = 'rgba(253, 139, 0, .9)';
} else if (speed >= 41.5 && speed < 50.1) {
_color = 'rgba(255, 51, 0, .9)';
} else {
_color = 'rgba(255, 0, 255, .9)';
}
return _color;
};
// 台风展示样式
typhoonStyle = (feat: any) => {
const attr = feat.get('attr');
const speed = 12; //attr.speed;
const type = attr.type;
const index = attr.index;
const color = this.getPointColor(speed);
let styles = [];
// 点的样式
const radius = type === 'live' ? 4 : 3;
const pointStyle = new Style({
image: new Circle({
radius: radius,
fill: new Fill({
color: color,
}),
stroke: new Stroke({
color: 'rgba(0, 0, 0, 0.6)',
width: 1,
}),
}),
});
styles.push(pointStyle);
if (type === 'live' && index === this._typhoonPlayIndex[attr.tfbh]) {
const center = feat.get('geometry').getCoordinates();
const fillStyle = new Fill({
color: 'rgba(0, 0, 0, 0.2)',
});
// 7级风圈的样式
if (attr.radius7 > 0) {
const geometry: any = this.getCircleGeometry(center, attr.radius7_quad);
const style = new Style({
geometry: geometry,
stroke: new Stroke({
color: '#00bab2',
width: 1,
}),
fill: fillStyle,
});
styles.push(style);
}
// 10级风圈的样式
if (attr.radius10 > 0) {
const geometry: any = this.getCircleGeometry(
center,
attr.radius10_quad
);
const style = new Style({
geometry: geometry,
stroke: new Stroke({
color: '#ffff00',
width: 1,
}),
fill: fillStyle,
});
styles.push(style);
}
// 12级风圈的样式
if (attr.radius12 > 0) {
const geometry: any = this.getCircleGeometry(
center,
attr.radius12_quad
);
const style = new Style({
geometry: geometry,
stroke: new Stroke({
color: '#da7341',
width: 1,
}),
fill: fillStyle,
});
styles.push(style);
}
}
// 线的样式
const start = attr.start;
const end = attr.end;
const lineColor = this.getLineColor(type, attr.sets);
const lineDash = type === 'live' ? [0] : [8];
const lineWidth = type === 'live' ? 2 : 1;
if (start && start.length > 0) {
const coords = [start, end];
const geometry = new LineString(coords);
geometry.transform('EPSG:4326', this._map.getView().getProjection());
const lineStyle = new Style({
geometry: geometry,
stroke: new Stroke({
color: lineColor,
width: lineWidth,
lineDash: lineDash,
}),
});
styles.push(lineStyle);
}
return styles;
};
// 获取线的颜色
getLineColor = (type: any, sets: any) => {
if (type === 'live') {
return 'rgba(0, 0, 0, .6)';
} else {
let color = this._forcColorDict[sets];
if (!color) color = 'rgba(0, 0, 0, .3)';
return color;
}
};
getCircleGeometry = (center: any, radiusData: any) => {
if (typeof radiusData === 'number') {
return new GeomCircle(center, radiusData * 1000);
} else {
if (radiusData['ne']) {
let _coords = [];
let _angInterval = 6;
let _pointNums = 360 / (_angInterval * 4);
let quadrant: any = {
// 逆时针算角度
'0': 'ne',
'1': 'nw',
'2': 'sw',
'3': 'se',
};
for (let i = 0; i < 4; i++) {
let _r = parseFloat(radiusData[quadrant[i]]) * 1000; // 单位是km
if (!_r) _r = 0;
for (let j = i * _pointNums; j <= (i + 1) * _pointNums; j++) {
let _ang = _angInterval * j;
let x = center[0] + _r * Math.cos((_ang * Math.PI) / 180);
let y = center[1] + _r * Math.sin((_ang * Math.PI) / 180);
_coords.push([x, y]);
}
}
return new Polygon([_coords]);
} else {
return null;
}
}
};
}js代码
"use strict";
exports.__esModule = true;
var ol_1 = require("ol");
var geom_1 = require("ol/geom");
var layer_1 = require("ol/layer");
var style_1 = require("ol/style");
var source_1 = require("ol/source");
var format_1 = require("ol/format");
var _201929_1 = require("../assets/201929");
var Typhoon = /** @class */ (function () {
function Typhoon(map) {
var _this = this;
this._speed = 200;
this._forcColorDict = {
中国: '#ec5d72',
中国香港: '#ec7cfe',
中国台湾: '#ecaa65',
日本: '#56f66e',
美国: '#53dbfe',
韩国: '#72a4ac',
欧洲: '#4c54a6'
};
this._typhoonList = [];
this._typhoonData = {};
this._nameOverlays = {};
this._typhoonPlayFlag = {};
this._typhoonPlayIndex = {};
this._warnLines = null;
this._typhoonLayers = {};
this._forecastFeatures = {};
this._typhoonCircle = [];
this.wktformat = new format_1.WKT();
this.init = function () {
// 添加警戒线
_this.addWarnLine();
// 添加地图事件
_this.addMapEvent();
_this.showTyphoon(_201929_1["default"].data[0]);
// 获取台风数据
// $.get('../../data/201929.json', (res) => {
// _typhoonList = res;
// showTyphoon(_typhoonList[0]);
// });
};
this.addWarnLine = function () {
var warnLineData = [
{
color: 'blue',
weight: 1,
opacity: 0.8,
dashArray: [0, 0],
points: [
[105, 0],
[113, 4.5],
[119, 11],
[119, 18],
[127, 22],
[127, 34],
]
},
{
color: 'green',
weight: 1,
opacity: 0.8,
dashArray: [10, 5],
points: [
[105, 0],
[120, 0],
[132, 15],
[132, 34],
]
},
];
var features = [];
for (var i = 0; i < warnLineData.length; i++) {
var d_1 = warnLineData[i];
var geometry = new geom_1.LineString(d_1.points);
geometry.transform('EPSG:4326', _this._map.getView().getProjection());
var feature = new ol_1.Feature({
geometry: geometry,
attr: d_1
});
features.push(feature);
}
var source = new source_1.Vector({
features: features
});
_this._warnLines = new layer_1.Vector({
source: source,
style: _this.warnLineStyle,
opacity: 0.8
});
_this._map.addLayer(_this._warnLines);
};
// 警戒线样式设置
this.warnLineStyle = function (feat) {
var attr = feat.get('attr');
return new style_1.Style({
stroke: new style_1.Stroke({
color: attr.color,
width: attr.weight,
lineDash: attr.dashArray
})
});
};
// 添加地图事件
this.addMapEvent = function () {
// 鼠标移动事件
_this._map.on('pointermove', function (evt) {
var pixel = evt.pixel;
var dom = _this._map.getTargetElement();
if (_this._map.hasFeatureAtPixel(pixel)) {
dom.style.cursor = 'pointer';
var features = _this._map.getFeaturesAtPixel(pixel);
var feature = features[0];
// console.log(feature.get('attr'));
}
else {
dom.style.cursor = 'default';
}
});
_this._map.on('click', function (evt) {
var pixel = evt.pixel;
if (_this._map.hasFeatureAtPixel(pixel)) {
var features = _this._map.getFeaturesAtPixel(pixel);
var feature = features[0];
var attr = feature.get('attr');
_this._typhoonPlayIndex[attr.tfbh] = attr.index;
_this.showForecast(attr.tfbh, attr);
}
});
};
// 展示台风
this.showTyphoon = function (typhoonData) {
var tfbh = typhoonData.tfbh;
_this._typhoonData[tfbh] = typhoonData;
// 1. 添加台风名称
_this.addNameOverlay(typhoonData);
// 2. 创建展示图层
_this.addTyphoonLayer(tfbh);
// 3.开始播放
_this.playTyphoon(tfbh);
};
// 移除台风
this.removeTyphoon = function (tfbh) {
// 删除台风名称
_this._map.removeOverlay(_this._nameOverlays[tfbh]);
// 删除展示图层
_this._map.removeLayer(_this._typhoonLayers[tfbh].layer);
// 消除定时器
clearInterval(_this._typhoonPlayFlag[tfbh]);
};
// 添加台风名称
this.addNameOverlay = function (typhoonData) {
var nameDom = document.createElement('div');
nameDom.setAttribute('class', 'typhoon-name');
nameDom.innerHTML = typhoonData.name;
var pointStart = typhoonData.points[0];
// const position = fromLonLat([
// pointStart.longitude,
// pointStart.latitude,
// ]);
var nameOverlay = new ol_1.Overlay({
element: nameDom,
position: [pointStart.longitude, pointStart.latitude],
positioning: 'center-left',
offset: [15, 0]
});
_this._map.addOverlay(nameOverlay);
_this._nameOverlays[typhoonData.tfbh] = nameOverlay;
_this._typhoonCircle[typhoonData.tfbh] = _this.drawTyphoonCircle(pointStart.longitude, pointStart.latitude); //台风圈
};
/**
* 绘制台风圈
*/
this.drawTyphoonCircle = function (x, y) {
/** 台风配置 */
var Configs = {
// CIRCLE_CENTER_X:104.21390114106414,
// CIRCLE_CENTER_Y:35.847595169932646,
CIRCLE_CENTER_X: x,
CIRCLE_CENTER_Y: y,
CIRCLE_R: {
"SE": 0.5,
"NE": 0.3,
"NW": 0.2,
"SW": 0.5
}
};
/** 台风算法 */
var wkt = "POLYGON((";
var wkt0 = "", _interval = 6;
for (var i = 0; i < 360 / _interval; i++) {
var _r = 0;
var _ang = i * _interval;
if (_ang > 0 && _ang <= 90) {
_r = Configs.CIRCLE_R.NE;
}
else if (_ang > 90 && _ang <= 180) {
_r = Configs.CIRCLE_R.NW;
}
else if (_ang > 180 && _ang <= 270) {
_r = Configs.CIRCLE_R.SW;
}
else {
_r = Configs.CIRCLE_R.SE;
}
var x = Configs.CIRCLE_CENTER_X + _r * Math.cos(_ang * 3.14 / 180);
var y = Configs.CIRCLE_CENTER_Y + _r * Math.sin(_ang * 3.14 / 180);
wkt = wkt + "" + x + " " + y + ", ";
if (i === 0) {
wkt0 = "" + x + " " + y + "";
}
}
wkt = wkt + wkt0 + "))";
var features = new Array();
features.push(_this.wktformat.readFeature(wkt));
features.push(_this.wktformat.readFeature("POINT(" + Configs.CIRCLE_CENTER_X + " " + Configs.CIRCLE_CENTER_Y + ")"));
var styleFunc = function (feature, resolution) {
return new style_1.Style({
fill: new style_1.Fill({
color: 'rgba(255, 0, 0, 0.2)'
}),
stroke: new style_1.Stroke({
color: '#ffcc33',
width: 2
}),
image: new style_1.Circle({
radius: 4,
fill: new style_1.Fill({
color: '#ff0000'
})
})
});
};
var layerVector = new layer_1.Vector({
source: new source_1.Vector({
features: features
}),
style: styleFunc
});
_this._map.addLayer(layerVector);
return layerVector;
};
/**
* 删除台风圈
* @param tfbh 分组名称
*/
this.removeTyphoonCircle = function (tfbh) {
// const source = this._typhoonCircle[tfbh].getSource();
// source.removeFeature(this._typhoonCircle[tfbh]);
_this._typhoonCircle[tfbh].getSource().clear();
_this._map.removeLayer(_this._typhoonCircle[tfbh]);
};
// 根据编号添加台风图层
this.addTyphoonLayer = function (tfbh) {
var source = new source_1.Vector({
features: []
});
var layer = new layer_1.Vector({
source: source,
style: _this.typhoonStyle
});
_this._map.addLayer(layer);
_this._typhoonLayers[tfbh] = {
source: source,
layer: layer
};
_this._forecastFeatures[tfbh] = [];
};
// 播放台风
this.playTyphoon = function (tfbh) {
var index = 0;
var typhoonData = _this._typhoonData[tfbh];
_this.play(index, tfbh);
_this._typhoonPlayFlag[tfbh] = setInterval(function () {
index++;
if (index === typhoonData.points.length) {
clearInterval(_this._typhoonPlayFlag[tfbh]);
}
else {
_this.play(index, tfbh);
}
}, 200);
};
// 播放单个点
this.play = function (index, tfbh) {
// 删除预报
_this.removeForecast(tfbh);
_this.removeTyphoonCircle(tfbh);
_this._map.removeLayer(_this._typhoonCircle[tfbh]);
_this._typhoonPlayIndex[tfbh] = index;
var points = _this._typhoonData[tfbh].points;
var point = points[index];
point.type = 'live';
point.index = index;
point.tfbh = tfbh;
if (index > 0) {
var prePoint = points[index - 1];
point.start = [prePoint.longitude, prePoint.latitude];
}
point.end = [point.longitude, point.latitude];
//const position = fromLonLat(point.end);
var position = point.end;
//点的数据设置
var feature = new ol_1.Feature({
geometry: new geom_1.Point(position),
attr: point
});
_this._typhoonLayers[tfbh].source.addFeature(feature);
_this._typhoonCircle[tfbh] = _this.drawTyphoonCircle(point.longitude, point.latitude); //台风圈
// console.log("输出数据", this._typhoonCircle[tfbh].getSource().getFeatures()[0].getGeometry());
// this._typhoonCircle[tfbh].getSource().getFeatures()[0].getGeometry().setCoordinates(feature);
// debugger;
console.log("分类保存的台风圈");
// 最后一个实况点,展示预报路径
if (index === _this._typhoonData[tfbh].points.length - 1) {
_this.showForecast(tfbh, point);
}
};
// 删除预报数据
this.removeForecast = function (tfbh) {
var source = _this._typhoonLayers[tfbh].source;
for (var i = 0; i < _this._forecastFeatures[tfbh].length; i++) {
var f = _this._forecastFeatures[tfbh][i];
source.removeFeature(f);
}
_this._forecastFeatures[tfbh] = [];
};
// 展示预报数据
this.showForecast = function (tfbh, livePoint) {
var source = _this._typhoonLayers[tfbh].source;
// 1. 删除预报数据
_this.removeForecast(tfbh);
// 2. 添加预报
var forecast = livePoint.forecast;
var features = [];
for (var i = 0; i < forecast.length; i++) {
var f = forecast[i];
for (var j = 0; j < f.points.length; j++) {
var point = f.points[j];
var prePoint = f.points[j - 1];
point.sets = f.sets;
point.type = 'forc';
point.index = j;
point.start =
j === 0
? [livePoint.longitude, livePoint.latitude]
: [prePoint.longitude, prePoint.latitude];
point.end = [point.longitude, point.latitude];
//const coords = fromLonLat(point.end);
var coords = point.end;
var feature = new ol_1.Feature({
geometry: new geom_1.Point(coords),
attr: point
});
features.push(feature);
}
}
source.addFeatures(features);
_this._forecastFeatures[tfbh] = features;
};
// 根据风速获取点的颜色
this.getPointColor = function (speed) {
var _color = '';
if (speed >= 10.8 && speed < 17.2) {
_color = 'rgba(153, 255, 153, .9)';
}
else if (speed >= 17.2 && speed < 24.5) {
_color = 'rgba(102, 204, 255, .9)';
}
else if (speed >= 24.5 && speed < 32.7) {
_color = 'rgba(255, 255, 102, .9)';
}
else if (speed >= 32.7 && speed < 41.5) {
_color = 'rgba(253, 139, 0, .9)';
}
else if (speed >= 41.5 && speed < 50.1) {
_color = 'rgba(255, 51, 0, .9)';
}
else {
_color = 'rgba(255, 0, 255, .9)';
}
return _color;
};
// 台风展示样式
this.typhoonStyle = function (feat) {
var attr = feat.get('attr');
var speed = 12; //attr.speed;
var type = attr.type;
var index = attr.index;
var color = _this.getPointColor(speed);
var styles = [];
// 点的样式
var radius = type === 'live' ? 4 : 3;
var pointStyle = new style_1.Style({
image: new style_1.Circle({
radius: radius,
fill: new style_1.Fill({
color: color
}),
stroke: new style_1.Stroke({
color: 'rgba(0, 0, 0, 0.6)',
width: 1
})
})
});
styles.push(pointStyle);
if (type === 'live' && index === _this._typhoonPlayIndex[attr.tfbh]) {
var center = feat.get('geometry').getCoordinates();
var fillStyle = new style_1.Fill({
color: 'rgba(0, 0, 0, 0.2)'
});
// 7级风圈的样式
if (attr.radius7 > 0) {
var geometry = _this.getCircleGeometry(center, attr.radius7_quad);
var style = new style_1.Style({
geometry: geometry,
stroke: new style_1.Stroke({
color: '#00bab2',
width: 1
}),
fill: fillStyle
});
styles.push(style);
}
// 10级风圈的样式
if (attr.radius10 > 0) {
var geometry = _this.getCircleGeometry(center, attr.radius10_quad);
var style = new style_1.Style({
geometry: geometry,
stroke: new style_1.Stroke({
color: '#ffff00',
width: 1
}),
fill: fillStyle
});
styles.push(style);
}
// 12级风圈的样式
if (attr.radius12 > 0) {
var geometry = _this.getCircleGeometry(center, attr.radius12_quad);
var style = new style_1.Style({
geometry: geometry,
stroke: new style_1.Stroke({
color: '#da7341',
width: 1
}),
fill: fillStyle
});
styles.push(style);
}
}
// 线的样式
var start = attr.start;
var end = attr.end;
var lineColor = _this.getLineColor(type, attr.sets);
var lineDash = type === 'live' ? [0] : [8];
var lineWidth = type === 'live' ? 2 : 1;
if (start && start.length > 0) {
var coords = [start, end];
var geometry = new geom_1.LineString(coords);
geometry.transform('EPSG:4326', _this._map.getView().getProjection());
var lineStyle = new style_1.Style({
geometry: geometry,
stroke: new style_1.Stroke({
color: lineColor,
width: lineWidth,
lineDash: lineDash
})
});
styles.push(lineStyle);
}
return styles;
};
// 获取线的颜色
this.getLineColor = function (type, sets) {
if (type === 'live') {
return 'rgba(0, 0, 0, .6)';
}
else {
var color = _this._forcColorDict[sets];
if (!color)
color = 'rgba(0, 0, 0, .3)';
return color;
}
};
this.getCircleGeometry = function (center, radiusData) {
if (typeof radiusData === 'number') {
return new geom_1.Circle(center, radiusData * 1000);
}
else {
if (radiusData['ne']) {
var _coords = [];
var _angInterval = 6;
var _pointNums = 360 / (_angInterval * 4);
var quadrant = {
// 逆时针算角度
'0': 'ne',
'1': 'nw',
'2': 'sw',
'3': 'se'
};
for (var i = 0; i < 4; i++) {
var _r = parseFloat(radiusData[quadrant[i]]) * 1000; // 单位是km
if (!_r)
_r = 0;
for (var j = i * _pointNums; j <= (i + 1) * _pointNums; j++) {
var _ang = _angInterval * j;
var x = center[0] + _r * Math.cos((_ang * Math.PI) / 180);
var y = center[1] + _r * Math.sin((_ang * Math.PI) / 180);
_coords.push([x, y]);
}
}
return new geom_1.Polygon([_coords]);
}
else {
return null;
}
}
};
this._map = map;
}
return Typhoon;
}());
exports["default"] = Typhoon;使用:
const map= new Typhoon(data.map); map.init();
效果:


评论区