arcgis js 4.x(4.11)通过继承BaseTileLayer加载经纬度投影天地图问题?

  1. 3.x版本

在3.x版本时,通过继承TiledMapServiceLayerbi那个设置相关的tileInfo属性,并指定投影wkid值为4490后加载了天地图(使用的vec_c经纬度投影地图),如下:
define(["dojo/_base/declare",
"esri/layers/tiled"],
function (declare) {
return declare(esri.layers.TiledMapServiceLayer, {
constructor: function (mymaptype) {
this.mymaptype = mymaptype;
this.spatialReference = new esri.SpatialReference({ wkid: 4490 });
this.initialExtent = (this.fullExtent = new esri.geometry.Extent(-180.0, -90.0, 180.0, 90.0, this.spatialReference));
this.tileInfo = new esri.layers.TileInfo({
"rows": 256,
"cols": 256,
"compressionQuality": 0,
"origin": {
"x": -180,
"y": 90
},
"spatialReference": {
"wkid": 4490
},
"lods": [
{ "level": 2, "resolution": 0.3515625, "scale": 147748796.52937502 },
{ "level": 3, "resolution": 0.17578125, "scale": 73874398.264687508 },
{ "level": 4, "resolution": 0.087890625, "scale": 36937199.132343754 },
{ "level": 5, "resolution": 0.0439453125, "scale": 18468599.566171877 },
{ "level": 6, "resolution": 0.02197265625, "scale": 9234299.7830859385 },
{ "level": 7, "resolution": 0.010986328125, "scale": 4617149.8915429693 },
{ "level": 8, "resolution": 0.0054931640625, "scale": 2308574.9457714846 },
{ "level": 9, "resolution": 0.00274658203125, "scale": 1154287.4728857423 },
{ "level": 10, "resolution": 0.001373291015625, "scale": 577143.73644287116 },
{ "level": 11, "resolution": 0.0006866455078125, "scale": 288571.86822143558 },
{ "level": 12, "resolution": 0.00034332275390625, "scale": 144285.93411071779 },
{ "level": 13, "resolution": 0.000171661376953125, "scale": 72142.967055358895 },
{ "level": 14, "resolution": 8.58306884765625e-005, "scale": 36071.483527679447 },
{ "level": 15, "resolution": 4.291534423828125e-005, "scale": 18035.741763839724 },
{ "level": 16, "resolution": 2.1457672119140625e-005, "scale": 9017.8708819198619 },
{ "level": 17, "resolution": 1.0728836059570313e-005, "scale": 4508.9354409599309 },
{ "level": 18, "resolution": 5.3644180297851563e-006, "scale": 2254.4677204799655 }
]
});
this.loaded = true;
this.onLoad(this);
},
getTileUrl: function (level, row, col) {
var num = Math.floor(Math.random()*7+1);
var arcgis_basemap_url_subDomains = "http://t0.tianditu.gov.cn".replace("t0","t"+num);
if(this.mymaptype=="img_c"){
return arcgis_basemap_url_subDomains+"/DataServer?T=img_c&x="+col+"&y="+row+"&l="+level+"&tk=密匙"; // 经纬度 影像地图
}else{
return arcgis_basemap_url_subDomains+"/DataServer?T=vec_c&x="+col+"&y="+row+"&l="+level+"&tk=密匙"; // 经纬度 矢量地图,默认加载
}

}
});
});
 
  1. 4.x版本

