Cesium 時間線 及 坐標轉換

文章目錄

    • Cesium 基礎理解(二)
      • TimeLine & Clock 應用場景
      • 核心代碼實例及解釋
      • 代碼解釋
    • Cesium 之 實體動畫
      • 構建實體動畫的技巧
        • 1. 利用時間屬性
        • 2. 組合動畫效果
        • 3. 使用動畫曲線
      • 優化點
        • 1. 減少屬性更新頻率
        • 2. 優化實體數量
        • 3. 合理使用材質和紋理
      • 注意事項
        • 1. 時間同步
        • 2. 內存管理
        • 3. 兼容性
    • 坐標系轉換
      • 1. WGS84 與 Web 墨卡托投影坐標系轉換
        • 1.1 WGS84 轉 Web 墨卡托
        • 1.2 Web 墨卡托轉 WGS84
      • 2. 二維屏幕坐標與 WGS84 坐標轉換
        • 2.1 二維屏幕坐標轉 WGS84 坐標
        • 2.2 WGS84 坐標轉二維屏幕坐標
      • 3. 二維平面坐標與 WGS84 坐標轉換
        • 3.1 二維平面坐標(局部坐標系)轉 WGS84 坐標
        • 3.2 WGS84 坐標轉二維平面坐標(局部坐標系)
    • 技術名詞解釋(局部坐標系)
      • 定義與概念
      • 為什么需要局部坐標系
      • 局部坐標系的構成要素
      • 在 Cesium 中的應用示例解釋
      • 定義局部二維平面坐標(x, y 偏移量)的原因
      • 是否可以隨便改值

Cesium 基礎理解(二)

在 Cesium 里,TimeLine(時間軸)與 Clock(時鐘)是用來管理和展示時間相關數據與動畫的重要組件。Clock 負責管理時間的推進,而 TimeLine 則提供了一個可視化的界面,讓用戶能夠與時間進行交互。下面為你詳細介紹它們的應用,并給出核心代碼及解釋。

TimeLine & Clock 應用場景

  • 動態數據可視化:像氣象數據、交通流量數據這類隨時間變化的數據,可借助時間軸與時鐘來展示不同時間點的數據。
  • 動畫演示:在模擬飛行、天體運動等場景時,能夠利用時間軸和時鐘控制動畫的播放。
  • 歷史數據回放:對歷史事件進行回放,用戶可通過時間軸選擇特定的時間點查看相應的數據。

核心代碼實例及解釋

下面的代碼展示了如何在 Cesium 中使用 TimeLineClock 來創建一個簡單的動畫:

// 初始化 Cesium Viewer
var viewer = new Cesium.Viewer('cesiumContainer', {timeline: true,  // 顯示時間軸animation: true  // 顯示動畫控制器
});// 設置時鐘的起始時間和結束時間
var start = Cesium.JulianDate.fromIso8601('2025-04-03T00:00:00Z');
var stop = Cesium.JulianDate.addDays(start, 1, new Cesium.JulianDate());
viewer.clock.startTime = start.clone();
viewer.clock.stopTime = stop.clone();
viewer.clock.currentTime = start.clone();// 設置時間乘數和時鐘范圍
viewer.clock.multiplier = 3600; // 每幀前進一小時
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP; // 到達結束時間后循環播放
viewer.clock.clockStep = Cesium.ClockStep.SYSTEM_CLOCK_MULTIPLIER;// 創建一個實體,用于演示動畫
var entity = viewer.entities.add({position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),point: {pixelSize: 10,color: Cesium.Color.RED}
});// 動畫回調函數
viewer.clock.onTick.addEventListener(function (clock) {// 在每次時鐘更新時,更新實體的顏色var currentTime = clock.currentTime;var fraction = Cesium.JulianDate.secondsDifference(currentTime, start) / Cesium.JulianDate.secondsDifference(stop, start);entity.point.color = Cesium.Color.fromHsl(fraction, 1.0, 0.5);
});    

代碼解釋

  1. 初始化 Cesium Viewer
