Cesiumロード座標系4490 arcgis瓦片図

4826 ワード

arcgis for server 10.2で公開されたwkid 4490の瓦図をロードする必要がある.
Cesiumバージョン番号:1.58
1.cesiumロードarcgis瓦片図フロー
1)ArcGisMapServer ImageryProviderインスタンスの作成
ArcGisMapServer ImageryProviderの_useTilesプロパティはtrueに初期化されます.
2)jsonインタフェースによるサービス情報の取得
インタフェース呼び出しに成功したら、metadataSuccess(data)内部メソッドを呼び出します.
  • タイル図
  • であるか否かを判断する.
  • タイル図の場合、座標系がスライススキームを作成すると判断することにより、G e o g raphicTilingSchemeまたはW e b M e r catorTilingScheme
  • が作成される.
  • 判断座標系:wgs 84でないとエラーになるので4490に対してはここで修正
  • を行う.
     if (tileInfo.spatialReference.wkid === 102100 ||
                        tileInfo.spatialReference.wkid === 102113) {
                        that._tilingScheme = new WebMercatorTilingScheme({ ellipsoid : options.ellipsoid });
                    } else if (data.tileInfo.spatialReference.wkid === 4326) {
                        that._tilingScheme = new GeographicTilingScheme({ ellipsoid : options.ellipsoid });
                    } else if(data.fullExtent.spatialReference.wkid === 4490){
                      that._tilingScheme = new GeographicTilingScheme({ 
                        ellipsoid : options.ellipsoid,
                        tileInfo:data.tileInfo
                       });
                    }

    3)buildImageResourceメソッドスライス情報の作成
    4)_取得するスライスのx,y,levelを計算する
    2.ArcGisMapServerImageryProvider転送dataInfoの変更
    function metadataSuccess(data) {
                var tileInfo = data.tileInfo;
                if (!defined(tileInfo)) {
                    that._useTiles = false;
                } else {
                    that._tileWidth = tileInfo.rows;
                    that._tileHeight = tileInfo.cols;
    
                    if (tileInfo.spatialReference.wkid === 102100 ||
                        tileInfo.spatialReference.wkid === 102113) {
                        that._tilingScheme = new WebMercatorTilingScheme({ ellipsoid : options.ellipsoid });
                    } else if (data.tileInfo.spatialReference.wkid === 4326) {
                        that._tilingScheme = new GeographicTilingScheme({ ellipsoid : options.ellipsoid });
                    } else if(data.fullExtent.spatialReference.wkid === 4490){
                      that._tilingScheme = new GeographicTilingScheme({ 
                        ellipsoid : options.ellipsoid,
                        tileInfo:data.tileInfo //   tileInfo,    GeographicTilingScheme   
                       });
                    }

    3.G e ographicTilingSchemeを修正スライスマトリクスを使用してx,yを計算する
    GeographicTilingScheme.prototype.getNumberOfXTilesAtLevel = function(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))
        }
      }
    
      /**
       * 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) {
        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))
        }
      }

    3.4490楕円体およびスライススキームの作成
        var cgs2000Ellipsolid = new Cesium.Ellipsoid(6378137.0, 6378137.0, 6356752.31414035585)
        var myGeographicTilingScheme = new Cesium.GeographicTilingScheme({
          ellipsoid: cgs2000Ellipsolid,
          rectangle: Cesium.Rectangle.fromDegrees(-180, -90, 180, 90),
          numberOfLevelZeroTilesX: 4,
          numberOfLevelZeroTilesY: 2
        })
    var esriWMTS = new Cesium.ArcGisMapServerImageryProvider({
          url: 'http://Ip:6080/arcgis/rest/services/jssl_vector_L3_L17/MapServer',
          layer: 'jssl_vector_L3_L17',
          tilingScheme: myGeographicTilingScheme,
          rectangle: myRectangle,
          minimumLevel: 0,
          ellipsoid: cgs2000Ellipsolid,
          maximumLevel: 14
        })
    
    var cgs2000GeographicProj = new Cesium.GeographicProjection(cgs2000Ellipsolid)
        var viewer = new Cesium.Viewer('cesiumContainer', {
          animation: false,
          geocoder: false,
          timeline: false,
          navigationHelpButton: false,
          baseLayerPicker: false,
          mapProjection: cgs2000GeographicProj,
          imageryProvider: esriWMTS
        })
        viewer.camera.flyTo({
          destination: Cesium.Cartesian3.fromDegrees(119.56156642831284, 32.419457329767326, 272683)
        })

    これでいい