Arcgis api for JavaScript 限制特定地图显示范围(不规则图形)

由于项目的要求,地图需要按照用户权限显示对应的区域,这里我们所使用的地图服务是指切片类型的服务,根据Arcgis api我们知道MapImageLayer可以控制子图层的显隐,子图层的定义查询:

var layer = new MapImageLayer({
url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer",
  sublayers: [
   {
     id: 3,
     visible: false
   },
   {
     id: 0,
     visible: true,
     definitionExpression: "pop2000 > 100000"
   }
 ]
});

类似的FeatureLayer同样具备definitionExpression,这些方法都可以根据用户权限控制数据的展示,今天我们要讨论的并不是这两种类型,而是切片类型的服务如何根据不规则形状显示,为什么要进行不规则的显示呢,打个比方,我们的切片服务为完整的全市域的切片,而在实际应用中需要针对城市某个区域进行显示,这时就要依据区划范围面进行不规则显示了,便于用户权限的控制。

那么切片类型的服务如何控制?

方式一:控制范围坐标Extent,当地图范围变化时,判断与显示范围的关系,强制用户拖拽超出范围,这个方法的弊端是Extent是矩形。

方式二:地图遮罩,发布遮挡范围面,这个效果较为直观,但是毕竟是又添加了一层服务,在地图拖拽的空隙会漏出遮挡面下的区域内容,而且还会出现卡顿等问题。

方式三:CSS遮罩,这也是本文较为推荐的方式

脱离api的思考方式,选择在地图控件的上方,叠加一层不透明的div,根据显示范围将div裁切出空洞进而显示出地图部分,优点在于CSS3可以按照不规则点进行裁切,缺点是通过样式的控制过于简单,数据仍然能够被获取。

给出CSS3的代码示例,API采用的为4.6(3.X的效果可能更佳,api提供的接口更丰富,这里主要是监控地图Extent的变化)

ClipPath:function(geo_hn){//输入为geometry的范围图形
      var _self = this;
      var centergeo = geo_hn.extent.clone();//clone后不会对原图形更改
      gConfig.initExtent = centergeo.expand(1.2);
      _self.mapView.goTo({target:gConfig.initExtent}).then(function () {
          var scale = _self.mapView.scale;
         _self.mapView.constraints.minScale = scale*1.5;//限定地图的缩放

         watchUtils.init(_self.mapView,'extent',function(extent,oldextent){//动态监测地图范围变化

            var polygonscreen = "polygon(100% 0,0 0,0 50%,";
            for(var i=0;i<geo_hn.rings[0].length;i++){//将坐标点位转换为屏幕坐标
              var xymap = geo_hn.rings[0][i];
              var screenxt =_self.mapView.toScreen({x:xymap[0],y:xymap[1],spatialReference:_self.mapView.spatialReference});

              polygonscreen+=screenxt.x+"px "+screenxt.y+"px,";
            }
            polygonscreen += "0 50%,0 100%,100% 100%)";
            $("#regiondivl").css("-webkit-clip-path",polygonscreen);//css3输入一串坐标就可以裁切div了,这里为了挖洞,从右上角开始到右下角结束,只要图形点顺时针排列就可以挖洞了
        })
      });
    }

相应的html:

<div id="mapDiv" style="position:relative;background:url(plug-in/mapviews/assets/gw2.png);">
</div>
<div id="regiondivl" class ='shadediv'></div>

.shadediv{
    position: absolute; 
    top:0px; 
    left:0px; 
    width:100%; 
    height:100%; 
    z-index:990;
    background:url(../assets/gw2.png);//这个背景图片也可以换成纯色,只要和地图底色一致就可以
}

效果图:

总结:在最终呈现的效果上,css的效果最佳,同时也存在一个问题,当范围面点位过多时,地图拖拽缩放会有一些延迟,我们的做法是将范围面做简化处理,40~50个点位还是可以保障图形的基本特别,同时减轻css裁切的负担。

### ArcGIS 地图虚化效果的实现 在ArcGIS地图中实现虚化效果可以通过多种方式完成,主要依赖于ArcGIS平台的不同组件及其支持的功能。以下是关于如何通过ArcGIS Pro以及ArcGIS Runtime SDK来实现背景虚化的详细介绍。 #### 使用ArcGIS Pro实现背景虚化 ArcGIS Pro提供了一个强大的栅格像素编辑工具[^3],该工具允许开发者对图像中的某些部分进行模糊或其他特效处理。这种技术通常用于增强特定地理区域的关注度,同时降低周围环境的干扰。 要实现背景虚化的效果,可以按照以下逻辑操作: - 加载目标数据至ArcGIS Pro项目。 - 利用Pro内置的栅格编辑器选择需要保持清晰的部分。 - 对剩余未选中的区域应用模糊滤镜或调整透明度以达到视觉上的弱化效果。 #### 基于ArcGIS for JavaScript实现局部高亮与虚化 对于Web端的地图开发而言,在JavaScript API环境下能够借助CSS样式配合Map View对象达成类似的交互体验。例如文中提到的方法就是利用了覆盖层的概念[^1],即创建一个新的GraphicsLayer专门用来绘制感兴趣区(AOI),并通过设置不同的Renderer规则使得内部正常渲染而外部自动变暗: ```javascript // 创建一个图形并添加到视图上 const polygonGraphic = new Graphic({ geometry: userDefinedPolygon, // 用户定义多边形范围 symbol: { type: "simple-fill", // 简单填充符号 color: [255, 255, 255, 0], // 完全透明的颜色 outline: { // 边框线宽设为零隐藏边界 width: 0, color: [0, 0, 0, 0] } } }); view.graphics.add(polygonGraphic); // 设置遮罩效果 view.effect = "blur(8px)"; ``` 上述脚本片段展示了如何构建一个无实际颜色表现却拥有明确轮廓界限的对象,并将其置于当前活动窗口之上;与此同时,“effect”属性被赋予了一定程度上的模糊参数值,从而实现了预期的结果——仅保留选定区域内细节分明的同时让周边变得朦胧不清。 #### 运用ArcGIS Runtime SDK扩展功能 最新版ArcGIS Runtime SDK已经引入了许多先进的绘图选项和支持标准如GeoPackage格式的数据加载能力[^2]^。这意味着除了传统的矢量/栅格叠加之外,还可以探索更多创新性的表达手段比如动态生成纹理贴图或者实时计算光照方向等等。如果希望进一步定制应用程序内的视觉反馈机制,则可能涉及到深入研究底层API文档以及尝试调用第三方库辅助完成复杂算法运算过程。 另外值得注意的是,针对移动设备上的触控手势捕捉也有相应改进措施出台[^5]^。虽然这本身并不直接关联到主题讨论范畴之内,但它确实反映了整个生态系统正在朝着更加灵活便捷的方向迈进的步伐。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值