var viewer = new Cesium.Viewer('cesiumContainer', {timeline: true,  // 顯示時間軸animation: true  // 顯示動畫控制器
});

創建一個 Cesium Viewer 實例,并且啟用時間軸和動畫控制器。

  1. 設置時鐘參數
var start = Cesium.JulianDate.fromIso8601('2025-04-03T00:00:00Z');
var stop = Cesium.JulianDate.addDays(start, 1, new Cesium.JulianDate());
viewer.clock.startTime = start.clone();
viewer.clock.stopTime = stop.clone();
viewer.clock.currentTime = start.clone();

定義時鐘的起始時間和結束時間,并且將當前時間設置為起始時間。

  1. 設置時間乘數和時鐘范圍
viewer.clock.multiplier = 3600; // 每幀前進一小時
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP; // 到達結束時間后循環播放
viewer.clock.clockStep = Cesium.ClockStep.SYSTEM_CLOCK_MULTIPLIER;
  • multiplier:設置時間推進的速度,這里表示每幀前進一小時。
  • clockRange:設置時鐘到達結束時間后的行為,LOOP_STOP 表示到達結束時間后循環播放。
  • clockStep:設置時鐘推進的方式,SYSTEM_CLOCK_MULTIPLIER 表示根據系統時鐘和 multiplier 推進。
  1. 創建實體
var entity = viewer.entities.add({position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),point: {pixelSize: 10,color: Cesium.Color.RED}
});

創建一個紅色的點實體,用于演示動畫。

  1. 動畫回調函數
viewer.clock.onTick.addEventListener(function (clock) {// 在每次時鐘更新時,更新實體的顏色var currentTime = clock.currentTime;var fraction = Cesium.JulianDate.secondsDifference(currentTime, start) / Cesium.JulianDate.secondsDifference(stop, start);entity.point.color = Cesium.Color.fromHsl(fraction, 1.0, 0.5);
});

監聽 viewer.clock.onTick 事件,在每次時鐘更新時,根據當前時間計算一個顏色值,并更新實體的顏色。這樣就實現了一個簡單的動畫效果。

Cesium 之 實體動畫

構建實體動畫的技巧

1. 利用時間屬性
  • 插值動畫:借助 SampledPositionPropertyConstantProperty 等屬性類,為實體的位置、姿態等屬性設置隨時間變化的值。例如,你可以使用 SampledPositionProperty 按時間順序添加多個位置點,Cesium 會自動在這些點之間進行插值,從而實現平滑的移動動畫。
var positionProperty = new Cesium.SampledPositionProperty();
positionProperty.addSample(Cesium.JulianDate.fromIso8601('2025-04-03T00:00:00Z'), Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883));
positionProperty.addSample(Cesium.JulianDate.fromIso8601('2025-04-03T01:00:00Z'), Cesium.Cartesian3.fromDegrees(-76.59777, 41.03883));
var entity = viewer.entities.add({position: positionProperty,point: {pixelSize: 10,color: Cesium.Color.RED}
});
  • 時間范圍控制:合理設置 ClockstartTimestopTimecurrentTime,以精確控制動畫的開始、結束和當前播放位置。
2. 組合動畫效果
  • 多屬性動畫:同時對實體的多個屬性(如位置、顏色、大小)進行動畫設置,從而創建更豐富的動畫效果。例如,在實體移動的同時改變其顏色。
viewer.clock.onTick.addEventListener(function (clock) {var currentTime = clock.currentTime;var fraction = Cesium.JulianDate.secondsDifference(currentTime, start) / Cesium.JulianDate.secondsDifference(stop, start);entity.point.color = Cesium.Color.fromHsl(fraction, 1.0, 0.5);entity.point.pixelSize = 10 + 10 * Math.sin(fraction * Math.PI * 2);
});
  • 序列動畫:按順序依次播放不同的動畫,實現復雜的動畫流程。你可以通過在不同的時間區間設置不同的屬性值來達成這一目的。
