- Accessible Map
- Advanced Mapbox Vector Tiles
- 高级地图定位
- 地图加载 GIF 动图
- ArcGIS REST Feature Service
- Attributions
- 波段对比度调节
- Bing Maps
- Box Selection
- Canvas Tiles
- CartoDB source example
- Change Tile Layer Style
- Cloud Optimized GeoTIFF (COG)
- Cloud Optimized GeoTIFF (COG) from a Blob
- Clustered Features
- Color Manipulation
- Constrained Extent
- Constrained Zoom
- Custom Animation
- Custom Canvas Tiles
- 自定义圆形渲染
- 自定义控件
- 自定义拖拽上传展示数据(KMZ)
- 自定义拖拽上传展示数据 (MVT 预览)
- 自定义触发器渲染
- 自定义交互
- 地图自定义 dom 元素(element)
- 自定义鹰眼
- 自定义面状图形要素样式
- 自定义瓦片 WMS
- 自定义提示信息
- d3 集成
- 数据瓦片
- 设备定位
- 拖拽加载数据
- 拖拽 Image Vector
- 拖拽,旋转和缩放
- 绘制和修改图形要素(Features)
- 绘制和编辑测地线(Geodesic)圆
- 绘制图形要素(Feature)
- 绘制规则图形
- 动态聚合
- 动画展示数据
- 地震位置聚合图
- 地震位置热力图
- 渲染 KML 中的地震数据
- 自定义图形渲染地震数据
- 可编辑的 ArcGIS REST 图形要素服务
- EPSG:4326
- 导出 PDF 示例
- 范围(Extent)交互
- 外部地图
- 使用 WebGL 过滤图形要素
- 航班飞行动画
- Fractal 渲染
- 自由绘制
- 全屏控件
- 带有扩展element的全屏控件
- 全屏拖拽,旋转,缩放
- Geographic Coordinates
- Geographic Editing
- GeoJSON
- 集成 geojson-vt
- 地理位置
- GeoTIFF 瓦片金字塔
- GeoTIFF with Overviews
- GPX 数据
- 高 DPI WMTS
- 点击容许偏差
- Icon 比例
- Icon 颜色
- Icon 位置修改
- Icon 像素操作
- Icon Sprites with WebGL
- Icon 渲染
- IGC 数据
- IGN WMTS
- IIIF 影像 API
- ArcGIS 图像地图服务
- 图片过滤
- 图像载入事件
- 图像重投影
- 即时渲染 (地理)
- 插值
- 集成 JSTS
- KML
- Layer 裁剪
- 图层组
- 图层 最小/最大 分辨率
- 图层透明度
- 图层鼠标透视
- 图层卷帘
- 图层卷帘 (WebGL)
- 图层层级(Z-Index)
- 图层缩放限制
- 懒加载资源
- 限制图层范围
- 线段箭头
- 载入中旋转动画
- 局部的 OpenStreetMap
- 鼠标放大镜效果
- 地图打印(导出)
- 地图经纬网格
- 地图链接地址
- Mapbox 矢量图层
- Mapbox 矢量瓦片
- Mapbox-gl 图层
- MapGuide Untiled
- 地图点图标动画
- 测量
- 使用矢量样式测量
- 修改图形要素(Features)
- 修改图形要素测试
- 显示鼠标位置
- 地图平移(拖拽)结束事件
- 定位控件
- NDVI from a Sentinel 2 COG
- 动态颜色斜率 NDVI
- NDVI+NDWI from two 16-bit COGs
- OGC 地图瓦片
- OGC 地图瓦片 (地理)
- OGC 矢量瓦片
- OpenStreetMap 重投影
- 带有比例尺控件的 OpenStreetMap 重投影
- OSM 矢量瓦片
- OSM XML
- 覆盖物(Overlay)
- 鹰眼地图控件
- 页面滚动
- 拖拽和页面滚动
- Permalink
- Pinch Zoom
- Popup
- Preload Tiles
- 按比例导出地图
- 投影和比例尺
- 栅格重投影
- 栅格资源
- 区域增长
- Regular Shapes
- Render geometries to a canvas
- Rendering 16-bit NumpyTiles
- Reprojection with EPSG.io Search
- Reusable Source
- Rich Text Labels
- Scale and Rotate using Modify Interaction
- Scale Line
- Sea Level
- Sea Level (with WebGL)
- Select Features
- Select Features by Hover
- Select multiple Features
- Semi-Transparent Layer
- Shaded Relief
- Shaded Relief (with WebGL)
- Shared Views
- Simple Map
- Single Image WMS
- Single Image WMS with Proj4js
- Smoothing lines using Chaikins algorithm
- Snap Interaction
- Sphere Mollweide
- Stamen Tiles
- Static Image
- Street Labels
- Style renderer
- Styling feature with CanvasGradient or CanvasPattern
- SVG Layer
- Synthetic Lines
- Synthetic Points
- Teleporting Maps
- Tile Load Events
- Tile Transitions
- Tiled ArcGIS MapServer
- Tiled WMS
- Tiled WMS Wrapping
- TileJSON
- Timezones in KML
- Tissot Indicatrix
- TopoJSON
- topolis integration
- Tracing around a polygon
- Translate Features
- turf.js
- UTFGrid
- Vector Clipping Layer
- Vector Image Layer
- Vector Label Decluttering
- Vector Labels
- Vector Labels - Justify Text
- Vector Layer
- Vector Layer Hit Detection
- Vector Tile Info
- Vector Tile Selection
- Vector tiles created from a Mapbox Style object
- Vector tiles in EPSG:4326
- Vector tiles rendered in an offscreen canvas
- View Animation
- View Min-Zoom
- View Padding
- View Rotation
- WebGL points layer
- WebGL Tile Layer Styles
- WebGL Tiles
- WebGL Vector Layer
- WFS
- WFS - GetFeature
- WFS with geographic coordinates
- Wind Arrows
- WKB
- WKT
- WMS 512x256 Tiles
- WMS Capabilities Parsing
- WMS GetFeatureInfo (Image Layer)
- WMS GetFeatureInfo (Layers)
- WMS GetFeatureInfo (Tile Layer)
- WMS GetLegendGraphic
- WMS 时序渲染
- 无投影 WMS
- WMTS
- WMTS Capabilities 解析
- 从 Capabilities 加载 WMTS
- WMTS 瓦片转换
- XYZ
- XYZ Esri
- XYZ 视网膜瓦片
- 缩放滑块
- Zoomify
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
WebGL points layer
Using a WebGL-optimized layer to render a large quantities of points
This example shows how to use a WebGLPointsLayer
to show a large amount of points on the map. The layer is given a style in JSON format which allows a certain level of customization of the final reprensentation. The following operators can be used:
Reading operators:
['get', 'attributeName']
fetches a feature attribute (it will be prefixed bya_
in the shader) Note: those will be taken from the attributes provided to the renderer['var', 'varName']
fetches a value from the style variables, or 0 if undefined['time']
returns the time in seconds since the creation of the layer['zoom']
returns the current zoom level['resolution']
returns the current resolution
Math operators:
['*', value1, value2]
multipliesvalue1
byvalue2
['/', value1, value2]
dividesvalue1
byvalue2
['+', value1, value2]
addsvalue1
andvalue2
['-', value1, value2]
subtractsvalue2
fromvalue1
['clamp', value, low, high]
clampsvalue
betweenlow
andhigh
['%', value1, value2]
returns the result ofvalue1 % value2
(modulo)['^', value1, value2]
returns the value ofvalue1
raised to thevalue2
power
Transform operators:
['case', condition1, output1, ...conditionN, outputN, fallback]
selects the first output whose corresponding condition evaluates totrue
. If no match is found, returns thefallback
value. All conditions should beboolean
, output and fallback can be any kind.['match', input, match1, output1, ...matchN, outputN, fallback]
compares theinput
value against all providedmatchX
values, returning the output associated with the first valid match. If no match is found, returns thefallback
value.input
andmatchX
values must all be of the same type, and can benumber
orstring
.outputX
andfallback
values must be of the same type, and can be of any kind.['interpolate', interpolation, input, stop1, output1, ...stopN, outputN]
returns a value by interpolating between pairs of inputs and outputs;interpolation
can either be['linear']
or['exponential', base]
wherebase
is the rate of increase from stop A to stop B (i.e. power to which the interpolation ratio is raised); a value of 1 is equivalent to['linear']
.input
andstopX
values must all be of typenumber
.outputX
values can benumber
orcolor
values. Note:input
will be clamped betweenstop1
andstopN
, meaning that all output values will be comprised betweenoutput1
andoutputN
.
Logical operators:
['<', value1, value2]
returnstrue
ifvalue1
is strictly lower thanvalue2
, orfalse
otherwise.['<=', value1, value2]
returnstrue
ifvalue1
is lower than or equalsvalue2
, orfalse
otherwise.['>', value1, value2]
returnstrue
ifvalue1
is strictly greater thanvalue2
, orfalse
otherwise.['>=', value1, value2]
returnstrue
ifvalue1
is greater than or equalsvalue2
, orfalse
otherwise.['==', value1, value2]
returnstrue
ifvalue1
equalsvalue2
, orfalse
otherwise.['!=', value1, value2]
returnstrue
ifvalue1
does not equalvalue2
, orfalse
otherwise.['!', value1]
returnsfalse
ifvalue1
istrue
or greater than0
, ortrue
otherwise.['between', value1, value2, value3]
returnstrue
ifvalue1
is contained betweenvalue2
andvalue3
(inclusively), orfalse
otherwise.
Conversion operators:
['array', value1, ...valueN]
creates a numerical array fromnumber
values; please note that the amount of values can currently only be 2, 3 or 4.['color', red, green, blue, alpha]
creates acolor
value fromnumber
values; thealpha
parameter is optional; if not specified, it will be set to 1. Note:red
,green
andblue
components must be values between 0 and 255;alpha
between 0 and 1. Values can either be literals or another operator, as they will be evaluated recursively. Literal values can be of the following types:
boolean
number
string
main.js
import 'ol/ol.css';
import GeoJSON from 'ol/format/GeoJSON';
import Map from 'ol/Map';
import OSM from 'ol/source/OSM';
import TileLayer from 'ol/layer/Tile';
import Vector from 'ol/source/Vector';
import View from 'ol/View';
import WebGLPointsLayer from 'ol/layer/WebGLPoints';
const vectorSource = new Vector({
url: 'data/geojson/world-cities.geojson',
format: new GeoJSON(),
});
const predefinedStyles = {
'icons': {
symbol: {
symbolType: 'image',
src: 'data/icon.png',
size: [18, 28],
color: 'lightyellow',
rotateWithView: false,
offset: [0, 9],
},
},
'triangles': {
symbol: {
symbolType: 'triangle',
size: 18,
color: [
'interpolate',
['linear'],
['get', 'population'],
20000,
'#5aca5b',
300000,
'#ff6a19',
],
rotateWithView: true,
},
},
'triangles-latitude': {
symbol: {
symbolType: 'triangle',
size: [
'interpolate',
['linear'],
['get', 'population'],
40000,
12,
2000000,
24,
],
color: [
'interpolate',
['linear'],
['get', 'latitude'],
-60,
'#ff14c3',
-20,
'#ff621d',
20,
'#ffed02',
60,
'#00ff67',
],
offset: [0, 0],
opacity: 0.95,
},
},
'circles': {
symbol: {
symbolType: 'circle',
size: [
'interpolate',
['linear'],
['get', 'population'],
40000,
8,
2000000,
28,
],
color: '#006688',
rotateWithView: false,
offset: [0, 0],
opacity: [
'interpolate',
['linear'],
['get', 'population'],
40000,
0.6,
2000000,
0.92,
],
},
},
'circles-zoom': {
symbol: {
symbolType: 'circle',
size: ['interpolate', ['exponential', 2.5], ['zoom'], 2, 1, 14, 32],
color: '#240572',
offset: [0, 0],
opacity: 0.95,
},
},
'rotating-bars': {
symbol: {
symbolType: 'square',
rotation: ['*', ['time'], 0.1],
size: [
'array',
4,
[
'interpolate',
['linear'],
['get', 'population'],
20000,
4,
300000,
28,
],
],
color: [
'interpolate',
['linear'],
['get', 'population'],
20000,
'#ffdc00',
300000,
'#ff5b19',
],
offset: [
'array',
0,
[
'interpolate',
['linear'],
['get', 'population'],
20000,
2,
300000,
14,
],
],
},
},
};
const map = new Map({
layers: [
new TileLayer({
source: new OSM(),
}),
],
target: document.getElementById('map'),
view: new View({
center: [0, 0],
zoom: 2,
}),
});
let literalStyle;
let pointsLayer;
function refreshLayer(newStyle) {
const previousLayer = pointsLayer;
pointsLayer = new WebGLPointsLayer({
source: vectorSource,
style: newStyle,
disableHitDetection: true,
});
map.addLayer(pointsLayer);
if (previousLayer) {
map.removeLayer(previousLayer);
previousLayer.dispose();
}
literalStyle = newStyle;
}
const spanValid = document.getElementById('style-valid');
const spanInvalid = document.getElementById('style-invalid');
function setStyleStatus(errorMsg) {
const isError = typeof errorMsg === 'string';
spanValid.style.display = errorMsg === null ? 'initial' : 'none';
spanInvalid.firstElementChild.innerText = isError ? errorMsg : '';
spanInvalid.style.display = isError ? 'initial' : 'none';
}
const editor = document.getElementById('style-editor');
editor.addEventListener('input', function () {
const textStyle = editor.value;
try {
const newLiteralStyle = JSON.parse(textStyle);
if (JSON.stringify(newLiteralStyle) !== JSON.stringify(literalStyle)) {
refreshLayer(newLiteralStyle);
}
setStyleStatus(null);
} catch (e) {
setStyleStatus(e.message);
}
});
const select = document.getElementById('style-select');
select.value = 'circles';
function onSelectChange() {
const style = select.value;
const newLiteralStyle = predefinedStyles[style];
editor.value = JSON.stringify(newLiteralStyle, null, 2);
try {
refreshLayer(newLiteralStyle);
setStyleStatus();
} catch (e) {
setStyleStatus(e.message);
}
}
onSelectChange();
select.addEventListener('change', onSelectChange);
// animate the map
function animate() {
map.render();
window.requestAnimationFrame(animate);
}
animate();
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebGL points layer</title>
<!-- Pointer events polyfill for old browsers, see https://caniuse.com/#feat=pointer -->
<script src="https://unpkg.com/elm-pep"></script>
<!-- The line below is only needed for old environments like Internet Explorer and Android 4.x -->
<script src="https://cdn.polyfill.io/v3/polyfill.min.js?features=fetch,requestAnimationFrame,Element.prototype.classList,URL,TextDecoder,Number.isInteger"></script>
<style>
.map {
width: 100%;
height:400px;
}
</style>
</head>
<body>
<div id="map" class="map"></div>
Choose a predefined style from the list below or edit it as JSON manually.
<select id="style-select">
<option value="icons">Icons</option>
<option value="triangles">Triangles, color related to population</option>
<option value="triangles-latitude">Triangles, color related to latitude</option>
<option value="circles">Circles, size related to population</option>
<option value="circles-zoom">Circles, size related to zoom</option>
<option value="rotating-bars">Rotating bars</option>
</select>
<textarea style="width: 100%; height: 20rem; font-family: monospace; font-size: small;" id="style-editor"></textarea>
<small>
<span id="style-valid" style="display: none; color: forestgreen">✓ style is valid</span>
<span id="style-invalid" style="display: none; color: grey">✗ <span>style not yet valid...</span></span>
</small>
<script src="main.js"></script>
</body>
</html>
package.json
{
"name": "webgl-points-layer",
"dependencies": {
"ol": "7.1.0"
},
"devDependencies": {
"parcel": "^2.0.0-beta.1"
},
"scripts": {
"start": "parcel index.html",
"build": "parcel build --public-url . index.html"
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论