表示使用 MapView 将 Layer 添加到 Map 后的 LayerView。与相关类 BaseLayerView2D 相比,这一类公开了 WebGL 渲染能力。
这个类可以扩展为一个图层创建一个自定义的 LayerView。当将图层添加到其地图的图层列表时,MapView 会根据需要创建 LayerView。
子类可以实现 LayerView 生命周期的多种函数。
- 首先,在 LayerView 即将开始绘制图层内容时调用 attach() 方法;它通常负责资源分配。
- 然后在 LayerView 的生命周期中,每帧调用一次 render() 方法;它必须在返回之前完成绘图。
- 最后,在图层从地图中移除后调用 detach() 方法;它释放所有分配的资源并停止正在进行的请求。
这些函数中的每一个都可以通过实例属性 this.context 访问 MapView 的 WebGL 上下文。开发人员必须提供自己的着色器、网格和纹理,并负责在上下文中设置所需的 GL 状态。
为了方便开发者,从 API 4.14 版本开始,BaseLayerViewGL2D
包含了 tessellation 辅助方法;开发人员可以提供 Point、Multipoint、Polyline、Extent 或 Polygon 几何图形,并将它们转换为三角形网格的抽象描述,这些三角形网格可以很容易地作为顶点和索引缓冲区提供给 GPU。
SDK 示例详细解释了如何使用曲面细分助手以及如何编写兼容的着色器。
let CustomLayerView2D = BaseLayerViewGL2D.createSubclass({
render(renderParameters) {
const gl = this.context;
...
}
attach() {
const gl = this.context;
...
}
detach() {
const gl = this.context;
...
}
});
let CustomTileLayer = Layer.createSubclass({
tileInfo: TileInfo.create({ spatialReference: { wkid: 3857 }}),
createLayerView(view) {
if (view.type === "2d") {
return new CustomLayerView2D({
view: view,
layer: this
});
}
}
});
构造函数
属性概览
名称 | 类型 | 描述 | 类 | |
---|---|---|---|---|
WebGLRenderingContext|WebGL2RenderingContext | 更多信息 与此层视图关联的 WebGL 渲染上下文。 | 更多信息 | BaseLayerViewGL2D | |
String | 更多信息 类的名称。 | 更多信息 | Accessor | |
Layer | 更多信息 引用此 LayerView 表示的层。 | 更多信息 | BaseLayerViewGL2D | |
Boolean | 更多信息 指示图层视图是否支持 MapView 的 spatialReference。 | 更多信息 | LayerView | |
Boolean | 更多信息 如果图层被暂停,则值为 | 更多信息 | LayerView | |
Tile[] | 更多信息 计算的 BaseLayerViewGL2D 对象数组以覆盖 MapView 的可见区域。。 | 更多信息 | BaseLayerViewGL2D | |
Boolean | 更多信息 图层更新时值为 | 更多信息 | LayerView | |
MapView | 更多信息 | 更多信息 | BaseLayerViewGL2D | |
Boolean | 更多信息 为 | 更多信息 | LayerView |
属性详情
-
与此层视图关联的 WebGL 渲染上下文。
-
类的名称。声明的类名格式为
geoscene.folder.className
。
-
起始版本:GeoScene API for JavaScript 4.23
-
指示图层视图是否支持 MapView 的 spatialReference。当
false
层视图将暂停。- 另请参阅:
-
如果图层被暂停,则值为
true
(即,当范围发生变化时,图层不会重绘或更新自身)。
-
计算的 BaseLayerViewGL2D 对象数组以覆盖 MapView 的可见区域。。当视图动画或用户与之交互时,此数组会更新。然后,如果已添加或删除图块,则调用 tilesChanged()。
- 另请参阅:
-
图层更新时值为
true
;例如,如果它正在获取数据的过程中。- 默认值:false
-
view MapView
-
-
为
true
时,图层在视图中可见。此属性的值是从layer.visible
继承的,除非开发人员覆盖它。如果设置了这两个属性,layerView.visible
将优先于layer.visible
。- 默认值:true
方法概览
名称 | 返回类型 | 描述 | 类 | |
---|---|---|---|---|
更多信息 在创建 LayerView 之后和开始绘制图层内容之前调用的方法。 | 更多信息 | BaseLayerViewGL2D | ||
更多信息 绑定指定的渲染输出面,恢复正确的视口。 | 更多信息 | BaseLayerViewGL2D | ||
更多信息 层被移除且 LayerView 即将被移除后调用的方法。 | 更多信息 | BaseLayerViewGL2D | ||
RenderTarget | 更多信息 获取指定的渲染输出表面和对应的视口配置。 | 更多信息 | BaseLayerViewGL2D | |
Promise<Graphic[]> | 更多信息 负责提供在指定屏幕坐标处命中的对象的实现方法。 | 更多信息 | BaseLayerViewGL2D | |
Boolean | 更多信息
| 更多信息 | LayerView | |
Boolean | 更多信息
| 更多信息 | LayerView | |
Boolean | 更多信息
| 更多信息 | LayerView | |
更多信息 负责绘制图层内容的实现方法。 | 更多信息 | BaseLayerViewGL2D | ||
更多信息 LayerView 可以调用这个方法来要求 MapView 安排一个新的渲染帧。 | 更多信息 | BaseLayerViewGL2D | ||
Promise<TessellatedMesh> | 更多信息 将 Extent 细分为矩形。 | 更多信息 | BaseLayerViewGL2D | |
Promise<TessellatedMesh> | 更多信息 将 Multipoint 细分为四边形(标记)。 | 更多信息 | BaseLayerViewGL2D | |
Promise<TessellatedMesh> | 更多信息 将 Point 细分为四边形(标记)。 | 更多信息 | BaseLayerViewGL2D | |
Promise<TessellatedMesh> | 更多信息 将 Polygon 细分为三角形。 | 更多信息 | BaseLayerViewGL2D | |
Promise<TessellatedMesh> | 更多信息 将折线细分为三角形。 | 更多信息 | BaseLayerViewGL2D | |
更多信息 要实现的方法,通知为当前视图状态添加或删除图块。 | 更多信息 | BaseLayerViewGL2D | ||
Promise | 更多信息
| 更多信息 | LayerView |
方法详情
-
attach()
-
在创建 LayerView 之后和开始绘制图层内容之前调用的方法。通常,实现此方法是为了开始观察层上的属性更改并初始化 WebGL 对象,例如着色器。
- 另请参阅:
示例:// Create a shader program and a property watcher attach() { let gl = this.context; this._shaderProgram = gl.createProgram(); ... this._propertyHandle = this.layer.watch("opacity", function() { this.requestRender(); }); }
-
bindRenderTarget()
-
绑定指定的渲染输出面,恢复正确的视口。
此方法可以在通过调用
gl.bindFramebuffer()
更改 WebGL 状态后使用,以恢复包含最终合成帧的帧缓冲区,即在控制权移交给 render() 之前保证绑定的帧缓冲区。请注意,这可能是也可能不是默认帧缓冲区;MapView 可以使用各种表面进行帧合成,并且不能保证在调用 render() 时,绑定的帧缓冲区是默认的。与帧缓冲区一起,还恢复了匹配的全尺寸视口。
示例:render() { let gl = this.context; ... // Bind a temporary offscreen surface gl.bindFramebuffer(gl.FRAMEBUFFER, this.myOffscreenSurface); ... // Render to the offscreen surface ... // Bind the original render surface so that the image stored // into the temporary one can be blitted/composited with the // actual frame data this.bindRenderTarget(); ... // Your own frame composition logic ... }
-
detach()
-
层被移除且 LayerView 即将被移除后调用的方法。通常,实现此方法是为了释放资源(如观察者)并销毁 WebGL 对象(如着色器程序)。
- 另请参阅:
示例:// Remove the watchers and destroy the shader program created in attach() detach() { this._propertyHandle.remove(); this._propertyHandle = null; const gl = this.context; gl.deleteProgram(this._shaderProgram); this._shaderProgram = null; }
-
getRenderTarget(){RenderTarget}
-
获取指定的渲染输出表面和对应的视口配置。
返回的对象与调用 bindRenderTarget() 恢复的渲染目标相同。
返回:类型 说明 RenderTarget
-
参数:mapPoint Point
地图单位中的点。
screenPoint ScreenPoint屏幕坐标中的点。
返回:类型 说明 Promise<Graphic[]> 解析为图形数组的 Promise。
-
isFulfilled()
可用于验证创建类的实例是否已完成(已解决或已拒绝)。如果满足,则返回true
。返回:类型 说明 Boolean 指示创建类的实例是否已完成(已解决或已拒绝)。
-
isRejected()
可用于验证创建类的实例是否被拒绝。如果被拒绝,则返回true
。返回:类型 说明 Boolean 指示创建类的实例是否已被拒绝。
-
isResolved()
可用于验证创建类的实例是否已解决。如果已解决,将返回true
。返回:类型 说明 Boolean 指示创建类的实例是否已解决。
-
render(renderParameters)
-
负责绘制图层内容的实现方法。每次 MapView 的状态发生变化或 requestRender() 已被调用时,都会调用此方法。
参数:规格:renderParameters Object规格:WebGL 或 WebGL 2 上下文。其具体类型取决于系统配置。每次调用
render()
时,API 都会自动将 WebGL 重置为几乎是默认状态的常规状态;唯一可能是非默认的两件事是绑定的帧缓冲区和视口,它被设置为匹配整个帧缓冲区。render()
的主体不得更改这些设置。stationary BooleanMapView
的静止状态。state ViewState描述视图状态的对象。
示例:// Example of a render implementation that draws using a custom shader program render(renderParameters) { const gl = this.context; gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer); gl.vertexAttribPointer(0, 2, gl.SHORT, false, 10, 0); gl.vertexAttribPointer(1, 3, gl.SHORT, true, 10, 4); gl.bindBuffer(gl.ARRAY_BUFFER, null); gl.enableVertexAttribArray(0); gl.enableVertexAttribArray(1); ... // Update uniforms as needed by calling gl.uniform... ... gl.useProgram(this._shaderProgram); gl.drawArrays(gl.TRIANGLES, 0, this._vertexCount); gl.disableVertexAttribArray(0); gl.disableVertexAttribArray(1); gl.useProgram(null); }
-
requestRender()
-
LayerView 可以调用这个方法来要求 MapView 安排一个新的渲染帧。
示例:// Call requestRender whenever the layer opacity has changed attach() { this._propertyHandle = this.layer.watch("opacity", function() { this.requestRender(); }); }
-
tessellateExtent(extent){Promise<TessellatedMesh>}起始版本:GeoScene API for JavaScript 4.14
-
将 Extent 细分为矩形。
参数:extent Extent输入几何。
返回:类型 说明 Promise<TessellatedMesh> 对 BaseLayerViewGL2D 的承诺。输出网格由两个三角形组成。 示例:this.tessellateExtent(g.geometry).then(function (mesh) { // do something with mesh });
-
tessellateMultipoint(multipoint, footprint){Promise<TessellatedMesh>}起始版本:GeoScene API for JavaScript 4.14
-
将 Multipoint 细分为四边形(标记)。
参数:multipoint Multipoint输入几何。这些是我将锚定每个标记的地理点。
footprint Rect描述每个标记的几何形状的矩形。坐标 x 和 y 可以被认为是在屏幕空间中,相对于地理点的屏幕空间投影。
返回:类型 说明 Promise<TessellatedMesh> 对 BaseLayerViewGL2D 的承诺。每个标记由两个三角形表示。 示例:this.tessellateMultipoint(g.geometry, {x: 0, : -12, width: 34, height: 10}).then(function (mesh) { // do something with mesh });
-
tessellatePoint(point, footprint){Promise<TessellatedMesh>}起始版本:GeoScene API for JavaScript 4.14
-
将 Point 细分为四边形(标记)。
参数:point Point输入几何。这是我将锚定标记的地理点。
footprint Rect描述标记几何形状的矩形。坐标
x
和y
是标记左上角的位置,可以认为是在屏幕空间中,相对于地理点的屏幕空间投影;width
和height
以像素为单位。 有关标记几何的可视化解释,请参见 Rect。返回:类型 说明 Promise<TessellatedMesh> 对 TessellatedMesh 的承诺。输出网格由两个三角形组成。 示例:this.tessellatePoint(g.geometry, {x: 0, : -12, width: 34, height: 10}).then(function (mesh) { // do something with mesh });
-
tessellatePolygon(polygon){Promise<TessellatedMesh>}起始版本:GeoScene API for JavaScript 4.14
-
将 Polygon 细分为三角形。
参数:polygon Polygon输入几何。几何必须简单;如果输入的几何图形不简单,您必须首先使用 geometryEngine 创建它的简化版本,并将简化的几何图形传递给
tessellatePolygon
。返回:类型 说明 Promise<TessellatedMesh> 对 TessellatedMesh 的承诺。 示例:this.tessellatePolygon(g.geometry).then(function (mesh) { // do something with mesh });
-
tessellatePolyline(polyline, width){Promise<TessellatedMesh>}起始版本:GeoScene API for JavaScript 4.14
-
将折线细分为三角形。
参数:polyline Polyline输入几何。几何必须简单;如果输入的几何图形不简单,您必须首先使用 geometryEngine 创建它的简化版本,并将简化的几何图形传递给
tessellatePolyline
。width Number线的宽度;这将用于缩放 xOffset 和 yOffset。
返回:类型 说明 Promise<TessellatedMesh> 对 TessellatedMesh 的承诺。 示例:this.tessellatePolyline(g.geometry, 10).then(function (mesh) { // do something with mesh });
-
tilesChanged(added, removed)
-
要实现的方法,通知为当前视图状态添加或删除图块。可以实现这个函数来开始和停止获取新数据,或者分配和释放资源。
参数:为当前视图视口添加的平铺对象。
从视图视口中移除的平铺对象。
-
when()
一旦创建了类的实例,就可以利用它。这个方法有两个输入参数:一个callback
函数和一个errback
函数。callback
在类的实例加载时执行。如果类的实例无法加载,则执行errback
。参数:callback Functionoptional当 promise 解决时调用的函数。
errback Functionoptional当 promise 失败时执行的函数。
返回:类型 说明 Promise 返回 callback
结果的新承诺,可用于链接其他函数。示例:// Although this example uses MapView, any class instance that is a promise may use when() in the same way let view = new MapView(); view.when(function(){ // This function will execute once the promise is resolved }, function(error){ // This function will execute if the promise is rejected due to an error });
类型说明
-
MeshVertex Object
-
镶嵌网格的顶点。
有五种不同的细分算法,一种用于每种支持的几何类型。顶点中的属性可用于填充可使用适当着色器渲染的顶点和索引缓冲区。请参阅 SDK 示例, 了解使用单个通用着色器程序执行此操作的可能方法,该程序可以渲染任何受支持的几何类型。
有四个属性; 前三个是二维点,最后一个是标量值。网格顶点总共包含 7 个数值。
地理位置 (x, y) 与该顶点关联的地理点。Extent 和 Polygon 相当于顶点本身的位置;对于 Point 和 Multipoint 是点的地理位置,以及将关联到相应标记符号的锚点;对于 Polyline,它位于中心线上。地理位置通常以地图单位表示,自定义顶点着色器通常需要将其转换为标准化的设备坐标。
偏移向量 (xOffset, yOffset) 这是一个偏移量,通常以视图单位以外的单位表示,并驱动将地理位置挤压成线和四边形。对于 Extent 和 Polygon 为零;对于 Point 和 Multipoint,它从锚点到屏幕上四边形的四个顶点;对于 Polyline,它从中心线到折线边缘的顶点。偏移矢量通常以地图以外的其他单位表示,并且不需要通过与地理位置相同的变换进行变换。 一个常见的约定是以点或像素表示偏移量并相应地对顶点着色器进行编码。
纹理坐标 (uTexcoord, vTexcoord) 与此顶点关联的纹理坐标。对于 Extent,左下角顶点具有坐标 (0, 0) 和右上角 (1, 1); 对于 Polygon,每个顶点的坐标与该多边形的最小封闭范围在同一片段处的插值坐标相匹配; 对于 Point 和 Multipoint,每个四边形具有 (0, 0) 作为左下纹理坐标, (1, 1) 作为右上纹理坐标; 对于 Polyline,起始端由纹理坐标为 (0, 0) 和 (0, 1) 的两个顶点组成,而结束端与 (1, 0) 和 (1, 1) 相关联。
距离仅对折线有效;它是从多段线起点到该顶点的距离,以地图为单位。
- 属性:
-
x Number
x
坐标,以与 MapView 相同的单位表示。y Numbery
坐标,以与 MapView 相同的单位表示。xOffset Number屏幕空间中的
x
偏移量;这用于挤出点(成四边形)和多段线,对于多边形为 0。yOffset Number屏幕空间中的
y
偏移量;这用于挤出点(成四边形)和多段线,对于多边形为 0。uTexcoord Number纹理映射的
u
坐标。对于四边形和面,以及沿着折线的整个长度,它在 0 和 1 之间变化。vTexcoord Number纹理映射的
v
坐标。对于四边形和多边形,它在 0 和 1 之间垂直变化,并且跨越折线的宽度。distance Number该顶点的距离参数;这仅适用于镶嵌折线时。它从 0 开始,一直延伸到折线的总长度。它以地图单位表示。
-
Rect Object
-
屏幕空间中的一个矩形。
当调用 BaseLayerViewGL2D 或 BaseLayerViewGL2D 时,
Rect
的实例用于指定生成标记的屏幕空间几何形状。 “屏幕空间” 的准确解释最终是通过自定义顶点着色器来实现的; 一个常见的约定是将矩形中的值解释为以像素或点表示。有关更多详细信息,请参阅 BaseLayerViewGL2D。
-
RenderTarget Object
-
render() 应该将其输出定向到的目的地。
渲染输出保存在 viewport 定义的位置的 framebuffer 中,可能但不一定是默认的。
此类的一个实例由
BaseLayerViewGL2D
在内部维护,并且可以通过调用 getRenderTarget() 来访问。它是通过调用 bindRenderTarget() 恢复到 WebGL 上下文的同一个实例。当控制权移交给 render() 时,WebGL 上下文保证处于默认状态,当前绑定的帧缓冲区和配置的视口除外。render() 的实现可以使用
gl.bindFramebuffer()
和gl.viewport()
随意更改这些参数,但它们必须将渲染过程的输出发送到渲染目标。- 属性:
-
framebuffer WebGLFramebuffer
render() 方法应该引导其输出的帧缓冲区。
完全
framebuffer
的视口。
-
TessellatedMesh Object
-
由细分操作产生的三角形网格。
Mesh
实例可以通过调用 BaseLayerViewGL2Dtessellate*
方法之一并传递 Geometry 实例来获得。- 属性:
-
vertices MeshVertex[]
构成网格的顶点。每个元素都是一个 BaseLayerViewGL2D。
将顶点连接在一起的三角形的索引; 每个连续的三组索引表示一个三角形。
-
Tile Object
-
表示图块参考。
- 属性:
-
id String
格式中的图块字符串标识符
level/row/col/world
level Number图块所属的 LOD 的层级标识符
row Number行标识符。
col Number列标识符。
world Number当投影允许世界环绕时(例如 Web Mercator),标识该图块的
level
/row
/col
的世界实例。resolution Number图块中每个像素的地图单元数。
scale Number图块级别的地图比例。
图块左上角的坐标,作为两个数字的数组。坐标采用非标准化地图单位。
图块的边界是一个由四个数字组成的数组,可以很容易地转换为 Extent 对象。