3. 使用動畫曲線
  • 自定義插值函數:除了默認的線性插值,你還可以自定義插值函數,以實現更自然的動畫效果。例如,使用緩動函數(如 easeInOut)讓動畫的開始和結束更加平滑。
function easeInOut(t) {return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
}
viewer.clock.onTick.addEventListener(function (clock) {var currentTime = clock.currentTime;var fraction = Cesium.JulianDate.secondsDifference(currentTime, start) / Cesium.JulianDate.secondsDifference(stop, start);var easedFraction = easeInOut(fraction);entity.point.color = Cesium.Color.fromHsl(easedFraction, 1.0, 0.5);
});

優化點

1. 減少屬性更新頻率
  • 批量更新:避免在每一幀都對實體的屬性進行更新,可在必要時批量更新屬性。例如,只有當時間間隔達到一定值時才更新實體的顏色。
var updateInterval = 0.1; // 每 0.1 秒更新一次
var lastUpdateTime = -Infinity;
viewer.clock.onTick.addEventListener(function (clock) {var currentTime = clock.currentTime;var elapsedSeconds = Cesium.JulianDate.secondsDifference(currentTime, start);if (elapsedSeconds - lastUpdateTime >= updateInterval) {var fraction = elapsedSeconds / Cesium.JulianDate.secondsDifference(stop, start);entity.point.color = Cesium.Color.fromHsl(fraction, 1.0, 0.5);lastUpdateTime = elapsedSeconds;}
});
  • 緩存計算結果:對于一些復雜的計算結果,如三角函數值、插值系數等,進行緩存,避免重復計算。
2. 優化實體數量
  • 按需加載:僅在需要時加載和顯示實體,避免一次性加載過多實體導致性能下降。例如,根據相機的位置和視野范圍,動態加載和卸載實體。
  • 合并實體:如果多個實體具有相似的屬性和動畫效果,可以考慮將它們合并為一個實體,減少渲染開銷。
3. 合理使用材質和紋理
  • 簡單材質:盡量使用簡單的材質和紋理,避免使用過于復雜的紋理和特效,以減少 GPU 負擔。
  • 紋理壓縮:對紋理進行壓縮,降低紋理的內存占用。

注意事項

1. 時間同步
  • 時鐘設置:確保所有實體的動畫都使用相同的 Clock 對象,以保證動畫的時間同步。
  • 跨幀一致性:在動畫回調函數中,要確保每次更新的結果在不同幀之間具有一致性,避免出現跳躍或閃爍的現象。
2. 內存管理
  • 實體銷毀:當動畫結束或不再需要某個實體時,及時銷毀該實體,釋放內存。
viewer.entities.remove(entity);
  • 屬性清理:對于不再使用的屬性對象,及時清理,避免內存泄漏。
3. 兼容性
  • 不同瀏覽器和設備:在不同的瀏覽器和設備上測試動畫效果,確保動畫在各種環境下都能正常顯示和運行。
  • 版本兼容性:注意 Cesium 庫的版本兼容性,不同版本的 API 可能會有所不同。

坐標系轉換

在 Cesium 里,坐標系轉化是常見的操作,特別是在處理 WGS84(地理坐標系)、Web 墨卡托投影坐標系以及二維坐標與平面坐標轉換時。下面為你詳細介紹這些坐標系轉化的方法,并給出對應的代碼示例。

1. WGS84 與 Web 墨卡托投影坐標系轉換

1.1 WGS84 轉 Web 墨卡托

WGS84 是一種地理坐標系,使用經度、緯度和高度來表示位置;而 Web 墨卡托投影坐標系是一種平面坐標系,常用于地圖顯示。在 Cesium 中,可以使用 Cesium.CartographicCesium.WebMercatorProjection 來實現轉換。

