主頁 > 企業開發 > mapboxgl 中插值運算式的應用場景

mapboxgl 中插值運算式的應用場景

2022-05-11 08:03:02 企業開發

目錄
  • 一、前言
  • 二、語法
  • 三、對地圖顏色進行拉伸渲染
    • 1. 熱力圖
    • 2. 軌跡圖
    • 2. 模型網格渲染
  • 四、隨著地圖縮放對圖形屬性進行插值
  • 五、interpolate的高階用法
  • 六、總結

一、前言

interpolate是mapboxgl地圖樣式中用于插值的運算式,能對顏色和數字進行插值,

它的應用場景有兩類:

  1. 對地圖資料進行顏色拉伸渲染,常見的應用場景有:熱力圖、軌跡圖、模型網格渲染等,
  2. 在地圖縮放時對圖形屬性進行插值,具體為,隨著地圖的縮放,在改變圖示大小、建筑物高度、圖形顏色等屬性時,對屬性進行插值,從而實作平滑的過渡效果,

這篇文章就把 mapboxgl 中interpolate插值工具的常見應用場景介紹一下,


二、語法

先看一下interpolate插值工具的語法,

interpolate運算式要求至少有5個引數,分別是運算式名稱插值型別輸入值判斷值輸出值

["interpolate",		//運算式名稱
    interpolation: ["linear"] | ["exponential", base] | ["cubic-bezier", x1, y1, x2, y2 ],  //插值型別
    input: number,	//輸入值
    stop_input_1: number, stop_output_1: OutputType,		//一組判斷值和輸出值
    stop_input_n: number, stop_output_n: OutputType, ...	//一組判斷值和輸出值
]: OutputType (number, array<number>, or Color)		//回傳插值完的結果

其中插值型別會在后面詳細介紹,這里先不多說,

判斷值輸出值是“一組”的關系,它們必須兩兩出現,

還有一點需要注意,就是判斷值必須遵循升序規則,

下面我們結合實際場景理解起來會更容易一些,先說第一類應用場景:對地圖資料進行顏色拉伸渲染,


三、對地圖顏色進行拉伸渲染

這個和ArcGIS中對柵格資料進行顏色拉伸渲染是一個意思,

地圖顏色拉伸渲染的本質,是根據網格的屬性值為網格設定顏色,當網格足夠小、足夠密時,就容易產生顏色平滑過渡的效果,

前面說到,常見的應用場景有:熱力圖、軌跡圖、模型網格渲染等,

在mapboxgl中,熱力圖和軌跡圖它們雖然看上去不像是由網格組成的,但在計算機圖形學的框架下,任何在螢屏上顯示的內容,都是由像素來呈現的,而像素是規律排列的網格,所以可以把熱力圖和軌跡也看成是由網格組成的,

這一點在WebGL開發時尤為明顯,因為需要自己寫片元著色器定義每個像素的顏色,

mapboxgl提供了熱力圖和軌跡圖的像素屬性值計算工具:

  • 熱力圖中為heatmap-density運算式,用來計算熱力圖上每個像素的熱力值,

  • 軌跡線中為line-progress運算式,用來計算在當前線段上每個像素的行進百分比,

模型網格渲染時,網格需要自己生成,網格中的屬性值也需要自己計算,通常在專案上這些是由模型完成的,如:EFDC水動力模型、高斯煙羽大氣污染擴散模型等,

模型輸出的結果就是帶屬性值的網格,interpolate運算式的任務仍然是根據網格的屬性值為網格設定顏色,

1. 熱力圖

實作效果:

資料使用的是北京市公園綠地無障礙設施數量,

代碼為:

//添加圖層
map.addLayer({
    "id": "park",
    "type": "heatmap",
    "minzoom": 0,
    "maxzoom": 24,
    "source": "park",
    "paint": {
        "heatmap-weight": 1,
        "heatmap-intensity": 1,
        'heatmap-opacity':0.4,
        'heatmap-color': [//熱力圖顏色
            'interpolate',
            ['linear'],
            ['heatmap-density'],
            0,'rgba(255,255,255,0)',
            0.2,'rgb(0,0,255)',
            0.4, 'rgb(117,211,248)',
            0.6, 'rgb(0, 255, 0)',
            0.8, 'rgb(255, 234, 0)',
            1, 'rgb(255,0,0)',
        ]
    }
});

上述代碼中,使用interpolate運算式進行線性插值,輸入值是heatmap-density熱力圖密度,熱力圖密度的值在0-1之間,輸出值是熱力圖中各個像素的顏色,

