2.arcgis api,openlayers,mapboxgl,leaflet,cesuim,高德api加载离线瓦片

跨框架加载离线地图瓦片的实现方法

arcgis api3.x,arcgis api4.x,openlayers,mapboxgl,leaflet,cesuim,高德api加载离线瓦片

xzy可以使用arcgis server十六进制,也可使用十进制服务可使用tomcat,nginx,IIS服务发布

一、arcgis api3.x

这里以3857坐标系为例customTileLayer.js

define(["dojo/_base/declare",
    "esri/layers/TiledMapServiceLayer",
    "esri/SpatialReference",
    "esri/geometry/Extent",
      "esri/geometry/Point",
    "esri/layers/TileInfo"], function (declare, TiledMapServiceLayer,SpatialReference,Extent,Point,TileInfo) {
        return declare('customTileLayer', TiledMapServiceLayer, {   //没定义类名,就以文件名为准     第一个参数是父类
            constructor: function (args) {
                 this.spatialReference = new esri.SpatialReference({
                wkid: 102100
            });
            declare.safeMixin(this, args);
            this.fullExtent = new Extent(11743260.295298226,3724644.1703501306,12384107.207109822,4806106.2850203095, this.spatialReference);
            this.initialExtent = this.fullExtent;
            this.tileInfo = new TileInfo({
                "cols": 256,
                "rows": 256,
                "compressionQuality": 0,
                "origin": new Point(-20037508.342787, 20037508.342787, this.spatialReference),
                "spatialReference": this.spatialReference,
                "lods": [{
                    "level": 0,
                    "resolution": 156543.033928,
                    "scale": 591657527.591555
                }, {
                    "level": 1,
                    "resolution": 78271.5169639999,
                    "scale": 295828763.795777
                }, {
                    "level": 2,
                    "resolution": 39135.7584820001,
                    "scale": 147914381.897889
                }, {
                    "level": 3,
                    "resolution": 19567.8792409999,
                    "scale": 73957190.948944
                }, {
                    "level": 4,
                    "resolution": 9783.93962049996,
                    "scale": 36978595.474472
                }, { 
                    "level": 5,
                    "resolution": 4891.96981024998,
                    "scale": 18489297.737236
                }, {
                    "level": 6,
                    "resolution": 2445.98490512499,
                    "scale": 9244648.868618
                }, {
                    "level": 7,
                    "resolution": 1222.99245256249,
                    "scale": 4622324.434309
                }, {
                    "level": 8,
                    "resolution": 611.49622628138,
                    "scale": 2311162.217155
                }, {
                    "level": 9,
                    "resolution": 305.748113140558,
                    "scale": 1155581.108577
                }, {
                    "level": 10,
                    "resolution": 152.874056570411,
                    "scale": 577790.554289
                }, {
                    "level": 11,
                    "resolution": 76.4370282850732,
                    "scale": 288895.277144
                }, {
                    "level": 12,
                    "resolution": 38.2185141425366,
                    "scale": 144447.638572
                }, {
                    "level": 13,
                    "resolution": 19.1092570712683,
                    "scale": 72223.819286
                }, {
                    "level": 14,
                    "resolution": 9.55462853563415,
                    "scale": 36111.909643
                }, {
                    "level": 15,
                    "resolution": 4.77731426794937,
                    "scale": 18055.954822
                }, {
                    "level": 16,
                    "resolution": 2.38865713397468,
                    "scale": 9027.977411
                }, {
                    "level": 17,
                    "resolution": 1.19432856685505,
                    "scale": 4513.988705
                }, {
                    "level": 18,
                    "resolution": 0.597164283559817,
                    "scale": 2256.994353
                }, {
                    "level": 19,
                    "resolution": 0.298582141647617,
                    "scale": 1128.497176
                }]
            });

                this.loaded = true;
                this.onLoad(this);
				this.zeroPad=function(num, len, radix) {
					var str = num.toString(radix || 10);
					while (str.length < len) {
						str = "0" + str;
					}
					return str;
                }
            },
			/**
         * @param level
         * @param row
         * @param col
         * @returns {string}
         */
            getTileUrl: function (level, row, col) {
				console.log(level, row, col)
                return "http://localhost:8090/Layers/_alllayers/" +
                "L" + this.zeroPad(level, 2, 10)+ "/" +
                "R" + this.zeroPad(row, 8, 16) + "/" +
                "C" + this.zeroPad(col, 8, 16) + "." +
                "png";
            }
        });
    });

调用

var customTileLyr = new customTileLayer();
   map.addLayer(customTileLyr);

二、arcgis api4.x