// 定義 WGS84 坐標(經度、緯度、高度)
var longitude = Cesium.Math.toRadians(-75.59777);
var latitude = Cesium.Math.toRadians(40.03883);
var height = 0;// 創建 Cartographic 對象
var cartographic = new Cesium.Cartographic(longitude, latitude, height);// 創建 Web 墨卡托投影對象
var projection = new Cesium.WebMercatorProjection();// 轉換為 Web 墨卡托坐標
var webMercator = projection.project(cartographic);
1.2 Web 墨卡托轉 WGS84
// 定義 Web 墨卡托坐標
var x = webMercator.x;
var y = webMercator.y;// 反投影到 WGS84
var cartographicBack = projection.unproject(webMercator);// 獲取經度、緯度和高度
var longitudeBack = Cesium.Math.toDegrees(cartographicBack.longitude);
var latitudeBack = Cesium.Math.toDegrees(cartographicBack.latitude);
var heightBack = cartographicBack.height;

2. 二維屏幕坐標與 WGS84 坐標轉換

2.1 二維屏幕坐標轉 WGS84 坐標

當用戶在屏幕上點擊某個位置時,需要將屏幕坐標轉換為 WGS84 坐標。可以使用 viewer.scene.pickPosition 方法來實現。

// 監聽鼠標點擊事件
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (movement) {// 獲取屏幕坐標var cartesian = viewer.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid);if (cartesian) {// 將笛卡爾坐標轉換為 WGS84 坐標var cartographic = Cesium.Cartographic.fromCartesian(cartesian);var longitude = Cesium.Math.toDegrees(cartographic.longitude);var latitude = Cesium.Math.toDegrees(cartographic.latitude);var height = cartographic.height;console.log('經度:', longitude, '緯度:', latitude, '高度:', height);}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
2.2 WGS84 坐標轉二維屏幕坐標
// 定義 WGS84 坐標
var longitude = Cesium.Math.toRadians(-75.59777);
var latitude = Cesium.Math.toRadians(40.03883);
var height = 0;// 創建 Cartographic 對象
var cartographic = new Cesium.Cartographic(longitude, latitude, height);// 將 WGS84 坐標轉換為笛卡爾坐標
var cartesian = Cesium.Ellipsoid.WGS84.cartographicToCartesian(cartographic);// 將笛卡爾坐標轉換為屏幕坐標
var canvasPosition = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, cartesian);

3. 二維平面坐標與 WGS84 坐標轉換

3.1 二維平面坐標(局部坐標系)轉 WGS84 坐標

如果有一個局部的二維平面坐標系,需要將其轉換為 WGS84 坐標,可以先定義一個原點的 WGS84 坐標,然后根據平面坐標的偏移量進行轉換。

// 定義原點的 WGS84 坐標
var originLongitude = Cesium.Math.toRadians(-75.59777);
var originLatitude = Cesium.Math.toRadians(40.03883);
var originHeight = 0;
var originCartographic = new Cesium.Cartographic(originLongitude, originLatitude, originHeight);
var originCartesian = Cesium.Ellipsoid.WGS84.cartographicToCartesian(originCartographic);// 定義局部二維平面坐標(x, y 偏移量)
var localX = 100;
var localY = 200;// 假設局部坐標系的單位為米,計算偏移后的笛卡爾坐標
var offsetCartesian = new Cesium.Cartesian3(originCartesian.x + localX,originCartesian.y + localY,originCartesian.z
);// 將笛卡爾坐標轉換為 WGS84 坐標
var cartographic = Cesium.Cartographic.fromCartesian(offsetCartesian);
var longitude = Cesium.Math.toDegrees(cartographic.longitude);
var latitude = Cesium.Math.toDegrees(cartographic.latitude);
var height = cartographic.height;
3.2 WGS84 坐標轉二維平面坐標(局部坐標系)
// 定義目標 WGS84 坐標
var targetLongitude = Cesium.Math.toRadians(-75.59778);
var targetLatitude = Cesium.Math.toRadians(40.03884);
var targetHeight = 0;
var targetCartographic = new Cesium.Cartographic(targetLongitude, targetLatitude, targetHeight);
var targetCartesian = Cesium.Ellipsoid.WGS84.cartographicToCartesian(targetCartographic);// 計算相對于原點的偏移量
var offset = Cesium.Cartesian3.subtract(targetCartesian, originCartesian, new Cesium.Cartesian3());
var localX = offset.x;
var localY = offset.y;