'heatmap-color': [
    'interpolate',
    ['linear'],
    ['heatmap-density'],
    0,'rgba(255,255,255,0)',
    0.2,'rgb(0,0,255)',
    0.4, 'rgb(117,211,248)',
    0.6, 'rgb(0, 255, 0)',
    0.8, 'rgb(255, 234, 0)',
    1, 'rgb(255,0,0)',
]

運算式詳解:

  • 密度為0或小于0,輸出顏色'rgba(255,255,255,0)'
  • 密度為0-0.2,輸出顏色在'rgba(255,255,255,0)''rgb(0,0,255)'之間
  • 密度為0.2,輸出顏色'rgb(0,0,255)'
  • 密度為0.2-0.4,輸出顏色在'rgb(0,0,255)''rgb(117,211,248)'之間
  • 密度為0.4,輸出顏色'rgb(117,211,248)'
  • 密度為0.4-0.6,輸出顏色在'rgb(117,211,248)''rgb(0, 255, 0)'之間
  • 密度為0.6,輸出顏色'rgb(0, 255, 0)'
  • 密度為0.6-0.8,輸出顏色在'rgb(0, 255, 0)''rgb(255,0,0)'之間
  • 密度為0.8,輸出顏色'rgb(255, 234, 0)'
  • 密度為0.8-1,輸出顏色在'rgb(255, 234, 0)''rgb(255,0,0)'之間
  • 密度為1或大于1,輸出顏色'rgb(255,0,0)'

在線示例:http://gisarmory.xyz/blog/index.html?demo=mapboxglStyleInterpolate1

和顏色拉伸渲染對應的另一種渲染方式,是使用step運算式對資料進行顏色分類渲染,

顏色分類渲染的實作方式在上面示例的代碼中就有,只是被注釋了,可以把代碼下載下來自行嘗試,

實作效果如下:

2. 軌跡圖

mapboxgl官網上提供了一個示例,是用顏色來表達軌跡行進的進度,效果圖如下:

它是用線的line-gradient屬性來實作的,其中用到了插值運算式interpolate和線進度運算式line-progressinterpolate運算式在這里的作用依舊是對屬性值進行顏色拉伸渲染,代碼如下:

map.addLayer({
    type: 'line',
    source: 'line',
    id: 'line',
    paint: {
        'line-color': 'red',
        'line-width': 14,
        // 'line-gradient' 必須使用 'line-progress' 運算式實作
        'line-gradient': [    //
            'interpolate',
            ['linear'],
            ['line-progress'],
            0, "blue",
            0.1, "royalblue",
            0.3, "cyan",
            0.5, "lime",
            0.7, "yellow",
            1, "red"
        ]
    },
    layout: {
        'line-cap': 'round',
        'line-join': 'round'
    }
});

在實際專案中,這種用顏色表達軌跡進度的場景相對少見,更多時候我們需要用顏色來表示軌跡的速度,

用顏色表示軌跡速度:

我們準備了一條騎行軌跡資料,軌跡由多個線段組成,每個線段上包含開始速度、結束速度和平均速度屬性,相鄰的兩條線段,前一條線段的結束點和下一條線段的開始點,它們的經緯度和速度相同,

//line資料中的單個線段示例
{
    "type": "Feature",
        "properties": {
            "startSpeed": 8.301424026489258, //開始速度
            "endSpeed": 9.440339088439941, //結束速度
            "speed": 8.8708815574646 //平均速度
        },
        "geometry": {
            "coordinates": [
                [
                    116.29458653185719,
                    40.08948061960585
                ],
                [
                    116.29486002031423,
                    40.08911413450488
                ]
            ],
                "type": "LineString"
        }
}

最簡單的實作方式就是,根據線段的平均速度,給每條線段設定一個顏色,

實作方式仍然是使用interpolate運算式,用它來根據軌跡中線段的速度對顏色進行插值,

核心代碼如下:

//添加圖層
map.addLayer({
    type: 'line',
    source: 'line',
    id: 'line',
    paint: {
        'line-color': [
            'interpolate',//運算式名稱
            ["linear"],//運算式型別,此處是線性插值
            ["get", "speed"],//輸入值,此處是屬性值speed
            0,'red',//兩兩出現的判斷值和輸出值
            8,'yellow',
            10,'lime'
        ],
        'line-width': 6,
        'line-blur': 0.5
    },
    layout: {
        'line-cap': 'round'
    }
});