var arcgisServerTileLayer = BaseTileLayer.createSubclass({
    getTileUrl: function(level, row, col) {
      return  "http://localhost:8090/Layers/_alllayers/" +
             "L" + level.toString(10).padStart(2, '0')+ "/" +
             "R" + row.toString(16).padStart(8, '0') + "/" +
             "C" + col.toString(16).padStart(8, '0') + ".png"
    },
  });
  var myTileLayer = new arcgisServerTileLayer({
    tileInfo:tileInfo,
    spatialReference:new SpatialReference({ wkid: 4326 }),
    id: "layerid"
  })
  mapview.view.map.add(myTileLayer);

三、openlayers

const zeroPad=(num, len, radix)=> {
  var str = num.toString(radix || 10);
  while (str.length < len) {
    str = "0" + str;
  }
  return str;
}
let player = new TileLayer({
      source: new XYZ({
        tileGrid: tileGrid,
        crossOrigin: "Anonymous",
        projection: proj.get("EPSG:4326"),
        tileUrlFunction: function (tileCoord) {
           var x = 'C' + zeroPad(tileCoord[1], 8, 16);
            var y = 'R' + zeroPad(tileCoord[2] , 8, 16);
            var z = 'L' + zeroPad(tileCoord[0], 2, 10);
            return "http://localhost:8090/Layers/_alllayers/" + z + '/' + y + '/' + x + '.png';
        },
      }),
      id: layerid,
    });
    window.$olMap.addLayer(player);

四、mapboxgl

使用arcgis server十六进制需更改源码

     var map=new mapboxgl.Map({
        container: 'map',
         pitch: 0,
        style: {
        	"version": 8,
            "name": "Empty Style",
            "metadata": {"maputnik:renderer": "mbgljs"},
            "sprite": `http://localhost:8090/sprite/default/sprite`,
            "zoom": 10.77,
            "glyphs": `http://localhost:8090/fonts/{fontstack}/{range}.pbf`,
            "sources": {
                    "layerid": {
                        type: 'raster',
                        tiles: [`http://localhost:8090/Layers/_alllayers/{zoom}/{row}/{col}.png`],
                        tileSize: 256,
                        zoomOffset: -1
                    }
            },
            "layers": [
                    {
                        id: "layerid",
                        type: "raster",
                        source: "layerid",
                    },
                
            ]
        },
        center: [108.956220,34.279541],
        zoom:6
    });

五、leaflet

 let layer = L.tileLayer("http://localhost:8090/Layers/_alllayers" + "/{z}/{y}/{x}", {
      tileSize: 256,
      attribution: "",
    });
    map.addLayer(layer)

六、cesuim

 let player = new Cesium.UrlTemplateImageryProvider({
    url: "http://localhost:8090/Layers/_alllayers/{level}/{row}/{col}.png",
    tilingScheme: new Cesium.GeographicTilingScheme(),
    customTags: {
      level: function (imageryProvider, x, y, level) {
        return "L" + zeroPad(level, 2, 10);
      },
      row: function (imageryProvider, x, y, level) {
        return "R" + zeroPad(y, 8, 16);
      },
      col: function (imageryProvider, x, y, level) {
        return "C" + zeroPad(x, 8, 16);
      },
    },
  });
  player.id = "layerid";
  viewer.scene.imageryLayers.addImageryProvider(player);

七、高德api

	let googleSWLayer = new AMap.TileLayer({
			getTileUrl: function(x, y, z) {
				z = "L" + z.toString(10).padStart(2, '0');
				x = "C" + x.toString(16).padStart(8, '0');
				y = "R" + y.toString(16).padStart(8, '0');
				return 'http://localhost:8090/Layers/_alllayers/' + z + '/' + y + '/' + x + '.png';
			},
			zIndex: 100,
			opacity: .3,
		})
 map.add(googleSWLayer)
