当前位置:网站首页>mapbox尝鲜值之云图动画
mapbox尝鲜值之云图动画
2022-07-03 05:29:00 【牛老师讲GIS】
概述
昨天收到了mapbox中国的推送,看到了mapboxgl的更新,此次更新版本加入了globa
,终于有个球了,于是就迫不及待的今天想尝个鲜。
尝鲜效果
主要实现了:1.源码的编译,最新的版本为2.10.0-dev
;2、三维球展示;3、由于最近台风活动比较频繁,所以加入了云图动画。实现后效果图如下:
实现
1. 源码编译
从github上clone源代码,安装依赖,修改源码,取消accessToken
的认证。修改src/ui/map.js
,注释3258行即可。
运行命令npm run build-css
编译css,运行命令npm run build-dev
编译开发版,运行命令npm run build-prod-min
编译压缩部署版。
2.三维球展示
在之前的版本中map
初始化的时候加入了projection
这个参数,此次更新中,要想实现三维球只需修改该参数的值为globe
即可。
const center = [116.391442, 39.903173]
map = new mapboxgl.Map({
container: 'map',
maxZoom: 18,
minZoom: 0,
zoom: 3,
center: center,
style: mapStyle,
attributionControl: false,
projection: 'globe' //三维球投影
});
3、云图动画
接口来源于网络,因为在调用的过程中发现图片存在跨域,所以用node后台做了一下转发,后台代码如下:
const express = require('express')
const request = require("request");
const router = express.Router()
const fs = require('fs')
const baseUrl = 'http://dtbank.gistinker.com'
router.get("/img", function (req, res) {
let {
path } = req.query
const imgUrl = baseUrl + path
const filePath = './imgs/' + path.split('/').join('-')
console.log(filePath)
const file = fs.createWriteStream(filePath)
request(imgUrl).pipe(file)
file.on('finish', function() {
const buffer = fs.readFileSync(filePath)
res.format ({
'image/jpg': function () {
res.send(buffer);
file.close();
}
})
})
})
module.exports = router;
前端通过imageSource
实现图片的展示,通过通过new Image()
实现图片加载完成后再加载下一时刻的图片,优化了动画效果。实现代码如下:
const url = 'https://dtbank.gistinker.com/api/sti/gisimg?start=&end=&tag=IR1&_=1656667444192'
fetch(url).then(res => res.json()).then(res=> {
console.log(res)
const play = () => {
if(index === res.length) index = 0
let {
extent, time, url} = res[index]
const [xmin, ymin, xmax, ymax] = extent.split(',').map(Number)
const coords = [
[xmin, ymax],
[xmax, ymax],
[xmax, ymin],
[xmin, ymin]
];
url = url.split('https://dtbank.gistinker.com').join('http://localhost:19999/ty/img?path=')
const img = new Image()
img.src = url
img.onload = () => {
if(map.getSource('loopimage')) {
map.getSource('loopimage').updateImage({
url: url,
coordinates: coords
})
} else {
map.addSource('loopimage', {
type: 'image',
url: url,
coordinates: coords
});
map.addLayer({
'id': 'loopimage',
'source': 'loopimage',
'type': 'raster',
'paint': {
'raster-opacity': 0.6,
'raster-fade-duration': 0
}
}, 'province-line');
}
index++
play()
}
}
play()
})
上述示例完整代码如下:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>白天不懂夜的黑</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link href="./mapbox-gl.css" rel="stylesheet" />
<style> body, #map {
height: 100vh; margin: 0; padding: 0; overflow: hidden; } </style>
</head>
<body>
<div id="map">
</div>
<script src="./mapbox-gl-dev.js"></script>
<script> mapboxgl.accessToken = ''; const mapStyle = {
"version": 8, "name": "Dark", "sources": {
"XYZTile": {
"type": "raster", "tiles": ['https://api.mapbox.com/v4/mapbox.satellite/{z}/{x}/{y}.webp?sku=1015BRyDI0Jy2'], "tileSize": 256 }, 'AMAPTile': {
"type": "raster", "tiles": ['http://webrd01.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8'], "tileSize": 256, }, 'province': {
type: 'geojson', data: './data/province.geojson' } }, "layers": [{
"id": "XYZTile", "type": "raster", "source": "XYZTile", "minzoom": 0, "maxzoom": 22 },{
'id': 'province-line', 'source': 'province', "type": "line", "paint": {
"line-color": "#f4f4f4" } }] }; const center = [116.391442, 39.903173] map = new mapboxgl.Map({
container: 'map', maxZoom: 18, minZoom: 0, zoom: 3, center: center, style: mapStyle, attributionControl: false, projection: 'globe' }); map.on('load', () => {
// Add daytime fog map.setFog({
'range': [-1, 2], 'horizon-blend': 0.3, 'color': 'white', 'high-color': '#add8e6', 'space-color': '#d8f2ff', 'star-intensity': 0.0 }); // Add some 3D terrain map.addSource('mapbox-dem', {
'type': 'raster-dem', 'url': 'mapbox://mapbox.terrain-rgb', 'tileSize': 512, 'maxzoom': 14 }); // map.setTerrain({
// 'source': 'mapbox-dem', // 'exaggeration': 1.5 // }); let index = 0 const url = 'https://dtbank.gistinker.com/api/sti/gisimg?start=&end=&tag=IR1&_=1656667444192' fetch(url).then(res => res.json()).then(res=> {
console.log(res) const play = () => {
if(index === res.length) index = 0 let {
extent, time, url} = res[index] const [xmin, ymin, xmax, ymax] = extent.split(',').map(Number) const coords = [ [xmin, ymax], [xmax, ymax], [xmax, ymin], [xmin, ymin] ]; url = url.split('https://dtbank.gistinker.com').join('http://localhost:19999/ty/img?path=') const img = new Image() img.src = url img.onload = () => {
if(map.getSource('loopimage')) {
map.getSource('loopimage').updateImage({
url: url, coordinates: coords }) } else {
map.addSource('loopimage', {
type: 'image', url: url, coordinates: coords }); map.addLayer({
'id': 'loopimage', 'source': 'loopimage', 'type': 'raster', 'paint': {
'raster-opacity': 0.6, 'raster-fade-duration': 0 } }, 'province-line'); } index++ play() } } play() }) }) </script>
</body>
</html>
边栏推荐
- Make your own dataset
- Pytorch through load_ state_ Dict load weight
- study hard and make progress every day
- Skip table: principle introduction, advantages and disadvantages of skiplist
- JS function algorithm interview case
- "C and pointer" - Chapter 13 function pointer 1: callback function 2 (combined with template to simplify code)
- Web APIs exclusivity
- Gbase8s unique index and non unique index
- (subplots usage) Matplotlib how to draw multiple subgraphs (axis field)
- appium1.22.x 版本後的 appium inspector 需單獨安裝
猜你喜欢
DEX net 2.0 for crawl detection
[basic grammar] Snake game written in C language
BTC-密码学原理
@Solutions to null pointer error caused by Autowired
Communication - how to be a good listener?
Redis使用Lua脚本简介
How to set up altaro offsite server for replication
Simpleitk learning notes
How to use source insight
How do I migrate my altaro VM backup configuration to another machine?
随机推荐
Notepad++ wrap by specified character
Principles of BTC cryptography
Burp suite plug-in based on actual combat uses tips
redis 无法远程连接问题。
请求数据库报错:“could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGram
Best practices for setting up altaro VM backups
appium1.22.x 版本后的 appium inspector 需单独安装
Introduction to webrtc protocol -- an article to understand dtls, SRTP, srtcp
es7创建索引容易犯的错误
Shanghai daoning, together with American /n software, will provide you with more powerful Internet enterprise communication and security component services
Classification and discussion of plane grab detection methods based on learning
Win10 install pytullet and test
Installing altaro VM backup
Deploy crawl detection network using tensorrt (I)
Communication - how to be a good listener?
Learn libcef together -- set cookies for your browser
Primary school campus IP network broadcasting - Design of primary school IP digital broadcasting system based on campus LAN
今天很多 CTO 都是被干掉的,因为他没有成就业务
Use posture of sudo right raising vulnerability in actual combat (cve-2021-3156)
Redis 入门和数据类型讲解