上面代碼中,interpolate運算式的意思是:

  • 0km/h及以下(含0km/h)輸出紅色
  • 0-8km/h輸出紅到黃之間的顏色
  • 8km/h輸出黃色
  • 8-10km/h輸出黃到綠之間的顏色
  • 10km/h及以上(含10km/h)輸出綠色

實作效果如下:

示例在線地址:http://gisarmory.xyz/blog/index.html?demo=mapboxglStyleInterpolate2

整體看上去還不錯,但放大地圖時會發現,顏色是一段一段的,過渡不夠平滑,如下圖:

如何能讓區域的顏色也平滑起來呢?

要是能讓兩個線段間的顏色平滑過渡就好了,

想到這里,我們又想起了前面那個用顏色表示軌跡進度的官方示例,如果把兩種方式結合一下或許能實作想要的效果,

實作思路:

每條線段的屬性中有開始速度結束速度,根據顏色和速度的對應關系,可以插值出每條線段的開始顏色結束顏色,前一條線段的開始顏色和后一條線段的結束顏色為同一個顏色,每條線段中間的顏色通過使用line-gradient實作從開始顏色結束顏色的漸變,

這樣就能實作兩個線段間顏色的平滑過渡了,

實作方法:

按照這個思路需要進行兩次插值,第一次插值是插值出每個線段的開始顏色結束顏色,第二次是插值出每個線段上每個像素的顏色

本來是想在mapboxgl中,通過多個運算式的嵌套來實作此功能,這樣代碼會比較簡潔,但多次嘗試發現行不通,原因是,因為mapboxgl對line-gradientline-progress在的使用上的一些限制,所以第一次插值的邏輯需要自己動手實作,

第一步,自己動手寫個顏色插值函式,插值出每個線段的開始顏色結束顏色,實作方式注釋里面已經寫的比較清楚了,

//通過canvas獲取開始顏色和結束顏色:
//原理是利用canvas創建一個線性漸變色物件,再通過計算顏色所在的位置去用getImageData獲取顏色,最后回傳這個顏色
//1.創建canvas
var canvas = document.createElement("canvas");
canvas.width = 101;
canvas.height = 1;
var ctx = canvas.getContext('2d');
//2.創建線性漸變的函式,該函式會回傳一個線性漸變物件,引數0,1,101,1分別指:漸變的起始點x,y和漸變的終止點x,y
var grd = ctx.createLinearGradient(0,1,101,1) 
//3.給線性漸變物件添加顏色點的函式,引數分別是停止點、顏色
grd.addColorStop(0,'red');
grd.addColorStop(0.8,'yellow');
grd.addColorStop(1,'lime');
//4.給canvas填充漸變色
ctx.fillStyle = grd;
ctx.fillRect(0, 0, 101, 1);
//5.回傳漸變色的函式
function getInterpolateColor(r) {
    //6.這里是漸變色的精細度,我將canvas分成101份來取值,每一份都會有自己對應的顏色
    //宣告的變數x就是我們需要的顏色在漸變物件上的位置
    let x =  parseInt(r * 100);
    x>100?x=100:x=x
    //7.傳入插值顏色所在的位置x,通過canvas的getImageData方法獲取顏色
    var colorData = https://www.cnblogs.com/gisarmory/archive/2022/05/10/ctx.getImageData(x, 0, 1, 1).data;
    //8.回傳這個顏色
    return `rgba(${colorData[0]},${colorData[1]},${colorData[2]},${colorData[3]})`
}

第二步,每個線段設定為一個圖層,每個圖層呼叫第一步的方法獲取線段的開始顏色結束顏色,然后使用line-gradient屬性設定線段中間的顏色,

//allFeatures是line資料中單個線段組成的集合
allFeatures.map((item,index)=>{
    //通過上面的漸變色函式獲取開始顏色和結束顏色
    let startColor = getInterpolateColor(item.properties.startSpeed/10)
    let endColor = getInterpolateColor(item.properties.endSpeed/10)
    //回圈添加圖層
    map.addLayer({
        type: 'line',
        source: 'line',
        id: 'line'+index,
        paint: {
            'line-width': 6,
            'line-blur': 0.5,
            'line-gradient': [
                'interpolate',
                ['linear'],
                ['line-progress'],
                0, startColor,
                1, endColor
            ]
        },
        layout: {
            'line-cap': 'round',
        },
        'filter': ['==', "$id", index]
    });
})

每個線段設定為一個圖層,最后可能會有上千個圖層,這樣不容易管理,