通過上述代碼示例,你可以在 Cesium 中實現不同坐標系之間的轉換。在實際應用中,需要根據具體需求選擇合適的轉換方法。

技術名詞解釋(局部坐標系)

在地理信息系統(GIS)和三維可視化場景(如使用 Cesium 構建的場景)中,局部坐標系是一種非常有用的概念,下面為你詳細解釋。

定義與概念

局部坐標系是相對于全局坐標系(如 WGS84 地理坐標系)而言的,它是為了方便在特定區域內進行精確的位置描述和計算而建立的一種相對坐標系。在局部坐標系里,我們可以自由定義原點、坐標軸方向和單位長度,以此簡化在該特定區域內的幾何計算和數據處理。

為什么需要局部坐標系

  • 簡化計算:在處理小范圍的地理數據或者三維模型時,使用全局的 WGS84 坐標系可能會因為數值過大或者地球曲率的影響,導致計算復雜且容易出現精度問題。而局部坐標系可以將坐標值縮小到一個相對較小的范圍內,減少計算誤差,提高計算效率。
  • 方便建模:在創建三維模型或者進行場景設計時,使用局部坐標系可以更直觀地描述物體的位置和方向。例如,在設計一個建筑物的三維模型時,我們可以將建筑物的某個角點作為局部坐標系的原點,然后根據建筑物的實際尺寸和方向來定義坐標軸,這樣就可以更方便地確定建筑物各個部分的位置。

局部坐標系的構成要素

  • 原點:局部坐標系的原點是一個在全局坐標系中已知位置的點。在地理場景中,這個原點可以是某個特定的地理坐標點,比如一個城市的中心、一個建筑物的某個角點等。
  • 坐標軸方向:局部坐標系的坐標軸方向通常是根據具體的應用需求來定義的。在二維平面中,常見的做法是將一個坐標軸定義為水平方向(通常是向東),另一個坐標軸定義為垂直方向(通常是向北)。在三維空間中,還需要定義一個垂直于平面的坐標軸(通常是向上)。
  • 單位長度:局部坐標系的單位長度可以根據實際情況進行定義。在地理場景中,常用的單位長度是米。

在 Cesium 中的應用示例解釋

在之前提供的 Cesium 代碼示例中,我們構建了一個簡單的局部二維平面坐標系并進行了坐標轉換:

// 定義原點的 WGS84 坐標
var originLongitude = Cesium.Math.toRadians(-75.59777);
var originLatitude = Cesium.Math.toRadians(40.03883);
var originHeight = 0;
var originCartographic = new Cesium.Cartographic(originLongitude, originLatitude, originHeight);
var originCartesian = Cesium.Ellipsoid.WGS84.cartographicToCartesian(originCartographic);// 定義局部二維平面坐標(x, y 偏移量)
var localX = 100;
var localY = 200;// 假設局部坐標系的單位為米,計算偏移后的笛卡爾坐標
var offsetCartesian = new Cesium.Cartesian3(originCartesian.x + localX,originCartesian.y + localY,originCartesian.z
);// 將笛卡爾坐標轉換為 WGS84 坐標
var cartographic = Cesium.Cartographic.fromCartesian(offsetCartesian);
var longitude = Cesium.Math.toDegrees(cartographic.longitude);
var latitude = Cesium.Math.toDegrees(cartographic.latitude);
var height = cartographic.height;
  • 原點定義:代碼中首先定義了一個原點的 WGS84 坐標,將其轉換為笛卡爾坐標 originCartesian,這個點就是局部坐標系的原點。
  • 局部坐標表示localXlocalY 表示在局部坐標系中的偏移量,單位為米。通過將這些偏移量加到原點的笛卡爾坐標上,就可以得到在全局坐標系中的新位置。
  • 坐標轉換:最后,將得到的笛卡爾坐標轉換回 WGS84 坐標,這樣就完成了從局部坐標系到全局坐標系的轉換。

