mirror of https://gitee.com/antv-l7/antv-l7
838 lines
15 KiB
Markdown
838 lines
15 KiB
Markdown
---
|
||
title: 场景 Scene
|
||
order: 1
|
||
---
|
||
|
||
`markdown:docs/common/style.md`
|
||
|
||
# 简介
|
||
|
||
```javascript
|
||
// Module 引用
|
||
import { Scene } from '@antv/l7';
|
||
import { GaodeMap } from '@antv/l7-maps';
|
||
const scene = new Scene({
|
||
id: 'map',
|
||
map: new GaodeMap({
|
||
style: 'dark',
|
||
center: [110.770672, 34.159869],
|
||
pitch: 45,
|
||
}),
|
||
});
|
||
|
||
// CDN 使用方法
|
||
const scene = new L7.Scene({
|
||
id: 'map',
|
||
map: new L7.GaodeMap({
|
||
style: 'dark',
|
||
center: [110.770672, 34.159869],
|
||
pitch: 45,
|
||
}),
|
||
});
|
||
```
|
||
|
||
## Map
|
||
|
||
L7 地理可视化侧重于地理数据的可视化表达,地图层需要依赖第三方地图,第三方地图通过 Scene 统一创建,创建管理
|
||
只需要通过 Scene 传入地图配置项即可。
|
||
|
||
目前 L7 支持两种地图底图
|
||
|
||
- 高德地图 国内业务场景 合规中国地图
|
||
- MapBox 国际业务,或者内网离线部署场景
|
||
|
||
<img width="100%" style="display: block;margin: 0 auto;" alt="案例" src='https://gw.alipayobjects.com/mdn/rms_816329/afts/img/A*3wMCR7vIlCwAAAAAAAAAAAAAARQnAQ'>
|
||
|
||
### map
|
||
|
||
可以通过 scene map 属性获取 map 实例
|
||
|
||
```javascript
|
||
const map = scene.map;
|
||
```
|
||
|
||
为了统一不同底图之前的接口差异 L7 在 scene 层对 map 的方法做了统一,因此一些地图的操作方法可以通过 scene 调用这样,切换不同底图时保证表现一致。
|
||
|
||
示例代码
|
||
|
||
```javascript
|
||
const scene = new L7.Scene({
|
||
id: 'map',
|
||
map: new L7.GaodeMap({
|
||
style: 'dark',
|
||
center: [110.770672, 34.159869],
|
||
pitch: 45,
|
||
}),
|
||
});
|
||
```
|
||
|
||
### 构造函数
|
||
|
||
**Scene**
|
||
|
||
## 配置项
|
||
|
||
### 地图配置项
|
||
|
||
### id
|
||
|
||
<description> _string | HTMLElement_ **必选** </description>
|
||
|
||
需传入 dom 容器或者容器 id
|
||
|
||
### logoPosition
|
||
|
||
<description> _bottomleft_ **可选** </description>
|
||
|
||
L7 Logo 的显示位置 默认左下角
|
||
|
||
- bottomright
|
||
- topright
|
||
- bottomleft
|
||
- topleft
|
||
- topcenter
|
||
- bottomcenter
|
||
- leftcenter
|
||
- rightcenter
|
||
|
||
### logoVisible logo 是否可见
|
||
|
||
<description> _bottomleft_ **可选** _default: true_ </description>
|
||
|
||
是否显示 L7 的 Logo {boolean} true
|
||
|
||
### antialias 是否开启抗锯齿
|
||
|
||
<description> _boolean_ **可选** _default: true_ </description>
|
||
|
||
是否开始前抗锯齿
|
||
|
||
### stencil 是否开启裁减
|
||
|
||
<description> _boolean_ **可选** _default: false_ </description>
|
||
|
||
是否开始开启裁剪
|
||
|
||
🌟 从 v2.7.2 版本开始支持
|
||
|
||
### preserveDrawingBuffer
|
||
|
||
<description> _boolean_ **可选** _default: false_ </description>
|
||
|
||
是否保留缓冲区数据 `boolean` `false`
|
||
|
||
## Map 配置项
|
||
|
||
### zoom 初始化缩放等级
|
||
|
||
<description> _number_ </description>
|
||
|
||
地图初始显示级别 {number} Mapbox (0-24) 高德 (2-19)
|
||
|
||
### center 地图中心
|
||
|
||
地图初始中心经纬度 {Lnglat}
|
||
|
||
### pitch 地图倾角
|
||
|
||
地图初始俯仰角度 {number} default 0
|
||
|
||
### style 地图图样式
|
||
|
||
简化地图样式设置,L7 内置了三种主题默认样式 高德,mapbox 都可以使用
|
||
|
||
- dark
|
||
- light
|
||
- normal
|
||
- blank 无底图
|
||
|
||
除了内置的样式,你也可以传入自定义的其他属性。
|
||
|
||
比如高德地图
|
||
|
||
⚠️ 高德地图样式 增加 `isPublic=true` 参数
|
||
|
||
```javascript
|
||
{
|
||
style: 'amap://styles/2a09079c3daac9420ee53b67307a8006?isPublic=true'; // 设置方法和高德地图一致
|
||
}
|
||
```
|
||
|
||
### minZoom 最小缩放等级
|
||
|
||
地图最小缩放等级 {number} default 0 Mapbox 0-24) 高德 (2-19)
|
||
|
||
### maxZoom 最大缩放等级
|
||
|
||
地图最大缩放等级 {number} default 22 Mapbox(0-24) 高德 (2-19)
|
||
|
||
### rotateEnable 是否允许旋转
|
||
|
||
地图是否可旋转 {Boolean} default true
|
||
|
||
## 实验参数
|
||
|
||
参数可能会废弃
|
||
|
||
### offsetCoordinate
|
||
|
||
{ boolean } default true
|
||
|
||
高德地图适用,是否关闭偏移坐标系
|
||
|
||
## Layer 方法
|
||
|
||
### addLayer(layer) 增加图层对象
|
||
|
||
增加图层对象
|
||
|
||
参数 :
|
||
|
||
- `layer` {ILayer} 图层对象
|
||
|
||
```javascript
|
||
scene.addLayer(layer);
|
||
```
|
||
|
||
### getLayer(id) 获取对应的图层对象
|
||
|
||
获取对应的图层对象
|
||
|
||
参数 :
|
||
|
||
- `id` {string}
|
||
|
||
```javascript
|
||
scene.getLayer('layerID');
|
||
```
|
||
|
||
### getLayers() 获取所有的地图图层
|
||
|
||
获取所有的地图图层
|
||
|
||
```javascript
|
||
scene.getLayers();
|
||
```
|
||
|
||
### getLayerByName(name) 根据图层名称获取图层
|
||
|
||
根据图层名称获取图层
|
||
|
||
参数
|
||
|
||
- `name` {string} layer 初始化可配置图层 name
|
||
|
||
```javascript
|
||
scene.getLayerByName(name); // return Layer 图层对象
|
||
```
|
||
|
||
### removeLayer 移除 layer 图层
|
||
|
||
移除 layer 图层
|
||
|
||
```javascript
|
||
scene.removeLayer(layer);
|
||
```
|
||
|
||
参数 :
|
||
|
||
- `layer` {Layer}
|
||
|
||
### removeAllLayer() 移除所有的图层对象
|
||
|
||
移除所有的图层对象
|
||
|
||
```javascript
|
||
scene.removeAllLayer();
|
||
```
|
||
|
||
## 控制组件方法
|
||
|
||
### addControl(ctl) 添加组件控件
|
||
|
||
添加组件控件
|
||
|
||
参数 :
|
||
|
||
- `crl` { IControl } 用户创建的控件对象
|
||
|
||
```javascript
|
||
scene.addControl(ctl);
|
||
```
|
||
|
||
### removeControl(ctr) 移除用户添加的组件控件
|
||
|
||
移除用户添加的组件控件
|
||
|
||
参数 :
|
||
|
||
- `ctl` { IControl } 用户创建的控件对象
|
||
|
||
```javascript
|
||
scene.removeControl(ctl);
|
||
```
|
||
|
||
### getControlByName(name) 根据控件的名称来获取控件
|
||
|
||
根据控件的名称来获取控件
|
||
|
||
- `name` { string }
|
||
|
||
```javascript
|
||
const zoomControl = new Zoom({
|
||
// zoom 控件
|
||
name: 'z1', // 用户传入的控件名称(也可以不传入,该控件默认名称为 zoom)
|
||
position: 'topright',
|
||
});
|
||
|
||
scene.getControlByName('z1');
|
||
```
|
||
|
||
## 标记方法
|
||
|
||
### addMarker(maker) 添加标记
|
||
|
||
往场景中添加标记对象
|
||
|
||
参数 :
|
||
|
||
- `maker` { IMarker } Marker 实例
|
||
|
||
```javascript
|
||
const marker = new Marker({
|
||
element: el,
|
||
}).setLnglat({ lng: nodes[i].x * 1, lat: nodes[i].y });
|
||
scene.addMarker(marker);
|
||
```
|
||
|
||
### addMarkerLayer(layer) 添加 Marker 统一管理图层
|
||
|
||
当用户需要添加许多个 Marker 实例时,为了方便管理可以使用 markerLayer 对象统一管理
|
||
|
||
参数 :
|
||
|
||
- `layer` { IMarkerLayer } 标记图层对象
|
||
|
||
```javascript
|
||
const markerLayer = new MarkerLayer();
|
||
scene.addMarkerLayer(markerLayer);
|
||
```
|
||
|
||
[示例地址](/zh/examples/point/marker#markerlayer)
|
||
|
||
### removeMarkerLayer(layer) 移除标签图层
|
||
|
||
移除标签图层
|
||
|
||
参数 :
|
||
|
||
- `layer` { IMarkerLayer } 标记图层对象
|
||
|
||
```javascript
|
||
scene.removeMarkerLayer(markerLayer);
|
||
```
|
||
|
||
### removeAllMakers() 移除场景中所有的标签对象
|
||
|
||
移除场景中所有的标签对象
|
||
|
||
```javascript
|
||
scene.removeAllMakers();
|
||
```
|
||
|
||
## 地图方法
|
||
|
||
### getZoom 获取缩放等级
|
||
|
||
获取当前缩放等级
|
||
|
||
```javascript
|
||
scene.getZoom();
|
||
```
|
||
|
||
return {float} 当前缩放等级
|
||
|
||
### getCenter() 获取地图中心
|
||
|
||
获取地图中心点
|
||
|
||
```javascript
|
||
scene.getCenter();
|
||
```
|
||
|
||
return {Lnglat} :地图中心点
|
||
|
||
### getSize() 获取地图容器大小
|
||
|
||
获取地图容器大小
|
||
|
||
```javascript
|
||
scene.getSize();
|
||
```
|
||
|
||
return { Object } 地图容器的 width,height
|
||
|
||
### getPitch() 获取地图倾角
|
||
|
||
获取地图俯仰角
|
||
|
||
```javascript
|
||
scene.getPitch();
|
||
```
|
||
|
||
return {number} pitch
|
||
|
||
### getContainer 获取地图容器
|
||
|
||
获取地图容器 return htmlElement
|
||
|
||
```javascript
|
||
scene.getContainer();
|
||
```
|
||
|
||
### setMapStyle 设置地图样式
|
||
|
||
参数:`style` {string} 地图样式 具体样式格式和各底图设置方法一致
|
||
|
||
L7 内置了三种地图样式,AMAP 和 MapBox 都适用
|
||
|
||
- light
|
||
- dark
|
||
- normal
|
||
|
||
设置地图底图样式的方法
|
||
|
||
```javascript
|
||
// 快捷名称设置
|
||
|
||
scene.setMapStyle('light');
|
||
|
||
// mapbox 主题设置
|
||
scene.setMapStyle('mapbox://styles/mapbox/streets-v11');
|
||
|
||
// AMap
|
||
scene.setMapStyle(
|
||
'amap://styles/2a09079c3daac9420ee53b67307a8006?isPublic=true',
|
||
);
|
||
```
|
||
|
||
### setCenter(center: [number, number], option?: ICameraOptions) 设置地图中心点
|
||
|
||
参数:`center` {LngLat} 地图中心点
|
||
|
||
设置地图中心点坐标。L7 提供了 setCenter 方法,允许用户动态的设置地图的中心点位,同时允许通过可选的 options 属性设置偏移。
|
||
|
||
```javascript
|
||
scene.setCenter([lng, lat]);
|
||
|
||
scene.setCenter([lng, lat], {
|
||
padding: {
|
||
top: 100,
|
||
},
|
||
});
|
||
```
|
||
|
||
padding 参数支持如下的三种传值方式,数值的单位是 px
|
||
|
||
```javascript
|
||
export interface ICameraOptions {
|
||
padding:
|
||
| number
|
||
| [number, number, number, number]
|
||
| {
|
||
top?: number,
|
||
bottom?: number,
|
||
right?: number,
|
||
left?: number,
|
||
};
|
||
}
|
||
```
|
||
|
||
[在线案例](/zh/examples/point/bubble#point)
|
||
|
||
### setZoomAndCenter 设置地图缩放等级和中心点
|
||
|
||
设置地图等级和中心
|
||
|
||
```javascript
|
||
scene.setZoomAndCenter(zoom, center);
|
||
```
|
||
|
||
参数:
|
||
|
||
- zoom {number}
|
||
- center {LngLat}
|
||
|
||
### setRotation 设置地图旋转
|
||
|
||
设置地图顺时针旋转角度,旋转原点为地图容器中心点,取值范围 [0-360]
|
||
|
||
```javascript
|
||
scene.setRotation(rotation);
|
||
```
|
||
|
||
参数: `rotation` {number}
|
||
|
||
### zoomIn 地图放大一级
|
||
|
||
地图放大一级
|
||
|
||
```javascript
|
||
scene.zoomIn();
|
||
```
|
||
|
||
### zoomOut 地图缩小一级
|
||
|
||
地图缩小一级
|
||
|
||
```javascript
|
||
scene.ZoomOut();
|
||
```
|
||
|
||
### panTo 地图移动到
|
||
|
||
地图平移到指定的位置
|
||
|
||
```javascript
|
||
scene.panTo(LngLat);
|
||
```
|
||
|
||
参数:
|
||
|
||
- `center` LngLat 中心位置坐标
|
||
|
||
### panBy 地图平移
|
||
|
||
以像素为单位沿 X 方向和 Y 方向移动地图
|
||
|
||
```javascript
|
||
scene.panBy(x, y);
|
||
```
|
||
|
||
参数:
|
||
|
||
- `x` {number} 水平方向移动像素 向右为正方向
|
||
|
||
- `y` {number} 垂直方向移动像素 向下为正方向
|
||
|
||
### setPitch 设置地图倾角
|
||
|
||
设置地图仰俯角度
|
||
|
||
```javascript
|
||
scene.setPitch(pitch);
|
||
```
|
||
|
||
### setMapStatus 设置地图状态
|
||
|
||
可用来关闭地图的一些交互操作
|
||
|
||
可用来关闭地图的一些交互操作
|
||
|
||
参数 :
|
||
|
||
```javascript
|
||
IStatusOptions {
|
||
showIndoorMap: boolean;
|
||
resizeEnable: boolean;
|
||
dragEnable: boolean;
|
||
keyboardEnable: boolean;
|
||
doubleClickZoom: boolean;
|
||
zoomEnable: boolean;
|
||
rotateEnable: boolean;
|
||
```
|
||
|
||
```javascript
|
||
scene.setMapStatus({ dragEnable: false });
|
||
```
|
||
|
||
- `pitch` {number}
|
||
|
||
### setBgColor 设置场景的背景色
|
||
|
||
设置场景的背景色
|
||
|
||
参数 :
|
||
|
||
- `color` {string}
|
||
|
||
```javascript
|
||
scene.setBgColor('#f00');
|
||
```
|
||
|
||
### fitBounds 设置地图缩放范围
|
||
|
||
地图缩放到某个范围内
|
||
|
||
参数 :
|
||
|
||
- `extent` { array} 经纬度范围 [[minlng,minlat],[maxlng,maxlat]]
|
||
|
||
```javascript
|
||
scene.fitBounds([
|
||
[112, 32],
|
||
[114, 35],
|
||
]);
|
||
```
|
||
|
||
### containerToLngLat 画布坐标转经纬度
|
||
|
||
画布坐标转经纬度坐标
|
||
|
||
参数 :
|
||
|
||
- `pixel` 画布的坐标 [x ,y ] {array }
|
||
|
||
```javascript
|
||
scene.pixelToLngLat([10, 10]);
|
||
```
|
||
|
||
### lngLatToContainer 经纬度转画布坐标
|
||
|
||
经纬度坐标转画布坐标
|
||
|
||
参数 :
|
||
|
||
- `lnglat` 经纬度坐标 [lng,lat ] {array }
|
||
|
||
```javascript
|
||
scene.lngLatToPixel([120, 10]);
|
||
```
|
||
|
||
### pixelToLngLat 像素坐标转经纬度
|
||
|
||
像素坐标:不同级别下地图上某点的位置
|
||
地图像素坐标转经纬度坐标
|
||
|
||
参数 :
|
||
|
||
- `pixel` 画布的坐标 [x ,y ] {array }
|
||
|
||
```javascript
|
||
scene.pixelToLngLat([10, 10]);
|
||
```
|
||
|
||
### lngLatToPixel 经纬度转像素坐标
|
||
|
||
经纬度坐标转像素坐标
|
||
|
||
参数 :
|
||
|
||
- `lnglat` 经纬度坐标 [lng,lat ] {array }
|
||
|
||
```javascript
|
||
scene.lngLatToPixel([120, 10]);
|
||
```
|
||
|
||
### exportMap 导出地图图片
|
||
|
||
导出地图,目前仅支持导出可视化层,不支持底图导出
|
||
|
||
参数:
|
||
|
||
- `type` `png|jpg` 默认 png
|
||
|
||
```javascript
|
||
scene.exportMap('png');
|
||
```
|
||
|
||
### destroy 场景销毁
|
||
|
||
scene 销毁方法,离开页面,或者不需要使用地图可以调用
|
||
|
||
```javascript
|
||
scene.destroy();
|
||
```
|
||
|
||
## iconfont 映射支持
|
||
|
||
### addIconFont(name, fontUnicode) 增加对数据中 unicode 的映射支持
|
||
|
||
支持对用户传入的数据进行 unicode 的映射,在内部维护一组名称和对应 key 的键值对
|
||
|
||
参数 :
|
||
|
||
- `name` {string}
|
||
- `fontUnicode` {string}
|
||
|
||
```javascript
|
||
scene.addIconFont('icon1', '');
|
||
scene.addIconFont('icon2', '');
|
||
scene.addFontFace(fontFamily, fontPath);
|
||
const pointIconFontLayer = new PointLayer({})
|
||
.source(
|
||
[
|
||
{
|
||
j: 140,
|
||
w: 34,
|
||
m: 'icon1',
|
||
},
|
||
{
|
||
j: 140,
|
||
w: 36,
|
||
m: 'icon2',
|
||
},
|
||
],
|
||
{
|
||
parser: {
|
||
type: 'json',
|
||
x: 'j',
|
||
y: 'w',
|
||
},
|
||
},
|
||
)
|
||
.shape('m', 'text')
|
||
.size(12)
|
||
.color('w', ['#f00', '#f00', '#0f0'])
|
||
.style({
|
||
fontFamily,
|
||
iconfont: true,
|
||
textAllowOverlap: true,
|
||
});
|
||
scene.addLayer(pointIconFontLayer);
|
||
```
|
||
|
||
### addIconFonts(options) 同时传入多组 name - unicode 的键值对
|
||
|
||
同时传入多组 name - unicode 的键值对
|
||
|
||
参数 :
|
||
|
||
- `options` { Array<[name, unicode]> }
|
||
|
||
```javascript
|
||
scene.addIconFonts([
|
||
['icon1', ''],
|
||
['icon2', ''],
|
||
]);
|
||
```
|
||
|
||
## 全局资源
|
||
|
||
### addImage(id, img) 全局中添加的图片资源
|
||
|
||
在 L7 的图层对象可以使用在 scene 全局中添加的图片资源
|
||
|
||
参数 :
|
||
|
||
- `id` {string}
|
||
- `img` {HTMLImageElement | File | string}
|
||
|
||
```javascript
|
||
scene.addImage(
|
||
'02',
|
||
'https://gw.alipayobjects.com/zos/bmw-prod/ce83fc30-701f-415b-9750-4b146f4b3dd6.svg',
|
||
);
|
||
```
|
||
|
||
[示例地址](/zh/examples/gallery/animate#animate_path_texture)
|
||
|
||
### hasImage(id) 判断全局图片资源
|
||
|
||
判断是否已经在全局添加过相应的图片资源
|
||
|
||
参数 :
|
||
|
||
- `id` {string}
|
||
|
||
```javascript
|
||
scene.hasImage('imageID');
|
||
```
|
||
|
||
### removeImage(id) 全局删除图片资源
|
||
|
||
从全局删除对应的图片资源
|
||
|
||
参数 :
|
||
|
||
- `id` {string}
|
||
|
||
```javascript
|
||
scene.removeImage('imageID');
|
||
```
|
||
|
||
### addFontFace(fontFamily, fontPath) 添加字体文件
|
||
|
||
添加字体文件
|
||
|
||
参数 :
|
||
|
||
- `fontFamily` {string} 用户为自己定义的字体名称
|
||
- `fontPath` {string} 导入的文件地址
|
||
|
||
```javascript
|
||
let fontFamily = 'iconfont';
|
||
let fontPath =
|
||
'//at.alicdn.com/t/font_2534097_iiet9d3nekn.woff2?t=1620444089776';
|
||
scene.addFontFace(fontFamily, fontPath);
|
||
```
|
||
|
||
## 事件
|
||
|
||
### on
|
||
|
||
事件监听
|
||
|
||
#### 参数
|
||
|
||
`eventName` {string} 事件名
|
||
`handler` {function } 事件回调函数
|
||
|
||
### off
|
||
|
||
移除事件监听
|
||
`eventName` {string} 事件名
|
||
`handler` {function } 事件回调函数
|
||
|
||
### 场景事件
|
||
|
||
#### loaded
|
||
|
||
scene 初始化完成事件,scene 初始化完成添加 Layer
|
||
|
||
```javascript
|
||
scene.on('loaded', () => {});
|
||
```
|
||
|
||
#### resize
|
||
|
||
地图容器变化事件
|
||
|
||
```javascript
|
||
scene.on('resize', () => {}); // 地图容器大小改变事件
|
||
```
|
||
|
||
### 地图事件
|
||
|
||
```javascript
|
||
scene.on('loaded', () => {}); //地图加载完成触发
|
||
scene.on('mapmove', () => {}); // 地图平移时触发事件
|
||
scene.on('movestart', () => {}); // 地图平移开始时触发
|
||
scene.on('moveend', () => {}); // 地图移动结束后触发,包括平移,以及中心点变化的缩放。如地图有拖拽缓动效果,则在缓动结束后触发
|
||
scene.on('zoomchange', () => {}); // 地图缩放级别更改后触发
|
||
scene.on('zoomstart', () => {}); // 缩放开始时触发
|
||
scene.on('zoomend', () => {}); // 缩放停止时触发
|
||
```
|
||
|
||
其他地图事件可以查看相应底图的事件文档,地图事件也可以通过 Scene.map 进行设置
|
||
|
||
[Mapbox](https://docs.mapbox.com/mapbox-gl-js/api/#map.event)
|
||
[高德](https://lbs.amap.com/api/javascript-api/reference/map)
|
||
|
||
### 鼠标事件
|
||
|
||
```javascript
|
||
scene.on('click', (ev) => {}); // 鼠标左键点击事件
|
||
scene.on('dblclick', (ev) => {}); // 鼠标左键双击事件
|
||
scene.on('mousemove', (ev) => {}); // 鼠标在地图上移动时触发
|
||
scene.on('mousewheel', (ev) => {}); // 鼠标滚轮开始缩放地图时触发
|
||
scene.on('mouseover', (ev) => {}); // 鼠标移入地图容器内时触发
|
||
scene.on('mouseout', (ev) => {}); // 鼠标移出地图容器时触发
|
||
scene.on('mouseup', (ev) => {}); // 鼠标在地图上单击抬起时触发
|
||
scene.on('mousedown', (ev) => {}); // 鼠标在地图上单击按下时触发
|
||
scene.on('contextmenu', (ev) => {}); // 鼠标右键单击事件
|
||
scene.on('dragstart', (ev) => {}); //开始拖拽地图时触发
|
||
scene.on('dragging', (ev) => {}); // 拖拽地图过程中触发
|
||
scene.on('dragend', (ev) => {}); //停止拖拽地图时触发。如地图有拖拽缓动效果,则在拽停止,缓动开始前触发
|
||
```
|