主頁 > 企業開發 > Cesium加載ArcGIS Server4490且orgin -400 400的切片服務

Cesium加載ArcGIS Server4490且orgin -400 400的切片服務

2023-04-26 07:56:15 企業開發

Cesium在使用加載Cesium.ArcGisMapServerImageryProvider加載切片服務時,默認只支持wgs84的4326坐標系,不支持CGCS2000的4490坐標系,

如果是ArcGIS發布的4490坐標系的切片服務,如果原點在orgin X: -180.0Y: 90.0的情況下,我們可以通過WebMapTileServiceImageryProvider按照WMTS的方式加載(需符合OGC標準的WMTS型別),

但是對于ArcGIS發布4490坐標系的切片服務,如果原點在orgin X: -400.0Y: 400.0的情況下,我們無法實作加載,本文通過示例演示實作Cesium加載ArcGIS Server4490且orgin -400 400的切片服務,

本文使用:

Cesium原始碼版本:1.94

原始碼打包測驗參考另一篇檔案:cesium原始碼編譯除錯及呼叫全程序

另外,本文的一些解釋需要對切片原理有一定了解(想進一步了解的話可以去看看相關檔案說明,不想了解的話按步驟修改就行了),

為了能夠除錯原始碼,打包的時候使用命令:npm run combine

一、通過修改原始碼實作ArcGIS的切片服務,需要修改的原始碼檔案包括:

  • ArcGisMapServerImageryProvider
  • GeographicTilingScheme
  • Ellipsoid

1、修改ArcGisMapServerImageryProvider類

通過查看ArcGisMapServerImageryProvider(\Source\Scene\ArcGisMapServerImageryProvider.js)原始碼,我們發現它不支持CGCS2000的4490坐標系(僅支持wgs84的4326坐標系):

找到metadataSuccess方法,進行以下修改:

(1)讀取切片元資料時增加支持wkid 4490坐標系的判斷,同時將切片資訊也傳入,目的是為了后面在獲取行列號xy時,可以通過讀取切片資訊,使用自定義方法改寫行列號的獲取方式,

else if (data.tileInfo.spatialReference.wkid === 4490) {
        that._tilingScheme = new GeographicTilingScheme({
          ellipsoid: options.ellipsoid,
          tileInfo: data.tileInfo,
          rectangle: that._rectangle,
          numberOfLevelZeroTilesX: options.numberOfLevelZeroTilesX,
          numberOfLevelZeroTilesY: options.numberOfLevelZeroTilesY
        });
        
        that._tilingScheme._tileInfo = data.tileInfo;//附加自定義屬性
      }

 具體位置如圖所示:

(2)fullExtent范圍增加wkid 4490坐標系判斷,

else if (data.fullExtent.spatialReference.wkid === 4326 || data.fullExtent.spatialReference.wkid === 4490) {
            that._rectangle = Rectangle.fromDegrees(
              data.fullExtent.xmin,
              data.fullExtent.ymin,
              data.fullExtent.xmax,
              data.fullExtent.ymax
            );
          }

 代碼位置:

 2、修改GeographicTilingScheme類

GeographicTilingScheme類的位置是:\Source\Core\GeographicTilingScheme.js

通過增加4490坐標系的橢球、矩陣范圍等定義,4490坐標系默認橢球為CGCS2000,矩陣范圍為(-180,-90,180,90),開放矩陣范圍的目的就是為了支持自定義的origin原點,