<think>嗯,用户想知道如何自定义离线地图瓦片的图片文件名,特别是命名规则以及地图SDK的相关内容。首先,我需要回忆一下离线地图瓦片的存储结构和命名方式。通常,地图瓦片是根据层级(z)、行号(x)、列号(y)来组织的,比如像z/x/y.png这样的格式。不过不同的地图服务提供商可能有不同的命名规则,比如有的会用z/y/x,或者加上一些前缀。 然后,用户提到自定义,可能是指他们希望按照自己的方式命名这些图片文件,而不是使用默认的结构。这时候需要看看相关的SDK是否支持自定义命名。根据提供的引用,比如引用[4]中提到了Android端缓存ArcGIS地图的实现,使用了文件夹结构存储瓦片,结构类似z/x/y.png。而引用[3]提到MBTiles格式,它使用SQLite数据库来存储瓦片,可能不需要直接操作文件名,而是通过数据库索引。 接下来,用户可能想知道如何在地图SDK中使用这些自定义命名的瓦片。例如,在百度离线地图的WEB实现中(引用[2]),可能需要配置瓦片的URL模板,让SDK知道从哪里加载图片。如果是移动端,如Android或iOS,可能需要重写SDK中的瓦片加载方法,指向本地的自定义路径和文件名。 还要考虑不同的地图提供商,比如谷歌、百度、高德等,它们的瓦片命名规则可能不同。例如,百度地图瓦片坐标有自己的偏移转换,文件名可能包含加密参数。用户如果想自定义文件名,可能需要先了解原始命名规则,再设计自己的规则,并确保SDK能够正确解析。 另外,存储结构也很重要。是采用目录结构还是数据库?目录结构更直观,但文件数量多可能影响性能;数据库如MBTiles便于管理和查询。引用[3]提到MBTiles适合移动设备使用,可能更适合离线场景。 最后,需要确保自定义的命名规则与SDK兼容。有些SDK允许通过接口设置瓦片的URL格式,例如Leaflet中的TileLayer可以指定URL模板。如果是移动端SDK,可能需要修改源码或使用插件来实现自定义加载逻辑。例如在引用[4]中,通过重写瓦片获取方法,从自定义路径加载图片。 总结一下,步骤可能是:确定原始命名规则→设计自定义规则→配置SDK加载方式→测试和调整。同时要注意不同平台和SDK的差异,确保命名规则与存储结构匹配,SDK能够正确访问到瓦片文件。</think>### 如何自定义离线地图瓦片的图片文件名 #### 1. **地图瓦片命名规则的核心要素** 地图瓦片通常基于**层级(z)、列号(x)、行号(y)**三个参数生成文件名,例如: - 标准命名格式:`z/x/y.png` - 百度地图可能包含偏移参数:`z_x_y_scale=2&styles=pl`[^2] 自定义命名需满足以下条件: - **唯一性**:每个瓦片需对应唯一文件名 - **可解析性**:文件名需能反推层级、坐标等关键信息 - **存储兼容性**:适应文件夹层级或数据库存储(如MBTiles)[^3][^4] #### 2. **常见自定义实现方法** **(1) 文件系统存储** - **目录结构**:通过文件夹层级表达`z/x/y`,例如: ```bash /tiles/{z}/{x}/{y}.png # 标准目录结构 ``` - **自定义文件名**:将坐标编码到文件名中,例如: ```bash /tiles/z{z}_x{x}_y{y}.png # 扁平化文件名结构 ``` **(2) 数据库存储(如MBTiles)** - 使用SQLite数据库存储瓦片,通过`zoom_level`, `tile_column`, `tile_row`字段定义逻辑命名[^3]: ```sql CREATE TABLE tiles (zoom_level INTEGER, tile_column INTEGER, tile_row INTEGER, tile_data BLOB); ``` **(3) 动态URL模板** 在Web地图SDK中,可通过URL模板动态加载瓦片: ```javascript // Leaflet示例:自定义命名规则 L.tileLayer('http://{s}.tileserver.com/{z}/{customX}/{hash}_{y}.png', { subdomains: ['a','b','c'] }); ``` #### 3. **地图SDK适配方案** **(1) 移动端SDK(Android/iOS)** - **重写瓦片加载逻辑**:通过继承或接口实现自定义路径解析。例如Android端可重写`TileProvider`: ```java public class CustomTileProvider implements TileProvider { @Override public Tile getTile(int x, int y, int z) { String path = "tiles/" + z + "/custom_" + x + "_" + y + ".png"; return loadTileFromPath(path); // 自定义加载方法 } } ``` **(2) Web地图SDK(如百度、OpenLayers)** - **配置瓦片服务地址**:通过修改`getTilesUrl`方法实现: ```javascript // 百度地图示例 var map = new BMap.Map("container"); map.addTileLayer(new BMap.TileLayer({ getTilesUrl: function(tileCoord, zoom) { return `tiles/${zoom}_${tileCoord.x}_${tileCoord.y}.png`; // 自定义URL规则[^2] } })); ``` #### 4. **实际应用案例** - **ArcGIS离线缓存**:采用`/Layers/_alllayers/{level}/{col}/{row}.png`目录结构,支持自定义文件名加密 - **MBTiles优化**:通过数据库索引替代物理文件,提升瓦片查询效率
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫雪giser

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值