ArcGIS JS 渲染详解
在ArcGIS JS API中,图层的渲染方式主要分为两类:后端渲染和前端渲染,本文将详细介绍这两类渲染方式及其具体实现方法,包括SimpleRenderer、ClassBreaksRenderer、UniqueValueRenderer、DotDensityRenderer和TemporalRenderer五种不同的渲染器。
一、后端渲染
后端渲染是指浏览器发送请求,GIS服务器接收请求后,按需求对生成图片(动态服务先看缓存,没有则实时生成;切片服务则根据请求参数找到对应切片),缓存并发送图片,完成响应,最终结果可在浏览器中审查要素。
1. 动态地图服务(ArcGISDynamicMapServiceLayer)
描述:一个动态地图服务对应一个div元素,内部包含一个img元素。
示例代码:
var map = new esri.Map("MyMapDiv"); var layer = new ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/my/fea/MapServer"); map.addLayer(layer);
2. 切片地图服务
描述:一个切片地图服务对应一个div元素,内部包含多个img元素。
示例代码:
var map = new esri.Map("MyMapDiv"); var layer = new ArcGISTiledMapServiceLayer("http://localhost:6080/arcgis/rest/services/my/tile/MapServer"); map.addLayer(layer);
二、前端渲染
前端渲染则是由浏览器发送请求,GIS服务器接收请求后返回数据,然后在客户端进行渲染,这种方式要求服务必须是要素服务,或者是可以使用FeatureLayer接收的服务图层。
1. 唯一值渲染(UniqueValueRenderer)
描述:根据要素的某个字段进行分类,并用不同的颜色或符号表示不同类别。
使用案例:在全国地图中区分各省区范围。
var defaultSymbol = new SimpleFillSymbol().setStyle(SimpleFillSymbol.STYLE_NULL); defaultSymbol.outline.setStyle(SimpleLineSymbol.STYLE_NULL); var renderer = new UniqueValueRenderer(defaultSymbol, "SUB_REGION"); renderer.addValue("Pacific", new SimpleFillSymbol().setColor(new Color([255, 0, 0, 0.5])); renderer.addValue("Mtn", new SimpleFillSymbol().setColor(new Color([0, 255, 0, 0.5])); renderer.addValue("N Eng", new SimpleFillSymbol().setColor(new Color([0, 0, 255, 0.5])); renderer.addValue("S Atl", new SimpleFillSymbol().setColor(new Color([255, 0, 255, 0.5])); renderer.addValue("Mid Atl", new SimpleFillSymbol().setColor(new Color([255, 255, 255, 0.75])); renderer.addValue("E N Cen", new SimpleFillSymbol().setColor(new Color([0, 255, 255, 0.5])); renderer.addValue("W N Cen", new SimpleFillSymbol().setColor(new Color([255, 255, 0, 0.5])); renderer.addValue("E S Cen", new SimpleFillSymbol().setColor(new Color([127, 127, 127, 0.5])); renderer.addValue("W S Cen", new SimpleFillSymbol().setColor(new Color([0, 0, 0, 0.5])); var featureLayer = new FeatureLayer("https://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer/1", { infoTemplate: new InfoTemplate("", "${SUB_REGION}"), mode: FeatureLayer.MODE_ONDEMAND, outFields: ["SUB_REGION"] }); featureLayer.setRenderer(renderer); map.addLayer(featureLayer);
2. 分级渲染(ClassBreaksRenderer)
描述:根据图层中的某个特定属性值进行分析渲染,适用于聚合标注等场景。
使用案例:根据聚合点数分三个等级,不同等级用不同的大小及颜色图标来表示。
var defaultSym = new esri.symbol.SimpleMarkerSymbol().setSize(4); var renderer = new ClassBreaksRenderer(defaultSym, "clusterCount"); var picBaseUrl = "lib/"; var blue = new esri.symbol.PictureMarkerSymbol(picBaseUrl + "Marker.png", 32, 32).setOffset(0, 15); var green = new esri.symbol.PictureMarkerSymbol(picBaseUrl + "Marker-1.png", 64, 64).setOffset(0, 15); var red = new esri.symbol.PictureMarkerSymbol(picBaseUrl + "Marker-2.png", 72, 72).setOffset(0, 15); renderer.addBreak(0, 2, blue); renderer.addBreak(2, 100, green); renderer.addBreak(100, 200, red); clusterLayer.setRenderer(renderer);
3. 点密度渲染(DotDensityRenderer)
描述:通过点的密度来表示数据量的大小,常用于热力图等场景。
示例代码:
var dotDensityRenderer = new DotDensityRenderer(); dotDensityRenderer.setField("population"); dotDensityRenderer.setBaseSymbol(new SimpleMarkerSymbol()); featureLayer.setRenderer(dotDensityRenderer); map.addLayer(featureLayer);
4. 临时渲染(TemporalRenderer)
描述:根据时间变化来动态调整图层的显示效果,适用于时间序列数据。
示例代码:
var temporalRenderer = new TemporalRenderer(); temporalRenderer.timeExtent = { start: new Date(), end: new Date() }; featureLayer.setRenderer(temporalRenderer); map.addLayer(featureLayer);
三、高级功能:RenderNode后处理效果
ArcGIS For JavaScript 4.9版本提供了RenderNode类,支持第三方渲染引擎的植入以及当前场景中的渲染后处理操作,常见的后处理操作包括混合颜色、深度渲染、高亮及法线操作等。
1. 颜色混合
描述:通过修改shader代码实现颜色混合效果。
示例代码:
const vshader = `#version 300 es in vec2 position; out vec2 uv; void main() { gl_Position = vec4(position, 0.0, 1.0); uv = position * 0.5 + vec2(0.5); }`; const fshader = `#version 300 es precision highp float; out lowp vec4 fragColor; in vec2 uv; uniform sampler2D colorTex; void main() { vec4 color = texture(colorTex, uv); fragColor = vec4(vec3(dot(color.rgb, vec3(0.2126, 0.7152, 0.0722))), color.a); }`;
四、相关问题与解答栏目
问题1:如何在ArcGIS JS API中实现唯一值渲染?
答案:可以通过创建UniqueValueRenderer实例,并根据特定字段设置不同的符号来实现唯一值渲染,具体代码如下:
var defaultSymbol = new SimpleFillSymbol().setStyle(SimpleFillSymbol.STYLE_NULL); defaultSymbol.outline.setStyle(SimpleLineSymbol.STYLE_NULL); var renderer = new UniqueValueRenderer(defaultSymbol, "SUB_REGION"); renderer.addValue("Pacific", new SimpleFillSymbol().setColor(new Color([255, 0, 0, 0.5])); // ...其他值... featureLayer.setRenderer(renderer); map.addLayer(featureLayer);
问题2:如何在ArcGIS JS API中实现分级渲染?
答案:可以通过创建ClassBreaksRenderer实例,并根据特定属性设置不同的分级区间来实现分级渲染,具体代码如下:
var defaultSym = new esri.symbol.SimpleMarkerSymbol().setSize(4); var renderer = new ClassBreaksRenderer(defaultSym, "clusterCount"); var picBaseUrl = "lib/"; var blue = new esri.symbol.PictureMarkerSymbol(picBaseUrl + "Marker.png", 32, 32).setOffset(0, 15); // ...其他符号... renderer.addBreak(0, 2, blue); // ...其他区间... clusterLayer.setRenderer(renderer);
以上内容就是解答有关“arcgis js 渲染”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/687836.html