4.x版本后,根据各种资料和官方的api,修改了3.x的版本,如下:
define(["dojo/_base/declare", 
"dojo/_base/lang",
"esri/config",
"esri/layers/BaseTileLayer",
"esri/geometry/SpatialReference",
"esri/layers/support/TileInfo",
"esri/geometry/Extent",
"esri/request"],
function (declare,lang,esriConfig,BaseTileLayer,SpatialReference,TileInfo,Extent,esriRequest) {
return BaseTileLayer.createSubclass({
properties: {
urlTemplate: null,
spatialReference: new SpatialReference({ wkid: 4490 }),
fullExtent:new Extent(-180.0, -90.0, 180.0, 90.0, this.spatialReference),
tileInfo: new TileInfo({
"rows": 256,
"cols": 256,
"compressionQuality": 0,
"origin": {
"x": -180,
"y": 90
},
"spatialReference": {
"wkid": 4490
},
"lods": [
{ "level": 2, "resolution": 0.3515625, "scale": 147748796.52937502 },
{ "level": 3, "resolution": 0.17578125, "scale": 73874398.264687508 },
{ "level": 4, "resolution": 0.087890625, "scale": 36937199.132343754 },
{ "level": 5, "resolution": 0.0439453125, "scale": 18468599.566171877 },
{ "level": 6, "resolution": 0.02197265625, "scale": 9234299.7830859385 },
{ "level": 7, "resolution": 0.010986328125, "scale": 4617149.8915429693 },
{ "level": 8, "resolution": 0.0054931640625, "scale": 2308574.9457714846 },
{ "level": 9, "resolution": 0.00274658203125, "scale": 1154287.4728857423 },
{ "level": 10, "resolution": 0.001373291015625, "scale": 577143.73644287116 },
{ "level": 11, "resolution": 0.0006866455078125, "scale": 288571.86822143558 },
{ "level": 12, "resolution": 0.00034332275390625, "scale": 144285.93411071779 },
{ "level": 13, "resolution": 0.000171661376953125, "scale": 72142.967055358895 },
{ "level": 14, "resolution": 8.58306884765625e-005, "scale": 36071.483527679447 },
{ "level": 15, "resolution": 4.291534423828125e-005, "scale": 18035.741763839724 },
{ "level": 16, "resolution": 2.1457672119140625e-005, "scale": 9017.8708819198619 },
{ "level": 17, "resolution": 1.0728836059570313e-005, "scale": 4508.9354409599309 },
{ "level": 18, "resolution": 5.3644180297851563e-006, "scale": 2254.4677204799655 }
]
})
},
getTileUrl: function(level, row, col) {
var url = "http://t"+col % 8 +".tianditu.gov.cn/DataServer?T=vec_c&tk=密匙&x="+col+"&y="+row+"&l="+level;
return url;
},
fetchTile: function(level, row, col) {
var url = this.getTileUrl(level, row, col);
return esriRequest(url, {
responseType: "image"
})
.then(function(response) {

var image = response.data;
var width = this.tileInfo.size[0];
var height = this.tileInfo.size[0];

var canvas = document.createElement("canvas");
var context = canvas.getContext("2d");
canvas.width = width;
canvas.height = height;

context.drawImage(image, 0, 0, width, height);

return canvas;
}.bind(this));
}
});
}
)

地图加载片段:
            var TDTLayer411 = new TDTLayer411({title:"地图"});
var map = new Map({
layers: [TDTLayer411]
});

var view = mapObj.view = new MapView({
container: "mapDiv",
map: map,
// spatialReference : {
// wkid : 4490
// },
center: [106.53972, 29.56366],
zoom: 11
});

1、不管如何设置spatialReference,在Map对象上,mapview对象上都没有用,效果都是附件那样。
2、如果单独在map对象上设置spatialReference,
var map = new Map({
spatialReference : {
wkid : 4490
},
layers: [
TDTLayer411]
});

就会包这个错误:
[esri.views.MapView] #center incompatible spatialReference {"wkid":4326} with view's spatialReference {"wkid":4490}
 
 
微信图片_20190421175720.png
已邀请:

师妹好白

赞同来自: hy__

我也遇到了同样的问题,现在已经解决。请看代码
var testTilelayer= BaseTileLayer.createSubclass({
       getDefaults:function(p){
                 //写入你的代码,主要是指定瓦片图层tileinfo信息
                 return lang.mixin(this, {
                         fullExtent: fullExtent,
                         tileInfo: tileInfo
                 });
        }
});
在4.10api之前,可以通过getDefaults方法,在图层创建时将图层元数据写入覆盖,但4.11后就没有这个方法,经过查找,发现可以用constructor这个方法,只换方法名,其他不变,再测试之前api版本,依然有效。希望能解决你的问题

陈辰 - The wisest is she who knows she does not know

赞同来自:

你center给个4490的点,而非[x, y]

coolbas - 地图大数据云平台 www.favxu.com 三维地图云平台 http://www.hapxu.com

赞同来自:

我也是这样用的没有问题

linw

赞同来自:

想请问下传的mymaptype是个什么样的参数
 

tyqaaaa

赞同来自:

请问4.x要加载本地瓦片要怎么做。还有可以发一下全部代码嘛!4.x加载本地瓦片这个问题困扰了我好几天了!

要回复问题请先登录注册