通過這種方式,我們可以在局部坐標系中方便地進行位置計算和處理,然后再將結果轉換回全局坐標系進行展示和分析。

定義局部二維平面坐標(x, y 偏移量)的原因

在構建局部坐標系并進行坐標轉換時,定義 localXlocalY 這兩個偏移量是為了描述在局部坐標系中某個點相對于原點的位置。

在實際應用場景里,我們常常需要在特定的小范圍內進行精確的位置計算和表示。以地理信息系統為例,當你要描述一個建筑物內部各個房間的位置,或者一個小型園區內各個設施的位置時,直接使用全局的地理坐標(如 WGS84 坐標)會比較復雜,而且在小范圍內使用地理坐標進行計算還可能會因為地球曲率等因素產生精度問題。

這時,我們就可以建立一個局部坐標系,將這個小范圍的某個特征點(如建筑物的某個墻角、園區的大門位置等)作為局部坐標系的原點。然后,使用 localXlocalY 來表示其他點相對于原點在水平和垂直方向上的偏移距離,這樣就能更方便、更精確地描述這些點的位置。

是否可以隨便改值

可以隨意修改 localXlocalY 的值,這取決于你具體的需求:

  • 描述不同位置:修改 localXlocalY 的值可以表示局部坐標系中不同的點。例如,如果你想描述局部坐標系中另一個位置的點,就可以通過調整這兩個偏移量來實現。比如,將 localX 改為 300,localY 改為 400,就表示該點相對于原點在水平方向上偏移 300 個單位(這里假設單位是米),在垂直方向上偏移 400 個單位。
  • 模擬移動或變化:在動畫或者動態場景中,你可以動態地改變 localXlocalY 的值,來模擬物體在局部坐標系中的移動。例如,在一個模擬車輛在園區內行駛的場景中,隨著時間的推移,不斷更新 localXlocalY 的值,就可以讓車輛在局部坐標系中移動,然后再將其轉換到全局坐標系中進行展示。

不過,在修改這兩個值時,需要注意以下幾點:

  • 單位一致性:要確保 localXlocalY 的單位與你所設定的局部坐標系的單位一致。如果單位是米,那么所有的偏移量都應該以米為單位進行計算。
  • 范圍合理性:要考慮局部坐標系的范圍和實際應用場景的限制。如果偏移量過大,可能會超出局部坐標系所能合理表示的范圍,或者導致轉換后的全局坐標出現不合理的結果。

以下是一個簡單的示例代碼,展示了如何動態改變 localXlocalY 的值來模擬物體的移動:

// 定義原點的 WGS84 坐標
var originLongitude = Cesium.Math.toRadians(-75.59777);
var originLatitude = Cesium.Math.toRadians(40.03883);
var originHeight = 0;
var originCartographic = new Cesium.Cartographic(originLongitude, originLatitude, originHeight);
var originCartesian = Cesium.Ellipsoid.WGS84.cartographicToCartesian(originCartographic);// 初始局部二維平面坐標(x, y 偏移量)
var localX = 0;
var localY = 0;// 模擬物體移動,每 1 秒更新一次位置
setInterval(function () {localX += 10;localY += 10;// 假設局部坐標系的單位為米,計算偏移后的笛卡爾坐標var offsetCartesian = new Cesium.Cartesian3(originCartesian.x + localX,originCartesian.y + localY,originCartesian.z);// 將笛卡爾坐標轉換為 WGS84 坐標var cartographic = Cesium.Cartographic.fromCartesian(offsetCartesian);var longitude = Cesium.Math.toDegrees(cartographic.longitude);var latitude = Cesium.Math.toDegrees(cartographic.latitude);var height = cartographic.height;console.log('當前位置:經度', longitude, '緯度', latitude, '高度', height);
}, 1000);

在這個示例中,每 1 秒 localXlocalY 都會增加 10,從而模擬物體在局部坐標系中的移動,然后將其轉換為全局的 WGS84 坐標并輸出。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75519.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75519.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75519.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ngx_regex_init