if (defined(options.tileInfo)
    && defined(options.tileInfo.spatialReference)
    && defined(options.tileInfo.spatialReference.wkid)
    && options.tileInfo.spatialReference.wkid == 4490) {
    this._tileInfo = options.tileInfo;
    this._ellipsoid = defaultValue(options.ellipsoid, Ellipsoid.CGCS2000);
    this._rectangle = defaultValue(options.rectangle, Rectangle.fromDegrees(-180, -90, 180, 90));
    this._numberOfLevelZeroTilesX = defaultValue(options.numberOfLevelZeroTilesX, 4);
    this._numberOfLevelZeroTilesY = defaultValue(options.numberOfLevelZeroTilesY, 2);
  }
  else {
    this._ellipsoid = defaultValue(options.ellipsoid, Ellipsoid.WGS84);
    this._rectangle = defaultValue(options.rectangle, Rectangle.MAX_VALUE);
    this._numberOfLevelZeroTilesX = defaultValue(options.numberOfLevelZeroTilesX, 2);
    this._numberOfLevelZeroTilesY = defaultValue(options.numberOfLevelZeroTilesY, 1);
  }
  this._projection = new GeographicProjection(this._ellipsoid);

代碼位置: 

 (2)修改切片矩陣計算獲取行列號數量xy值的原型方法getNumberOfXTilesAtLevel和getNumberOfYTilesAtLeve

/**
 * Gets the total number of tiles in the X direction at a specified level-of-detail.
 *
 * @param {Number} level The level-of-detail.
 * @returns {Number} The number of tiles in the X direction at the given level.
 */
GeographicTilingScheme.prototype.getNumberOfXTilesAtLevel = function (level) {
  // return this._numberOfLevelZeroTilesX << level;
  if (!defined(this._tileInfo)) {
    return this._numberOfLevelZeroTilesX << level
  } else { // 使用切片矩陣計算
    var currentMatrix = this._tileInfo.lods.filter(function (item) {
      return item.level === level
    })
    var currentResolution = currentMatrix[0].resolution
    // return Math.round(360 / (this._tileInfo.rows * currentResolution))
    return Math.round(CesiumMath.toDegrees(CesiumMath.TWO_PI * 2) / (this._tileInfo.rows * currentResolution));
  }
};

/**
 * Gets the total number of tiles in the Y direction at a specified level-of-detail.
 *
 * @param {Number} level The level-of-detail.
 * @returns {Number} The number of tiles in the Y direction at the given level.
 */
GeographicTilingScheme.prototype.getNumberOfYTilesAtLevel = function (level) {
  // return this._numberOfLevelZeroTilesY << level;
  if (!defined(this._tileInfo)) {
    return this._numberOfLevelZeroTilesY << level
  } else { // 使用切片矩陣計算
    var currentMatrix = this._tileInfo.lods.filter(function (item) {
      return item.level === level
    })
    var currentResolution = currentMatrix[0].resolution
    // return Math.round(180 / (this._tileInfo.cols * currentResolution))
    return Math.round(CesiumMath.toDegrees(CesiumMath.TWO_PI * 2) / (this._tileInfo.cols * currentResolution));
  }
};

代碼位置:

這段代碼和參考文章的代碼存在一定出入,在文末會做詳細說明,

3、修改Ellipsoid類,定義2000橢球引數

Ellipsoid類位置:\Source\Core\Ion.js

 定義2000橢球引數:

/**
 * An Ellipsoid instance initialized to the CGCS2000 standard.
 *
 * @type {Ellipsoid}
 * @constant
 */
Ellipsoid.CGCS2000 = Object.freeze(
  new Ellipsoid(6378137.0, 6378137.0, 6356752.31414035585)
);

 代碼位置:

二、代碼呼叫

原始碼修改后,為了能夠除錯原始碼,使用npm run combine打包下代碼,并在呼叫地方修改下參考,

測驗用html頁面(做測驗的頁面,有一些其他代碼,可以忽略,留意本文需要的代碼部分):

<!DOCTYPE html>
<html lang="en">
<head>
    <!-- Use correct character set. -->
    <meta charset="utf-8"/>
    <!-- Tell IE to use the latest, best version. -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <!-- Make the application on mobile take up the full browser screen and disable user scaling. -->
    <meta
            name="viewport"
            content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"
    />
    <title>cesium加載影像和矢量資料</title>
    <script src="https://www.cnblogs.com/kk8085/Build/CesiumUnminified/Cesium.js"></script>
    <style>
        @import url(../Build/CesiumUnminified/Widgets/widgets.css);

        html,
        body,
        #cesiumContainer {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
            overflow: hidden;
        }
    </style>