這里提供另一種思路,可以將所有線段合并為一條折線,然后計算出折線上每個節點的速度、顏色和占整個軌跡的百分比,占整個軌跡的百分比通過節點距離起點和終點的長度來計算,

將所有節點的百分比和顏色兩兩對應作為line-gradient的判斷引數,這樣就能產生和多個圖層同樣的效果,同時只需要創建一個圖層,

這種方式的缺點是需要處理資料,具體適合用哪種可以根據實際情況來定,

最終實作效果如下:

示例在線地址:http://gisarmory.xyz/blog/index.html?demo=mapboxglStyleInterpolate3

2. 模型網格渲染

這種模式下,網格資料主要來自模型輸出結果,在輸出結果的基礎上,只需要用interpolate插值工具,根據網格屬性值插值出網格顏色就ok,

下面的代碼和效果圖,是用EFDC模型的輸出結果做的示例,這個網格相對比較大一些,但中間部分的過渡還算自然,

代碼:

//圖層
{
    "id": "waterTN",
    "type": "fill",
    "source": "efdc",
    "paint": {
        "fill-color": [
            "interpolate",
            ["linear"],
            ["get", "TN"],//輸入值是屬性TN
            0, "#36D1DC",
            15, "#6666ff",
            20, "#4444FF"
        ]
    }
}

效果圖:


四、隨著地圖縮放對圖形屬性進行插值

mapboxgl官網給出了兩個相關示例:

一個是按照縮放級別改變建筑顏色,里面同時對建筑物的顏色和透明度進行了插值,

相關代碼:

//對顏色插值
map.setPaintProperty('building', 'fill-color', [
    "interpolate",
    ["exponential", 0.5],
    ["zoom"],
    15,
    "#e2714b",
    22,
    "#eee695"
]);
//對透明度插值
map.setPaintProperty('building', 'fill-opacity', [
    "interpolate",
    ["exponential", 0.5],
    ["zoom"],
    15,
    0,
    22,
    1
]);

效果圖:

縮放改變顏色3

另一個是按照地圖縮放級別去改變建筑物顯示高度,里面對建筑物的高度和建筑物距離地圖的高度進行了插值,

相關代碼:

map.addLayer({
    'id': '3d-buildings',
    'source': 'composite',
    'source-layer': 'building',
    'filter': ['==', 'extrude', 'true'],
    'type': 'fill-extrusion',
    'minzoom': 15,
    'paint': {
        'fill-extrusion-color': '#aaa',
        'fill-extrusion-height': [
            "interpolate", ["linear"],
            ["zoom"],
            15, 0,
            15.05, ["get", "height"]
        ],
        'fill-extrusion-base': [
            "interpolate", ["linear"],
            ["zoom"],
            15, 0,
            15.05, ["get", "min_height"]
        ],
        'fill-extrusion-opacity': .6
    }
}, labelLayerId);

效果圖:

縮放改變高度

同理,我們還可以對地圖圖示的大小進行插值,比如縮放級別越大圖示越大,縮放級別越小圖示越小等,


五、interpolate的高階用法

前面介紹插值工具interpolate的語法時,暫時沒有介紹插值型別這個選項,這一節我們好好說說它,

前面的多數示例中,插值型別選項我們都是使用的['linear']這個型別,意思是線性插值,

除了線性插值外,插值型別還支持["exponential",base]指數插值和["cubic-bezier", x1, y1, x2, y2]三次貝賽爾曲線插值,

它們的語法為:

  • ["linear"]線性插值,沒有其它引數,
  • ["exponential",base]指數插值,base引數為指數值,
  • ["cubic-bezier",x1,y1,x2,y2]三次貝塞爾曲線插值,x1y1x2y24個引數用于控制貝塞爾曲線的形態,

聽上去可能有點抽象,我們舉個例子:

下面這段的代碼是根據地圖縮放級別改變建筑物的透明度:

map.setPaintProperty('building', 'fill-opacity', [
   "interpolate", 
    ["linear"],
    ["zoom"],
    15,0,
    22,1
]);

意思為:

  • 當縮放級別小于15時,透明度為0,

  • 當縮放級別大于等于22時,透明度為1,

  • 當縮放級別在15到22之間時,使用線性插值方式自動計算透明度的值,介于0到1之間,

線性插值:

如果把縮放級別設定為x,透明度為y,限定x的值在15到22之間,則線性插值的方程式為:

y=(x-15)/(22-15)

從下面的函式影像上可以直觀的看出,它就是一條直線,這意味著地圖放大時,從15級開始到22級,建筑物不透明度會勻速的增加,直到完全顯示,