定義在 src\core\ngx_regex.c void ngx_regex_init(void) { #if !(NGX_PCRE2)pcre_malloc ngx_regex_malloc;pcre_free ngx_regex_free; #endif } NGX_PCRE21 #if !(NGX_PCRE2) 就為假 條件不成立 ngx_regex_init 函數就成了空實現 NGX_PCRE2 被定義&#xff0c;則表示 Ngin…

第二期:深入理解 Spring Web MVC [特殊字符](核心注解 + 進階開發)

前言&#xff1a; 歡迎來到 Spring Web MVC 深入學習 的第二期&#xff01;在第一期中&#xff0c;我們介紹了 Spring Web MVC 的基礎知識&#xff0c;學習了如何 搭建開發環境、配置 Spring MVC、編寫第一個應用&#xff0c;并初步了解了 控制器、視圖解析、請求處理流程 等核…

一文讀懂數據倉庫:從概念到技術落地

數據倉庫是一個面向主題的、集成的、相對穩定的、反映歷史變化的數據集合&#xff0c;用于支持管理決策。以下是關于數據倉庫的詳細介紹&#xff1a; 一、特點 面向主題&#xff1a;數據倉庫圍繞特定主題組織數據&#xff0c;如客戶、產品、銷售等&#xff0c;而不是像傳統數…

JavaScript學習18-css操作和事件處理程序(html/DOM0/DOM2)

一、css操作 第一種&#xff1a;容易出錯 第二種&#xff1a;有效避免錯誤 第三種&#xff1a; 二、事件處理程序 1.HTML事件 2.DOM0級事件處理 3.DOM2級事件處理

npm設置代理和取消代理

設置代理 具體代理端口要根據自己的來 npm config set proxy http://127.0.0.1:7890 npm config set https-proxy http://127.0.0.1:7890取消代理 npm config delete proxy npm config delete https-proxy查看代理 npm config get proxy # 應返回 null npm config get…

從零開始訓練Codebook:基于ViT的圖像重建實踐

完整代碼在文末&#xff0c;可以一鍵運行。 1. 核心原理 Codebook是一種離散表征學習方法&#xff0c;其核心思想是將連續特征空間映射到離散的碼本空間。我們的實現方案包含三個關鍵組件&#xff1a; 1.1 ViT編碼器 class ViTEncoder(nn.Module):def __init__(self, codebo…

大數據筆試題_第一階段配套筆試題02

已知一個字符類型的日期&#xff1a;2022-01-20&#xff0c;請用SQL顯示出此日期對應的下個月的月份&#xff0c;結果要求為Number類型&#xff08;202201&#xff09;。 參考答案 sql SELECT to_date(2022-01-20, yyyy-mm-dd) a1,add_months(to_date(2022-01-20, yyyy-mm-d…

C++實現對象單例模式

在 C 中實現單例模式有多種方法&#xff0c;以下是線程安全的現代 C 實現方式&#xff08;推薦 C11 及以上版本&#xff09;&#xff1a; 1. Meyers’ Singleton&#xff08;推薦&#xff09; class Singleton { public:// 刪除拷貝構造和賦值運算符Singleton(const Singleto…

企業常用Linux服務搭建

1.需要兩臺centos 7服務器&#xff0c;一臺部署DNS服務器&#xff0c;另一臺部署ftp和Samba服務器。 2. 部署DNS 服務器? #!/bin/bash# 更新系統 echo "更新系統..." sudo yum update -y# 安裝 BIND 和相關工具 echo "安裝 BIND 和相關工具..." sudo y…

UE5Actor模塊源碼深度剖析:從核心架構到實踐應用

UE5 Actor模塊源碼深度剖析:從核心架構到實踐應用 a. UE5 Actor模塊架構概述 在UE5引擎中,Actor扮演著至關重要的角色,它是整個游戲世界中各類可交互對象的基礎抽象。從本質上來說,所有能夠被放置到關卡中的對象都屬于Actor的范疇,像攝像機、靜態網格體以及玩家起始位置…

DreamDiffusion代碼學習及復現

論文解讀在這里 File path | Description /pretrains ┣ &#x1f4c2; models ┃ ┗ &#x1f4dc; config.yaml ┃ ┗ &#x1f4dc; v1-5-pruned.ckpt┣ &#x1f4c2; generation ┃ ┗ &#x1f4dc; checkpoint_best.pth ┣ &#x1f4c2; eeg_pretain ┃ ┗ …

用Python實現TCP代理

依舊是Python黑帽子這本書 先附上代碼&#xff0c;我在原書代碼上加了注釋&#xff0c;更好理解 import sys import socket import threading#生成可打印字符映射 HEX_FILTER.join([(len(repr(chr(i)))3) and chr(i) or . for i in range(256)])#接收bytes或string類型的輸入…

Pyinstaller 打包flask_socketio為exe程序后出現:ValueError: Invalid async_mode specified

Pyinstaller 打包flask_socketio為exe程序后出現&#xff1a;ValueError: Invalid async_mode specified 一、詳細描述問題描述 Traceback (most recent call last): File "app_3.py", line 22, in <module> File "flask_socketio\__init__.py"…

django REST framework(DRF)教程

Django DRF API Django 基本使用Django DRF序列化器Django DRF視圖Django DRF常用功能Django 基本使用 前后端分離開發模式認識RestFulAPI回顧Django開發模式Django REST Framework初探前后端分離開發模式 前后端分離前:前端頁面看到的效果都是由后端控制,即后端渲染HTML頁面…

【Linux】Orin NX + Ubuntu22.04配置國內源

1、獲取源 清華源 arm 系統的源,可以在如下地址獲取到 https://mirror.tuna.tsinghua.edu.cn/help/ubuntu-ports/ 選擇HTTPS,否則可能報錯: 明文簽署文件不可用,結果為‘NOSPLIT’(您的網絡需要認證嗎?)查看Orin NX系統版本 選擇jammy的源 2、更新源 1)備份原配…

【含文檔+PPT+源碼】基于微信小程序的社交攝影約拍平臺的設計與實現

項目介紹 本課程演示的是一款基于微信小程序的社交攝影約拍平臺的設計與實現&#xff0c;主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 1.包含&#xff1a;項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本套系…

JDBC常用的接口

一、什么是JDBC JDBC是Java語言連接數據庫的接口規范。 二、JDBC的體系 1、Java官方提供一個操作數據庫的抽象接口 抽象接口有很多的接口和抽象類。 例如&#xff1a;Driver、Connection、Statement。 2、各個數據庫廠商提供各自的Java實現類 需要各自實現具體的細節。 例如&am…

容器適配器-stack棧

C標準庫不只是包含了順序容器&#xff0c;還包含一些為滿足特殊需求而設計的容器&#xff0c;它們提供簡單的接口。 這些容器可被歸類為容器適配器(container adapter)&#xff0c;它們是改造別的標準順序容器&#xff0c;使之滿足特殊需求的新容器。 適配器:也稱配置器,把一…

[250403] HuggingFace 新增檢查模型與電腦兼容性的功能 | Firefox 發布137.0 支持標簽組

目錄 Hugging Face 讓尋找兼容的 AI 模型變得更容易Firefox 137 版本更新摘要 Hugging Face 讓尋找兼容的 AI 模型變得更容易 Hugging Face 是一個流行的在線平臺&#xff0c;用于訪問開源人工智能 (AI) 工具和模型。該平臺推出了一項有用的新功能&#xff0c;允許個人輕松檢查…

.NET 創建MCP使用大模型對話二:調用遠程MCP服務

在上一篇文章.NET 創建MCP使用大模型對話-CSDN博客中&#xff0c;我們簡述了如何使用mcp client使用StdIo模式調用本地mcp server。本次實例將會展示如何使用mcp client模式調用遠程mcp server。 一&#xff1a;創建mcp server 我們創建一個天氣服務。 新建WebApi項目&#x…