</head>
<body>
<div id="cesiumContainer"></div>
<script>
    //天地圖token
    let TDT_tk = "b0df1f950b1fd6914abe9e17079c0345";
    //Cesium token
    let cesium_tk = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI1NThjYTk0MC03YjQwLTQ3YWYtOTY5Yy04NDk3OTJmMmI4NDciLCJpZCI6NzAxOTMsImlhdCI6MTYzNDA4ODE1N30.TB1v9XXATQLUGE5GNki_fYFMHddIyQ9arXPIx65e09s";
    //天地圖影像
    let TDT_IMG_C = "http://{s}.tianditu.gov.cn/img_c/wmts?service=wmts&request=GetTile&version=1.0.0" +
        "&LAYER=img&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}" +
        "&style=default&format=tiles&tk=" + TDT_tk;

    //標注
    let TDT_CIA_C = "http://{s}.tianditu.gov.cn/cia_c/wmts?service=wmts&request=GetTile&version=1.0.0" +
        "&LAYER=cia&tileMatrixSet=c&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}" +
        "&style=default&format=tiles&tk=" + TDT_tk;
    
    //初始頁面加載
    //Cesium.Ion.defaultAccessToken = cesium_tk;
    var cgs2000Ellipsolid = Cesium.Ellipsoid.CGCS2000
    var cgs2000GeographicProj = new Cesium.GeographicProjection(cgs2000Ellipsolid)
    let viewer = new Cesium.Viewer('cesiumContainer', {
        // baseLayerPicker: false,
        timeline: true,
        homeButton: true,
        fullscreenButton: true,
        infoBox: true,
        animation: true,
        shouldAnimate: true,
        mapProjection: cgs2000GeographicProj
        //imageryProvider: layer, //設定默認底圖
    });
    let rightTilt = true;
    if (rightTilt) {
      viewer.scene.screenSpaceCameraController.tiltEventTypes = [
        Cesium.CameraEventType.RIGHT_DRAG,
        Cesium.CameraEventType.PINCH,
        {
          eventType: Cesium.CameraEventType.LEFT_DRAG,
          modifier: Cesium.KeyboardEventModifier.CTRL
        },
        {
          eventType: Cesium.CameraEventType.RIGHT_DRAG,
          modifier: Cesium.KeyboardEventModifier.CTRL
        }
      ]
      viewer.scene.screenSpaceCameraController.zoomEventTypes = [
        Cesium.CameraEventType.MIDDLE_DRAG,
        Cesium.CameraEventType.WHEEL,
        Cesium.CameraEventType.PINCH
      ]
    }
    var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
    handler.setInputAction(function(evt) {
        var cartesian=viewer.camera.pickEllipsoid(evt.position,viewer.scene.globe.ellipsoid);
        var cartographic=Cesium.Cartographic.fromCartesian(cartesian);
        var lng=Cesium.Math.toDegrees(cartographic.longitude);//經度值
        var lat=Cesium.Math.toDegrees(cartographic.latitude);//緯度值
        var mapPosition={x:lng,y:lat,z:cartographic.height};//cartographic.height的值始終為零,
        alert("longitude:" + lng + ";latitude:" + lat );
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
    
    viewer.imageryLayers.remove(viewer.imageryLayers.get(0))
    //添加tms
    let tms = {};
    tms.url =  "http://10.0.7.16:81/tms";
    if (tms) {
      const layerInfo = {
        url: tms.url,
        fileExtension: tms.fileExtension || 'jpg',
        maximumLevel: tms.maxZoom || 7,
        name: 'tms'
      }
      const tmsService = new Cesium.TileMapServiceImageryProvider(layerInfo)
      tmsService.layerInfo = layerInfo
    }
    //添加地形
    let terrain = {};
    terrain.url =  "http://data.marsgis.cn/terrain";
    if (terrain) {
        const terrainLayer = new Cesium.CesiumTerrainProvider({
            url: terrain.url
            })
        viewer.terrainProvider = terrainLayer
    }

    _matrixIds = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18"]
    //呼叫影響中文注記服務
    /*viewer.imageryLayers.addImageryProvider(new Cesium.WebMapTileServiceImageryProvider({
        url: TDT_CIA_C,
        layer: "tdtImg_c",
        style: "default",
        format: "tiles",
        tileMatrixSetID: "c",
        subdomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"],
        tilingScheme: new Cesium.GeographicTilingScheme(),
        tileMatrixLabels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"],
        maximumLevel: 50,
        show: false
    }))*/
    
    /*var myGeographicTilingScheme = new Cesium.GeographicTilingScheme({
        ellipsoid: cgs2000Ellipsolid,
        rectangle: Cesium.Rectangle.fromDegrees(-400, -399.9999999999998, 400, 399.9999999999998),
        numberOfLevelZeroTilesX: 4,
        numberOfLevelZeroTilesY: 4
    })*/
    var world4490 = new Cesium.ArcGisMapServerImageryProvider({
        url: 'http://10.1.88.200:6080/arcgis/rest/services/test/global4490ori400/MapServer',
        //tilingScheme: myGeographicTilingScheme,
        rectangle: Cesium.Rectangle.fromDegrees(-400, -320, 320, 400),
        ellipsoid:cgs2000Ellipsolid,
        numberOfLevelZeroTilesX: 4,
        numberOfLevelZeroTilesY: 4
    });
    viewer.imageryLayers.addImageryProvider(world4490);
    //viewer.imageryLayers.addImageryProvider(world);
    //使用ArcGisMapServerImageryProvider加載影像沒成功,改用WebMapServiceImageryProvider
    //var world = new Cesium.ArcGisMapServerImageryProvider({
        //url:'http://10.1.88.200:6080/arcgis/rest/services/test/globaltdt5/MapServer',
    //});
    //viewer.imageryLayers.addImageryProvider(world);
    var arcgisyx = new Cesium.WebMapServiceImageryProvider({
    url:'http://10.1.88.200:6080/arcgis/rest/services/test/globaltdt5/MapServer/tile/{z}/{y}/{x}',
    layers:[0]
    });
    // viewer.imageryLayers.addImageryProvider(arcgisyx);
    var china = new Cesium.ArcGisMapServerImageryProvider({
        url:'http://10.1.88.200:6080/arcgis/rest/services/test/china4490/MapServer'
    });
    viewer.imageryLayers.addImageryProvider(china);
</script>
</body>
</html>

1、定義橢球體部分:

 var cgs2000Ellipsolid = Cesium.Ellipsoid.CGCS2000
    var cgs2000GeographicProj = new Cesium.GeographicProjection(cgs2000Ellipsolid)

2、初始化Cesium.Viewer時,增加2000的mapProjection

let viewer = new Cesium.Viewer('cesiumContainer', {
        // baseLayerPicker: false,
        timeline: true,
        homeButton: true,
        fullscreenButton: true,
        infoBox: true,
        animation: true,
        shouldAnimate: true,
        mapProjection: cgs2000GeographicProj
        //imageryProvider: layer, //設定默認底圖
    });

3、呼叫關鍵代碼,加載圖層

var world4490 = new Cesium.ArcGisMapServerImageryProvider({
        url: 'http://10.1.88.200:6080/arcgis/rest/services/test/global4490ori400/MapServer',
        //tilingScheme: myGeographicTilingScheme,
        rectangle: Cesium.Rectangle.fromDegrees(-400, -320, 320, 400),
        ellipsoid:cgs2000Ellipsolid,
        numberOfLevelZeroTilesX: 4,
        numberOfLevelZeroTilesY: 4
    });
    viewer.imageryLayers.addImageryProvider(world4490);

說明:

(1)服務說明,發布了一個全球影像4490坐標系-400,400起點的資料(切片方案保證其他引數與-180,90一致,可從本文文末獲取切片方案xml檔案用來切片測驗)

 (2)在新建ArcGisMapServerImageryProvider時,可以不設定tilingScheme,發現ArcGisMapServerImageryProvider里有新建tilingScheme,如果設定了tilingScheme,發現這里的行列數引數沒有起作用,故直接在新建ArcGisMapServerImageryProvider傳入行列數引數,并在類中新建切片方案的時候讀取,

rectangle切片范圍:發現用(-400, -400, 400, 400)帶入整個地圖偏移了:

對切片的原理進一步了解后:

針對-400,400起點切片,為了保證和-180,90按照0級兩列一行的大小,如上圖,按照格網一樣90°大小,劃分成4行4列,切片范圍應該是(-400, -320, 320, 400),請求的切片應該6塊,行列是(行在前列在后):(1,1),(1,2),(1,3),(2,1),(2,2),(2,3)

按照這樣設定,此時再次運行后,能夠正常加載-400,400起點切片了:

以上是展開的效果,球體的效果:

 

注:

本文參考文章:https://blog.csdn.net/wokao253615105/article/details/123462643

關于getNumberOfXTilesAtLevel和getNumberOfYTilesAtLeve這段代碼和上述參考的檔案存在一定出入做進一步說明,

但是因為直接拷貝后發現不能正常加載,通過切片原理判斷得出,計算的行列式數量不對,改成了2π*2:

 

這里0級的話,-400,400起點切片獲取的xy切片數量應該是4行4列,通過反推應該是4π,如果是-180,90起點的話,是2行1列,則x應該用2π,y應該用π,原文章應該是針對-180,90起點的計算方式,

這段代碼的寫法只支持-400,400起點,因為只是為了測驗能夠把-400,400起點的切片資料,偷懶直接這么寫了,如果要同時支持兩種起點,這里的寫法應該要改成公式:(右頂點X-左頂點X)/(256*解析度);(上頂點Y-下頂點Y)/(256*解析度)

如:

-180,90起點:[180-(-180)]/(256*解析度)      范圍右頂點經度-左頂點經度,256是因為切片大小是256*256,當0級時候,解析度為0.7031250000026057

-400,400起點:[320-(-400)]/(256*解析度)      范圍右頂點經度-左頂點經度,256是因為切片大小是256*256,當0級時候,解析度為0.7031250000026057

 

本文使用的資料說明及測驗下載:

影像資料:用來切4490起點-400,400的切片資料,全球影像,天地圖5級資料合成的,

鏈接:https://pan.baidu.com/s/14SrGonqHG9gL6ixixIFVUw

矢量資料:用來驗證與影像資料疊加是否大致吻合,全國行政區資料,包括省會,國界、省界

鏈接:https://pan.baidu.com/s/1FdEaoD8rs5ogLZ2Pwa3Xxw

切片方案:起點-400,400的切片方案

鏈接:https://pan.baidu.com/s/1vTunkbMMaV3wFyXF1YwbGA

測驗頁面:cesiumlayer.html

鏈接:https://pan.baidu.com/s/1uNHBg-dY2xIgyyTuzllaPw

<本文完>

 

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

標籤:GIS

上一篇:博客園silence主題修改記錄

下一篇:返回列表

標籤雲
其他(158129) Python(38106) JavaScript(25391) Java(18001) C(15217) 區塊鏈(8260) C#(7972) AI(7469) 爪哇(7425) MySQL(7144) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5870) 数组(5741) R(5409) Linux(5329) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4561) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2431) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1960) Web開發(1951) HtmlCss(1926) python-3.x(1918) 弹簧靴(1913) C++(1911) xml(1889) PostgreSQL(1874) .NETCore(1855) 谷歌表格(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
最新发布
  • Cesium加載ArcGIS Server4490且orgin -400 400的切片服務

    Cesium在使用加載Cesium.ArcGisMapServerImageryProvider加載切片服務時,默認只支持wgs84的4326坐標系,不支持CGCS2000的4490坐標系。 如果是ArcGIS發布的4490坐標系的切片服務,如果原點在orgin X: -180.0Y: 90.0的情 ......

    uj5u.com 2023-04-26 07:56:15 more
  • 博客園silence主題修改記錄

    博客園作為一個老牌技術博客網站,有著非常濃郁的游戲開發、引擎開發以及圖形學氛圍。并且沒有像其他網站有難以接受的廣告。 雖說網站主站看著比較老,但還在接受的范圍。并且可以根據自己的喜好來自定義主題。 尋找主題 以下是找的幾個常見的主題,因為是技術博客閱讀體驗是最重要的,所以最侄訓是選中了silence ......

    uj5u.com 2023-04-25 08:27:42 more
  • axios傳遞引數的使用

    今天在學習elasticsearch時,遇到一個問題:專案中前端采用的是Vue2+axios,后端的介面采用Restful風格來接收: 關于Resultful風格: 1. GET(SELECT):從服務器取出資源(一項或多項); 2. POST(CREATE):在服務器新建一個資源; 3. PUT( ......

    uj5u.com 2023-04-25 08:27:30 more
  • 記錄-使用雙token實作無感重繪,前后端詳細代碼

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 近期寫的一個專案使用雙token實作無感重繪。最后做了一些總結,本文詳細介紹了實作流程,前后端詳細代碼。前端使用了Vue3+Vite,主要是axios封裝,服務端使用了koa2做了一個簡單的服務器模擬。 一、token 登錄鑒權 j ......

    uj5u.com 2023-04-25 08:27:19 more
  • form-create-designer-naiveui

    基于Naive UI和Form Creat的表單設計器,可以通過拖拽的方式快速創建表單,提高開發者對表單的開發效率,節省開發者的時間。 ......

    uj5u.com 2023-04-25 08:27:09 more
  • CSS 設定文字間距

    CSS 設定文字間距 一、設定字符間距 在 CSS 中,可以使用 letter-spacing 屬性來設定字符間距。該屬性控制每個字符之間的距離,可以設定負值來讓字符更接近,也可以設定正值來讓字符之間的距離更遠。 以下是一個示例,將字符間距設定為 0.1em: p { letter-spacing: ......

    uj5u.com 2023-04-25 08:27:04 more
  • js 工具類

    /*是否帶有小數*/ function isDecimal(strValue ) { var objRegExp= /^\d+\.\d+$/; return objRegExp.test(strValue); } /*校驗是否中文名稱組成 */ function ischina(str) { var ......

    uj5u.com 2023-04-25 08:26:59 more
  • 漲姿勢了,殊途同歸的圖片互動動效制作!

    最近,在 CodePen 上,看到一個非常有意思的圖片動效,效果如下: 原效果鏈接:CodePen Demo - 1 div pure CSS blinds staggered animation in 13 declarations 本身這個影片效果,并沒有多驚艷。驚艷的地方在于原作者的實作方式非 ......

    uj5u.com 2023-04-25 08:26:55 more
  • 防抖和節流及多種實作方式

    當用戶在網頁中進行操作時,如點擊、滾動、輸入等,往往會頻繁地觸發事件。如果每個事件都立即執行相應的函式,可能會導致性能問題和用戶體驗不佳,因為這些函式可能需要執行復雜的操作,如計算、網路請求等。 為了優化這種情況,我們可以使用防抖和節流來限制函式的呼叫次數,從而提高性能和用戶體驗。 防抖 防抖是指在 ......

    uj5u.com 2023-04-25 08:25:46 more
  • js 工具類

    /*是否帶有小數*/ function isDecimal(strValue ) { var objRegExp= /^\d+\.\d+$/; return objRegExp.test(strValue); } /*校驗是否中文名稱組成 */ function ischina(str) { var ......

    uj5u.com 2023-04-25 08:25:33 more