Leaflet,OpenLayers3加载ArcGIS切片(png格式,Exploded松散型)

需求

  做了一个简单的WebGIS应用,不想因为加载切片就安装一台GIS服务器。于是想直接访问图片的方式来加载地图。

需解决的问题

  leafletjs目前是不能够直接加载ArcGIS服务切片的,但可以借助esri-leaflet插件来加载。如果没有安装arcgis server将切片进行发布时,这些切片还是无法进行访问,这个插件是面向arcgis服务应用开发的。

  leafletjs自身可以通过类似于下面这种方式直接加载地图切片:
  L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png')
  但ArcGIS切出了的切片不符合这样的格式,他们是这样的:
  这里写图片描述
  那么更改切片文件夹名称、切片名称显然不太合适。

解决方法

  ArcGIS切片文件夹和文件名都是以16进制的形式命名的,因此我们通过重写x,y的方式,就是将原来的x,y更改为以16进制表示的形式就可以了。

  其中:
  切片文件夹都是以R开头的,表示row,也就是y;
  切片名称都是以C开头的,表示col,也就是x.

  通过leafletjs的L.TileLayer类的getTileUrl方法:

L.TileLayer = L.TileLayer.extend({

        getTileUrl: function (tilePoint) {

            var oo = "00000000"
            var xx = tilePoint.x.toString(16);
            xx = "C" + oo.substring(0, 8 - xx.length) + xx;
            var yy = (tilePoint.y - Math.pow(2, tilePoint.z - 2)).toString(16);//这里减去偏移值
            yy = "R" + oo.substring(0, 8 - yy.length) + yy;

            return L.Util.template(this._url, L.extend({
                s: this._getSubdomain(tilePoint),
                z: "L" + tilePoint.z,
                x: xx,
                y: yy
            }, this.options));
        }
    });

接下来和普通加载切片的形式一样:

var river_layer = L.tileLayer('http://192.168.9.41/ywwry/data/_alllayers/{z}/{y}/{x}.png');
var riverLayer = L.layerGroup([river_layer])
map.addLayer(riverLayer)
riverLayer.setZIndex(1)

加载完成!

注意事项

参考系

  这里我加载的是坐标系为EPSG4490的地图切片,所以我们在定义map时需要设置为EPSG4326.两者的切片原点都是一样的。如果是其他参考系,根据情况进行修改。

切片级别修改

  有时候切片文件夹命名不正确,比如
  这里写图片描述
  
  里面的文件夹L00在这里实际上表示的是我的第7级。
  如果是这样,可以对文件夹名称进行修改,工作量不大。也可以在重写getTileUrl方法时修改代码。

切片加载时出现的行列号偏移

  这个问题不容易被发现,而这里就是这种情况。 我将行列号表示为十六进制,并以arcgis切片的格式进行格式化,但总是无法加载图片。我发现当第九级时切片的y轴方向偏移了128,第八级时是64,第七级时是32.很有规律,那么我使titlePoint.y减去这个偏移值Math.pow(2, tilePoint.z - 2)就可以了。
  我不知道其他人加载时会不会出现这个问题,如果出现了就应该灵活处理下。


OpenLayers3 加载切片

   补充时间2016年10月19日08:42:07

  现将Leaflet替换为OpenLayers3,加载同样的切片。

    var riverLayer = new ol.layer.Tile({
        source: new ol.source.XYZ({
            projection: 'EPSG:4326',
            maxZoom: 17,
            minZoom: 7,
            tileUrlFunction: function(tileCoord){
                var oo = "00000000";
                var zz = tileCoord[0];
                var z = "L" + zz;
                var xx = tileCoord[1].toString(16);
                var x = "C" + oo.substring(0, 8 - xx.length) + xx;
                var yy = (-tileCoord[2] - 1).toString(16); //注意此处,计算方式变了
                var y = "R" + oo.substring(0, 8 - yy.length) + yy;
                return 'data/_alllayers/' + z + '/' + y + '/' + x + '.png';
            }
        })

    })

    map.addLayer(riverLayer);

OpenLayers3 加载这种切片与Leaflet思路是相同的,需要注意的是y轴方向上的变化。比如var yy = (-tileCoord[2] - 1).toString(16); 如果不减去1的话,就发现加载的切片恰好偏移1个切片的大小。

纠正前:
river切片偏移了一个切片的距离

纠正后:
这里写图片描述

一定要注意观察,灵活变通。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
Leaflet是一个轻量级的开源JavaScript库,用于创建移动友好的交互式地图。而ArcGIS则是一个强大的地理信息系统(GIS)平台,提供各种类的地图和数据。要将ArcGIS的瓦片地图Leaflet中,你可以按照以下步骤进行操作: 1. 安装依赖:在项目中安装LeafletArcGIS的JavaScript库。你可以使用npm或yarn等包管理器来安装所需的依赖项。 2. 创建地图容器:使用Leaflet创建一个地图容器,并设置其id或其他自定义属性以便于后续引用。 3. 瓦片图层:使用Leaflet的TileLayer类ArcGIS的瓦片图层。你需要提供ArcGIS服务器的主机名、瓦片图层的名称和瓦片图层的URL。 ```javascript var tileLayer = L.tileLayer('http://<ArcGIS服务器主机名>/arcgis/rest/services/<瓦片图层名称>/MapServer/tile/{z}/{y}/{x}', { attribution: '© <ArcGIS版权信息>' }); ``` 确保将`<ArcGIS服务器主机名>`替换为实际的ArcGIS服务器主机名,并将`<瓦片图层名称>`替换为实际的瓦片图层名称。 4. 将图层添到地图:将的瓦片图层添到地图容器中。 ```javascript map.addLayer(TileLayer); ``` 5. 配置地图选项:根据需要配置地图选项,如缩放级别、坐标系等。 6. 显示地图:将配置好的地图显示在页面上。 这样,你就可以在Leaflet和使用ArcGIS的瓦片地图了。请确保你已正确配置ArcGIS服务器和相关权限,以便能够访问所需的瓦片图层。此外,你可能还需要根据需要调整代码以适应特定的项目要求和样式。 请注意,此过程假设你已经了解了基本的Leaflet和JavaScript知识,并且已经正确安装和配置了所需的依赖项。如果你不熟悉这些技术,建议参考相关的文档和教程以获得更深入的了解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值