指數插值

指數插值的方程式在線性插值方程式的基礎上增加了指數值,這個值我們用z來表示,方程式為:

y=((x-15)/(22-15))^z

通過z值來我們可以調整函式影像的形態,如:分別取z值為0.1、0.5、1、2、10這5個值,畫成圖如下:

以上圖中指數為10次方的紫色線為例,當地圖從15級放大到19級時,會一直都看不到建筑物,因為建筑物的透明度一直為0,

繼續放大,從19級放大到22級時,建筑物會快速的顯現直到完全顯示,

這就是指數插值和線性插值的區別,它提供給了我們一個可以控制插值輸出快慢的方式,

三次貝塞爾曲線插值:

三次貝塞爾曲線插值和上面的指數插值是一個意思,都是為了能夠更靈活的控制插值輸出的快慢,

還是通過函式影像來幫助理解,指數插值的影像只能向一個方向彎曲,指數在0-1之間時曲線向上彎曲,大于1時曲線向下彎曲,

而三次貝塞爾曲線插值則可以讓曲線雙向彎曲,

mapboxgl官網提供了一個海洋深度的示例,里面有用到三次貝塞爾曲線插值,

示例中使用三次貝塞爾曲線對表示海洋深度的顏色進行插值,效果如下圖:

相關代碼如下:

{
    'id': '10m-bathymetry-81bsvj',
    'type': 'fill',
    'source': '10m-bathymetry-81bsvj',
    'source-layer': '10m-bathymetry-81bsvj',
    'layout': {},
    'paint': {
    'fill-outline-color': 'hsla(337, 82%, 62%, 0)',
    'fill-color': [
        'interpolate',
        ['cubic-bezier', 0, 0.5, 1, 0.5],
        ['get', 'DEPTH'],
        200,'#78bced',
        9000,'#15659f'
        ]
    }
},

上面代碼中,三次貝塞爾曲線插值的4個引數x1y1x2y2的值分別為:0、 0.5、 1、 0.5,

它的函式影像為:

通過上圖可以看出,函式輸出的速度是 先快 再慢 最后又快,結合海洋深度的示例,當深度在200米和9000米附近時,顏色變化較快,深度在中間時,顏色變化比較平緩,下面兩張圖是線性插值和三次貝塞爾曲線插值的對比:

上圖使用["linear"]線性插值,顏色勻速輸出,能看出深淺變化,但是‘塊狀感’明顯

下圖使用 ['cubic-bezier', 0, 0.5, 1, 0.5]三次貝塞爾曲線插值,顏色輸出先快再慢最后又快,既能看出深淺變化,又能實作自然過渡的平滑效果,會讓人感覺更柔和,

推薦文章一篇通俗易懂的三次貝塞爾曲線講解可以了解三次貝塞爾曲線是怎么畫出來的,還有一個工具網站可以自己畫點幫助理解,

這三種插值方法所代表的函式都可以在坐標軸中畫出來,無論畫出來是直線還是各種曲線,我們都不需要去糾結這個線條是如何畫的,因為這一步我們可以借助工具來完成,需要關心的是這條線它輸出速度的快慢,這才和我們"interpolate"運算式的意義平滑過渡相關,

六、總結

  1. interpolate是mapboxgl地圖樣式中用于插值的運算式,能對顏色和數字進行插值,可以讓地圖實作平滑的過渡效果,
  2. 它的應用場景有兩類,一類是對地圖資料進行顏色拉伸渲染,如:熱力圖、軌跡圖、模型網格渲染等,
  3. 另一類是在地圖縮放時對圖形屬性進行插值,如:隨著地圖的縮放實作建筑物高度的緩慢變化、圖形顏色的平滑切換等效果,
  4. interpolate插值工具提供了三種插值方式,線性插值、指數插值、三次貝塞爾曲線插值,它們的區別在于控制插值輸出快慢的不同,

* * *

原文地址:http://gisarmory.xyz/blog/index.html?blog=mapboxglStyleInterpolate

歡迎關注《GIS兵器庫》

本文章采用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議 進行許可,歡迎轉載、使用、重新發布,但務必保留文章署名《GIS兵器庫》(包含鏈接: http://gisarmory.xyz/blog/),不得用于商業目的,基于本文修改后的作品務必以相同的許可發布,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/472293.html

標籤:其他

上一篇:mapboxgl 中插值運算式的應用場景

下一篇:從URL輸入到頁面展現到底發生什么?DNS 決議&TCP 連接

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more