一、介绍
1. 地理应用分层
2. cci-map 介绍
cci-map 是基于 @antv/l7 二次开发的地图渲染引擎,使用 WebGL 渲染技术可支持海量数据点加载,功能包括:地图底图切换、地图控制组件、可视化图层等。(L7 是蚂蚁金服基于 WebGL 的开源大规模地理空间数据可视分析开发框: 2D,3D 一体化的海量数据高性能渲染; 支持 CSV,JSON,geojson 等数据格式接入,可按需求自定义数据格式; 多地图底图支持,支持离线内网部署,见文档https://l7.antv.vision/zh/docs/api/map)
3. 安装
1 | # 1. 使用cci 私有仓库 |
4. 快速上手
cci-map 兼容 @antv/l7用法,暴露 CMap 类作为场景构造类(@antv/l7对应 Scene 类),并对 @antv/l7 升级和扩展了部分功能。
4.1 cci-map 使用 ES module 引入
1 | import { CMap, GaodeMap } from 'cci-map' |
4.2 cci-map 使用 script 脚本引入
如需引用第三方地图API,请确保在先引入第三方API后再引入 cci-map ( 目前 umd 版本在 cci-map 库 dist 目录下 index.umd.js 文件,后续会开放 cdn )
所有构造类和方法在命名空间 CciMap 下
1 | <script src = 'cci-map/dist/index.umd.js'></script> |
4.2.1 使用高德地图
- 注册账号并申请Key
- 引入 cci-map 脚本
2.0版本在cci-map内部动态引入了高德地图JS API,因此不再需要单独引入高德JS API,只需设置 type 为 amap
并且传入token
1 | <script src='cci-map/dist/index.umd.js'></script> |
- 完整代码
1 |
|
4.2.2 使用 mapbox
- 注册MapBox token
注册地址 Mapbox Access Tokens
- 引入mapbox.gl JS 和 css
使用mapbox 需要单独引入 mapbox
1 | <link href='https://api.tiles.mapbox.com/mapbox-gl-js/v1.5.0/mapbox-gl.css' rel='stylesheet' /> |
- 引入 cci-map 脚本
1 | <script src='cci-map/dist/index.umd.js'></script> |
- 完整代码
1 |
|
4.2.3 使用 maptalks
- 引入maptalks JS 和 css
使用mapbox 需要单独引入 mapbox
1 | <link href="https://cdn.bootcdn.net/ajax/libs/maptalks/0.49.0/maptalks.min.css" rel="stylesheet"> |
- 引入 cci-map 脚本
1 | <script src='cci-map/dist/index.umd.js'></script> |
- 完整代码
1 |
|
4.3 cci-lib-draw 快速上手
4.3.1 使用
- es6 module
1 | import { DrawControl } from 'cci-lib-l7-draw' |
使用 script 脚本引入
如需引用第三方地图API,请确保在先引入第三方API后再引入 cci-map, 再引入 cci-lib-l7-draw ( 目前 umd 版本在 cci-lib-l7-draw 库 dist 目录下 index.umd.js 文件,后续会开放 cdn )
所有构造类和方法在命名空间 CciMapDraw 下
1
<script src='cci-lib-l7-draw/dist/index.umd.js'></script>
4.3.2 实例化
1 | const control = new DrawControl(scene, option) |
二、 自定义投影坐标系
l7 只接入高德和 mapbox 地图引擎,而 cci-map 还接入了 maptalks。对于自定义天地图投影需求,可以指定底图为 maptalks,结合 proj4 实现。
- Proj4js 是地理坐标参考系的转换javascript库, 它同时支持不同大地基准面的转换
- 对于不同坐标系,默认 resolution 和 fullExtent 参考 maptalks 源码 DefaultSpatialReference 部分(定义了 EPSG3857,EPSG4490,EPSG4326,百度等)
2.1 maptalks 自定义投影 EPSG4490 天地图
1 | <script> |
2.2 proj4js来实现默认的EPSG:3857空间
1 | <template> |
三、 cci-map gis工具
1. BD09,GCJ02 和 WGS84 坐标系间的转换工具
1 | import { CoordsTransform } from 'cci-map' |
2. 数据抽稀(针对大数据量边界数据)
1 | import { simplifyGeoJSON } from 'cci-map' |
3. 浏览器辅助 ( cci-map 的 Browser 类 )
属性名 | 类型 | 说明 |
---|---|---|
ua |
String |
当前浏览器userAgent |
mobile |
Boolean | 是否移动设备 |
plat |
String |
平台类型,如:’windows’、’mac’、’ios’、’android’、’other’ |
windows |
Boolean | 是否windows设备 |
ios |
Boolean | 是否iOS设备 |
iPad |
Boolean | 是否iPad |
iPhone |
Boolean | 是否iPhone |
android |
Boolean | 是否安卓设备 |
android23 |
Boolean | 是否安卓4以下系统 |
chrome |
Boolean | 是否Chrome浏览器 |
firefox |
Boolean | 是否火狐浏览器 |
safari |
Boolean | 是否Safari浏览器 |
wechat |
Boolean | 是否微信 |
uc |
Boolean | 是否UC浏览器 |
qq |
Boolean | 是否QQ或者QQ浏览器 |
ie |
Boolean | 是否IE |
ie6 |
Boolean | 是否IE6 |
ie7 |
Boolean | 是否IE7 |
ie8 |
Boolean | 是否IE8 |
ie9 |
Boolean | 是否IE9 |
ie10 |
Boolean | 是否IE10 |
ie11 |
Boolean | 是否IE11 |
ielt9 |
Boolean | 是否IE9以下 |
edge |
Boolean | 是否Edge浏览器 |
isLocalStorage |
Boolean | 是否支持LocaStorage |
isGeolocation |
Boolean | 是否支持Geolocation |
mobileWebkit |
Boolean | 是否Webkit移动浏览器 |
mobileWebkit3d |
Boolean | 是否支持Css3D的Webkit移动端浏览器 |
retina |
Boolean | 是否高清屏幕,devicePixelRatio>1 |
touch |
Boolean | 是否触屏 |
msPointer |
Boolean | 是否msPointer设备 |
pointer |
Boolean | 是否pointer设备 |
webkit |
Boolean | 是否webkit浏览器 |
webkit3d |
Boolean | 是否支持Css3D的Webkit浏览器 |
gecko3d |
Boolean | 是否支持Css3D的gecko浏览器 |
ie3d |
Boolean | 是否支持Css3D的ie浏览器 |
any3d |
Boolean | 是否支持Css3D的浏览器 |
opera3d |
Boolean | 是否支持Css3D的opera浏览器 |
isCanvas |
Boolean | 是否支持canvas |
isSvg |
Boolean | 是否支持svg |
isVML |
Boolean | 是否支持vml |
isWorker |
Boolean | 是否支持WebWorker |
isWebsocket |
Boolean | 是否支持WebSocket |
isWebGL |
function |
判断是否支持webgl |
1 | import { Browser } from 'cci-map' |
四、cci-map 绘制工具
cci-lib-l7-draw 二次开发的地图绘制组件,支持点、marker、线、面, 圆、矩形、的绘制编辑,支持矩形、多边形和圆形框选缩放,支持距离和面积测量
1. DrawControl
1.1 使用
1 | import { DrawControl } from 'cci-lib-l7-draw'; |
1.2 参数
1 | const control = new DrawControl(scene, option); |
1.2.1 scene
scene 对象, 绘制控件需要传入 scene 实例
1.2.2 options
control 配置项
name | Type | Default | Description |
---|---|---|---|
position | bottomright、topright、 bottomleft’ topleft | topright | 组件位置 |
layout | horizontal、 vertical | vertical | 组件布局 |
controls | controlOptions | 设置 UI 组件添加哪些绘制工具 | |
style | 地图绘制样式 |
1.2.3 UI 组件配置项
- point
boolean | drawOption
绘制点工具配置 - marker
boolean | drawOption
绘制 marker 工具配置 - line
boolean | drawOption
绘制线工具配置 - polygon
boolean | drawOption
绘制面工具配置 - circle
boolean | drawOption
绘制圆工具配置 - rect
boolean | drawOption
绘制矩形工具配置 - delete
boolean | drawOption
添加删除工具 - calculateLine
boolean
添加测量距离工具 - calculateArea
boolean
添加测量面积工具
1.2.4 默认配置
1 | { |
1.2.5 示例
1 | { |
1.3 添加到地图
1 | scene.addControl(control); |
1.4 从地图中移除
1 | scene.removeControl(control); |
1.5 方法
1 | getDraw() |
参数: type 绘制实例 point|marker|line|polygon|rect|circle
1 | const pointDraw = drawcontrol.get('point'); |
getAllData()
获取每个 Draw 实例绘制的结果数据
返回数据格式如下
1 | { |
1.6 事件
drawControl 的事件类型和每个 Draw 的事件一致,如果在 drawControl 监听事件会为每个 draw 增加事件监听
- drawType: Draw 类型
- feature: 对应的数据
draw.create
绘制完成时触发该事件
draw.delete
图形删除时触发该事件
draw.update
图形更新时触发该事件,图形的平移,顶点的编辑
draw.selectionchange
图形选中时触发该事件
1 | drawControl.on('draw.delete', e => {}); |
1.7 style
drawControl 的 style 和每个 Draw 的 style 一致
2. Draw Type
可以不依赖 Draw UI 组件,独立的使用每一个 Draw
2.1 DrawMarker (新增功能)
绘制 marker
1 | import { DrawMarker } from 'cci-lib-l7-draw'; |
参数使用 data 选项时候, geojson 的 propertise 需要添加对应类型
1 | new DrawMarker(scene, { |
2.2 DrawCircle
绘制圆形
1 | import { DrawCircle } from 'cci-lib-l7-draw'; |
参数使用 data 选项初始化渲染
1 | const draw = new DrawCircle(scene, { |
或者调用 resetData 方法
1 | const draw = new DrawCircle(scene) |
2.3 DrawRect
绘制四边形
1 | import { DrawRect } from 'cci-lib-l7-draw'; |
参数使用 data 选项渲染初始化数据
1 | const draw = new DrawRect(scene, { |
或者调用 resetData 方法
1 | const draw = new DrawRect(scene) |
2.4 DrawLine
绘制路径
1 | import { DrawLine } from 'cci-lib-l7-draw'; |
2.5 DrawPoint
绘制点
1 | import { DrawPoint } from 'cci-lib-l7-draw'; |
2.6 DrawPolygon
绘制多边形
1 | import { DrawPolygon } from 'cci-lib-l7-draw'; |
2.7 DrawOption 配置项
- editEnable boolean 是否允许编辑
- selectEnable boolean 是否允许选中
2.8 方法
enable
开始编辑,绘制完成之后会自动结束。
1 | draw.enable(); |
disable
结束编辑
1 | draw.disable(); |
2.9 Style
- active 绘制过程中高亮颜色
- normal 正常显示状态
1 | const style = { |
3. Calculate Type (新增功能)
可以不依赖 Draw UI 组件,独立的使用每一个 Calculate
- getDistance 和 getArea 方法可用于距离和面积测量
1 | import { getDistance, getArea } from 'cci-lib-l7-draw' |
3.1 CalculateLine 测量距离
1 | import { CalculateLine } from 'cci-lib-l7-draw'; |
- 事件
calculate-line-start
开始测量会派发
calculate-line-end
结束测量会派发
- calculateLineOption 测量距离配置
name | Type | Default | Description |
---|---|---|---|
style | Object | 框选样式 |
- style 默认配置
1 | { |
3.2 CalculateArea 测量面积
1 | import { CalculateArea } from 'cci-lib-l7-draw'; |
- 事件
calculate-area-start
开始测量会派发
calculate-area-end
结束测量会派发
- calculateAreaOption 测量面积配置
name | Type | Default | Description |
---|---|---|---|
style | Object | 框选样式 |
- style 默认配置
1 | { |
- 方法
enable
开始测量,在地图上点选,双击完成之后会自动结束。
1 | calculate.enable(); |
disable
清除所有测量结果
1 | calculate.disable(); |
4. RectZoom (新增功能)
矩形框选缩放,可以拉框选中,地图根据框选的位置为中心进行放大到最佳比例尺显示
1 | import { RectZoom } from 'cci-lib-l7-draw' |
- rectZoomOption
框选配置
name | Type | Default | Description |
---|---|---|---|
style | Object | 框选样式 | |
step | Number | 1 | 每次缩放层级 |
- style
默认配置
1 | { |
- 方法
enable
开始框选,框选完成之后会自动结束。
1 | rectZoom.enable('zoomIn') // 放大 |
- 事件
draw.create
绘制完成时触发该事件, 返回 feature 对应的数据
5. CircleZoom (新增功能)
圆形框选缩放,可以拉框选中,地图根据框选的位置为中心进行放大到最佳比例尺显示, 参数、方法和事件同 RectZoom
1 | import { CircleZoom } from 'cci-lib-l7-draw' |
6. PolygonZoom (新增功能)
多边形框选缩放,可以拉框选中,地图根据框选的位置为中心进行放大到最佳比例尺显示, 参数、方法和事件同 RectZoom
1 | import { PolygonZoom } from 'cci-lib-l7-draw' |
五、cci-map 可视化组件
@antv/l7 原有可视化图层和覆盖物( PointLayer, LineLayer, PolygonLayer, Marker, Popup, ImageLayer, RasterLayer, HeatmapLayer, CityBuildingLayer
)可在初始化时通过 dataCoordinateSystem
参数指定数据的坐标系,内部会根据传入的数据坐标系,自动将数据转换为地图引擎需要的坐标系坐标数据, dataCoordinateSystem
参数不传则默认不做数据转换
1 | import { CMap, GaodeMap, PointLayer } from 'cci-map' |
1. 鹰眼组件
HawkEye 是鹰眼图组件
1.1 参数
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
visible | 控制鹰眼图显示隐藏 | Boolean | - | true |
sceneConfig | 分别以 amap 或者 mapbox 地图实例的 scene 配置 | Object | ||
bigScene | 外层地图 CMap 实例 | Object | ||
zoomGap | 外层地图和鹰眼地图缩放级别之差 | Number | - | 3 |
1.2 示例
1 | <template> |
2. echarts 图层
如果 cci-map 使用 script 脚本引入,在使用 EchartsLayer 时需要先引入 echarts 库
2.1 parser 参数
调用图层 source
方法,第一个参数设置为 echarts 配置,第二个参数设置 parser 参数; 如果第一个参数为空对象, 之后通过调用图层 setData
方法传入 echarts 配置。echarts 配置中 series 配置必须通过 coordinateSystem
配置当前地图类型,地图类型可以通过 scene.mapService.getType
配置
1 | { |
2.2 示例
1 | import { CMap, Mapbox, EchartsLayer } from 'cci-map' |
3. 自定义图层
通过自定义图层用户可以绘制 canvas,svg 和 dom
初始化参数
| 参数 | 说明 | 类型 | 可选值 | 默认值 |
| :—– | :———————————————— | :——- | :—– | :—– |
| dom | 绘制元素,可以 canvas 节点、dom 节点或者 svg 节点 | | - | - |
| render | 渲染方法, 在地图初始化和地图拖拽缩放时调用 | Function | | |parser 参数(调用图层
source
方法,第一个参数设置为空对象,第二个参数设置 parser 参数)1
2
3
4
5{
parser: {
type: 'custom'
}
}
3.1 canvas
1 | import { CMap, GaodeMap, CustomLayer } from 'cci-map' |
3.2 svg
1 | import { CMap, GaodeMap, CustomLayer } from 'cci-map' |
3.3 dom
1 | import { CMap, GaodeMap, CustomLayer } from 'cci-map' |
4. wms/wmts 图层
将瓦片图层加载到地图上
默认支持 EPSG:3857, 还支持 EPSG:4326
4.1 初始化参数
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
minZoom | 图层最小缩放层级 | Number | - | 3 |
maxZoom | 图层最大缩放层级 | Number | - | 19 |
4.2 wms url 请求参数
1 | { |
4.3 wmts url 请求参数
1 | { |
4.4 parser 参数
调用图层 source
方法,第一个参数配置 wms/wmts url 请求参数,第二个参数设置 parser 参数
1 | { |
4.5 示例
- wms
1 | import { CMap, Mapbox, WMSLayer } from 'cci-map' |
- wmts 4326
1 | import { Scene, Mapbox, WMTSLayer } from 'cci-map' |
5. 3d tiles 图层
加载 3d tiles 图层
需首先加载 three 库 和 gltfLoader 库
地图底图 mapbox 只支持 EPSG:3857 的 tileset.json 文件
5.1 初始化参数
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
url | tileset.json 的地址 | String | - | - |
5.2 parser 参数
调用图层 source
方法,第一个参数配置空对象,第二个参数设置 parser 参数
1 | { |
5.3 示例
1 | import { CMap, GaodeMapV2, Tiles3DLayer } from 'cci-map' |
6. 轨迹回放组件
RoutePlay 是轨迹回放组件
6.1 参数
参数 | 说明 | 类型 | 必传 | 默认值 |
---|---|---|---|---|
scene | 实例化场景 | Object | 是 | |
fastSpeed | 快速速度配置(正整数) | Number | 3 | |
normalSpeed | 正常速度配置(正整数) | Number | 2 | |
lowSpeed | 慢速速度配置(正整数) | Number | 1 | |
isShowRouteLayer | 是否显示轨迹 | Boolean | true | |
isShowVisitedLayer | 是否显示实时经过轨迹 | Boolean | true | |
isShowMarker | 是否显示marker(随轨迹运动点) | Boolean | true | |
marker | 可外部传入 marker | Object | ||
routeLayer | 可外部传入 轨迹图层(LineLayer 实例) | Object | ||
visitedLayer | 可外部传入 实时经过轨迹图层(LineLayer 实例) | Object | ||
route | 轨迹标准 geojson 数据 | Object | 是 | |
size | 轨迹线宽 | Number | 4 | |
color | 轨迹颜色 | String | #2896f6 | |
visitedSize | 实时经过轨迹线宽 | Number | 4 | |
visitedColor | 实时经过轨迹颜色 | String | #374048 | |
markerEventList | marker 事件列表(数组,’mousemove’,’click’,’mousedown’,’mouseup’,’dblclick’,’contextmenu’,’mouseover’,’mouseout’) | Array | [‘click’] | |
routeEventList | 轨迹图层事件列表(数组,’mousemove’,’click’,’mousedown’,’mouseup’,’dblclick’,’contextmenu’,’mouseover’,’mouseout’) | Array | [‘click’] | |
visitedEventList | 实时经过轨迹图层 事件列表(数组,’mousemove’,’click’,’mousedown’,’mouseup’,’dblclick’,’contextmenu’,’mouseover’,’mouseout’) | Array | [‘click’] |
6.2 方法
start
开始播放
pause
暂停
stop
停止
reset
重置,播放速度为 normalSpeed
speedUp
设置速度为 fastSpeed
speedDown
设置速度为 lowSpeed
seekTo
跳转执行位置播放
参数:num 0-1之间小数
6.3 示例
1 | <script> |
六、图层发布和使用
- 对于标准天地图,使用 cci-map 的 Mapbox
- 对于天地图自定义坐标系,使用 cci-map 的 maptalks 结合 proj4 实现自定义天地图投影坐标系,可在地图基础上叠加 cci-map 可视化图层和 wmts/wms 图层
1. 对接流程
2. 图层发布后对接实例
自定义天地图投影坐标系目前使用 leaflet 实现(项目需要加载 leaflet,proj4, proj4leaflet 库文件),cci-map 会在下一个版本接入 maptalks 引擎,届时可以通过 maptalks 结合 proj4 实现自定义天地图投影坐标系
- 页面源码
1 | <template> |
- 页面函数
1 | // 变量说明 |
- 页面源码依赖的百度 layer 代码
1 | import { CoordsTransform } from 'cci-map' |
七、常用代码示例
1. CMap 属性、方法和事件
1 | // Module 引用 |
可以通过 scene map 属性获取 map 实例
1 | const map = scene.map; |
为了统一不同底图之前的接口差异, 在 scene 层对 map 的方法做了统一,因此一些地图的操作方法可以通过 scene 调用这样,切换不同底图时保证表现一致
1 | const scene = new CciMap.CMap({ |
1.1 Map 配置项
- zoom 初始化缩放等级
地图初始显示级别 {number} Mapbox (0-24) 高德 (2-19)
- center 地图中心
地图初始中心经纬度 {Lnglat}
- pitch 地图倾角
地图初始俯仰角度 {number} default 0
- style 地图图样式
简化地图样式设置,内置了三种主题默认样式, 高德,mapbox, maptalks 都可以使用 (dark, light, normal, blank 无底图)
除了内置的样式,也可传入自定义的其他属性
比如高德地图 ⚠️ 高德地图样式 增加 isPublic=true
参数
1 | { |
- minZoom 最小缩放等级
地图最小缩放等级 {number} default 0 Mapbox 0-24) 高德 (2-19)
- maxZoom 最大缩放等级
地图最大缩放等级 {number} default 22 Mapbox(0-24) 高德 (2-19)
- rotateEnable 是否允许旋转
地图是否可旋转 {Boolean} default true
1.2 Layer 方法
addLayer(layer) 增加图层对象
参数 :
layer
{ILayer} 图层对象
1 | scene.addLayer(layer); |
getLayer(id) 获取对应的图层对象
参数 :
id
{string}
1 | scene.getLayer('layerID'); |
getLayers() 获取所有的地图图层
1 | scene.getLayers(); |
getLayerByName(name) 根据图层名称获取图层
参数
name
{string} layer 初始化可配置图层 name
1 | scene.getLayerByName(name); // return Layer 图层对象 |
removeLayer 移除 layer 图层
参数 :
layer
{Layer}
1 | scene.removeLayer(layer); |
removeAllLayer() 移除所有的图层对象
1 | scene.removeAllLayer(); |
1.3 控制组件方法
addControl(ctl) 添加组件控件
参数 :
crl
{ IControl } 用户创建的控件对象
1 | scene.addControl(ctl); |
removeControl(ctr) 移除用户添加的组件控件
参数 :
ctl
{ IControl } 用户创建的控件对象
1 | scene.removeControl(ctl); |
getControlByName(name) 根据控件的名称来获取控件
name
{ string }
1 | const zoomControl = new Zoom({ |
1.4 标记方法
addMarker(maker) 往场景中添加标记对象
参数 :
maker
{ IMarker } Marker 实例
1 | const marker = new Marker({ |
addMarkerLayer(layer) 添加 Marker 统一管理图层
当用户需要添加许多个 Marker 实例时,为了方便管理可以使用 markerLayer 对象统一管理
参数 :
layer
{ IMarkerLayer } 标记图层对象
1 | const markerLayer = new MarkerLayer(); |
removeMarkerLayer(layer) 移除标签图层
参数 :
layer
{ IMarkerLayer } 标记图层对象
1 | scene.removeMarkerLayer(markerLayer); |
removeAllMakers() 移除场景中所有的标签对象
1 | scene.removeAllMakers(); |
1.4 地图方法
getZoom 获取当前缩放等级
1 | scene.getZoom(); // return {float} 当前缩放等级 |
getCenter() 获取地图中心
1 | scene.getCenter(); // return {Lnglat} :地图中心点 |
getSize() 获取地图容器大小
1 | scene.getSize(); // return { Object } 地图容器的 width,height |
getPitch() 获取地图倾角
1 | scene.getPitch(); // return {number} pitch |
getContainer 获取地图容器
1 | scene.getContainer(); // return htmlElement |
setMapStyle 设置地图样式
参数:style
{string} 地图样式 具体样式格式和各底图设置方法一致
内置了三种地图样式,AMAP 和 MapBox, MapTalks 都适用
- light
- dark
- normal
1 | // 快捷名称设置 |
setCenter() 设置地图中心点
参数:center
{LngLat} 地图中心点
1 | scene.setCenter([lng, lat]); |
setZoomAndCenter 设置地图缩放等级和中心点
参数:
- zoom {number}
- center {LngLat}
1 | scene.setZoomAndCenter(zoom, center); |
setRotation 设置地图旋转
设置地图顺时针旋转角度,旋转原点为地图容器中心点,取值范围 [0-360]
参数: rotation
{number}
1 | scene.setRotation(rotation); |
zoomIn 地图放大一级
1 | scene.zoomIn(); |
zoomOut 地图缩小一级
1 | scene.ZoomOUt(); |
panTo 地图平移到指定的位置
参数:
center
LngLat 中心位置坐标
1 | scene.panTo(LngLat); |
panBy 地图平移
以像素为单位沿 X 方向和 Y 方向移动地图
参数:
x
{number} 水平方向移动像素 向右为正方向y
{number} 垂直方向移动像素 向下为正方向
1 | scene.panBy(x, y); |
setPitch 设置地图仰俯角度
1 | scene.setPitch(pitch); |
setMapStatus 设置地图状态
可用来关闭地图的一些交互操作
参数 :
1 | IStatusOptions { |
fitBounds 设置地图缩放范围
地图缩放到某个范围内
参数 :
extent
{ array} 经纬度范围 [[minlng,minlat],[maxlng,maxlat]]
1 | scene.fitBounds([ |
containerToLngLat 画布坐标转经纬度
画布坐标转经纬度坐标
参数 :
- pixel 画布的坐标 [x ,y ] {array }
1 | scene.pixelToLngLat([10,10]); |
lngLatToContainer 经纬度转画布坐标
参数 :
- lnglat 经纬度坐标 [lng,lat ] {array }
1 | scene.lngLatToPixel([120,10]); |
pixelToLngLat 像素坐标转经纬度
像素坐标:不同级别下地图上某点的位置
参数 :
- pixel 画布的坐标 [x ,y ] {array }
1 | scene.pixelToLngLat([10,10]); |
lngLatToPixel 经纬度转像素坐标
经纬度坐标转像素坐标
参数 :
- lnglat 经纬度坐标 [lng,lat ] {array }
1 | scene.lngLatToPixel([120,10]); |
exportMap 导出地图图片
导出地图,目前仅支持导出可视化层,不支持底图导出
- 参数 type
png|jpg
默认 png
1 | scene.exportMap('png'); |
destroy 场景销毁
scene 销毁方法,离开页面,或者不需要使用地图可以调用
1 | scene.destroy(); |
1.5 iconfont 映射支持
addIconFont(name, fontUnicode) 增加对数据中 unicode 的映射支持
支持对用户传入的数据进行 unicode 的映射,在内部维护一组名称和对应 key 的键值对
参数 :
name
{string}fontUnicode
{string}
1 | scene.addIconFont('icon1', ''); |
addIconFonts(options) 同时传入多组 name - unicode 的键值对
参数 :
options
{ Array<[name, unicode]> }
1 | scene.addIconFonts([ |
1.6 全局资源
addImage(id, img) 全局中添加的图片资源
参数 :
id
{string}img
{HTMLImageElement | File | string}
1 | scene.addImage( |
hasImage(id) 判断是否已经在全局添加过相应的图片资源
参数 :
id
{string}
1 | scene.hasImage('imageID'); |
removeImage(id) 全局删除图片资源
参数 :
id
{string}
1 | scene.removeImage('imageID'); |
addFontFace(fontFamily, fontPath) 添加字体文件
参数 :
fontFamily
{string} 用户为自己定义的字体名称fontPath
{string} 导入的文件地址
1 | let fontFamily = 'iconfont'; |
1.7 事件
cci-map 针对不同地图的事件对象进行兼容,访问事件对象的经纬度 调用 getFormatEventObj
方法会返回含有 lng,lat 的经纬度对象
1 | import { getFormatEventObj } from 'cci-map' |
- on 事件监听
eventName
{string} 事件名 handler
{function } 事件回调函数
- off
移除事件监听 eventName
{string} 事件名 handler
{function } 事件回调函数
- loaded
scene 初始化完成事件,scene 初始化完成添加 Layer
1 | scene.on('loaded', () => {}); |
- resize 地图容器变化事件
1 | scene.on('resize', () => {}); // 地图容器大小改变事件 |
- 地图事件
1 | scene.on('loaded', () => {}); //地图加载完成触发 |
其他地图事件可以查看相应底图的事件文档,地图事件也可以通过 CMap.map 进行设置 Mapbox 高德
- 鼠标事件
1 | scene.on('click', (ev) => {}); // 鼠标左键点击事件 |
2 地球模式
Earth 相较于高德地图、mapbox 地图,是完全不同的一种表现形式,提供了全球视角下的可视化展示能力,为用户提供了更多的地理信息可视化表现形式。
✨ 为了区别普通的地图,提供了全新的 Earth 地图类型以及对应的 EarthLayer 图层
2.1 支持的图层类型
点图层
- 平面点
- 圆柱点
线图层
- 3D 弧线
2.2 使用
1 | // 1、引入对应模块 |
2.3 独立的地图类型 Earth
2.3.1 构造函数 Earth(args)
作为 Earth 的基础地图类型,Earth 提供了地球系统的相机系统,目前只需要传入一个空对象。
- args: {}
2.3.2 rotateY(option: { force: boolean; regScale: number})
提供了简单的方法控制地球系统的旋转(实际上控制的是相机的旋转)
- force: false 判断是否强制生效,默认该方法的优先级比用户鼠标操作要低,当用户操作相机的时候,该方法会失效
- regScale: 0.01 旋转的角度(视觉上地球的旋转角度), regScale 表示的并不是实际的旋转角度,而是单位旋转角度的比例
🌟 单位旋转角度 = Math.min(this.earthCameraZoom * this.earthCameraZoom, 1)
2.4 地图图层 EarthLayer
地球图层区别于普通高德地图和 Mapbox 地图的图层,只在地球模式下可以被使用,用于表示地球的球体、大气层、辉光等效果。
🌟 使用不同的 shape 参数表示区别不同的地球图层
2.4.1 地球球体图层 baseLayer
- source(map, parser) map: 地球表面纹理贴图的地址 parser: 解析器,目前只需要写固定的对象值即可 { parser: { type: “image” } }
- shape: ‘base’
🌟 目前支持的 shape 类型有 base、atomSphere、bloomSphere,当用户的 shape 参数不被识别时,自动降级为 base 类型 - globelOtions: style 方法中的参数 ambientRatio: 环境光、diffuseRatio: 漫反射、specularRatio: 高光反射
1 | const earthlayer = new EarthLayer() |
2.4.2 地球内发光/大气图层 atomLayer
atomLayer 作为地球的效果图层,不需要传入数据,所以可以不调用 source 方法
1 | const atomLayer = new EarthLayer() |
2.4.3 地球内外发光/辉光图层 bloomLayer
bloomLayer 作为地球的效果图层,不需要传入数据,所以可以不调用 source 方法
1 | const bloomLayer = new EarthLayer() |
2.5 示例代码
地球模式下使用飞线图层无需做额外的操作
1 | import { CMap, EarthLayer, LineLayer, Earth } from 'cci-map'; |
在地球模式下使用点图层无需做额外的操作
1 | import { CMap, PointLayer, EarthLayer, Earth } from 'cci-map' |
3. 数据
3.1 概述
source 地理数据处理模块,主要包含数据解析(parser),和数据处理(transform)
- data
- option
- cluster boolean 是否聚合
- clusterOption 聚合配置项
- parser 数据解析配置
- transforms 数据处理配置
3.1.1 parser
不同数据类型处理成统一数据格式。矢量数据包括 GeoJON, CSV,Json 等不同数据格式,栅格数据,包括 Raster,Image 数据。将来还会支持瓦片格式数据。
空间数据分矢量数据和栅格数据两大类
- 矢量数据 支持 csv,geojson,json 三种数据类型
- 栅格数据 支持 image,Raster
3.1.2 transform
数据转换,数据统计,网格布局,数据聚合等数据操作。
3.2 API
cluster boolean
可选 可以只设置
clusterOption 可选
- radius 聚合半径 number default 40
- minZoom: 最小聚合缩放等级 number default 0
- maxZoom: 最大聚合缩放等级 number default 16
parser 配置项
- type:
csv|json|geojson|image|raster
- 其他可选配置项,具体和数据格式相关
geojson 数据为默认数据格式,可以 不设置 parser 参数
1 | layer.source(data); |
Source 更新
如果数据发生改变,可以需要更新数据 可以通过调用 layer 的 setData 方法实现数据的更新
1 | layer.setData(data); |
getClustersLeaves(cluster_id)
聚合图使用,获取聚合节点的原始数据
参数: id 聚合节点的 cluster_id
1 | layer.on('click', (e) => { |
getClustersLeaves(cluster_id)
聚合图使用,获取聚合节点的原始数据
参数: id 聚合节点的 cluster_id
1 | layer.on('click', (e) => { |
3.3 transforms
tranforms 处理的是的标准化之后的数据 标准化之后的数据结构包括 coordinates 地理坐标字段,以及其他属性字段。
处理完之后返回的也是标准数据
1 | [ |
目前支持两种热力图使用的数据处理方法 grid,hexagon transform 配置项
- type 数据处理类型
- tansform cfg 数据处理配置项
3.3.1 grid
生成方格网布局,根据数据字段统计,主要在网格热力图中使用
- type: ‘grid’,
- size: 网格半径
- field: 数据统计字段
- method: 聚合方法 count,max,min,sum,mean 5 个统计维度
1 | layer.source(data, { |
3.3.2 hexagon
生成六边形网格布局,根据数据字段统计
- type: ‘hexagon’,
- size: 网格半径
- field: 数据统计字段
- method:聚合方法 count,max,min,sum,mean 5 个统计维度
3.3.3 join
数据连接,业务中跟多情况是地理数据和业务数据分开的两套数据,我们可与通过 join 方法将地理数据和业务数据进行关联。
配置项
- type: join
- sourceField 需要连接的业务数据字段名称
- data 需要连接的数据源 仅支持 json 格式
- targetField 关联的地理数据字段名称
1 | const data = { |
3.4 GeoJSON
GeoJSON 是一种对各种地理数据结构进行编码的格式。GeoJSON 对象可以表示几何、特征或者特征集合。GeoJSON 支持下面几何类型:点、线、面、多点、多线、多面和几何集合。GeoJSON 里的特征包含一个几何对象和其他属性,特征集合表示一系列特征。 The GeoJSON Format。
source 支持 传入 Geometry 集合 FeatureCollection
3.4.1 Feature Collection Object
一个 feature Colletion 由对个 feature 组成
1 | { |
3.4.2 Feature Object
一个 feature 有 geometry 空间信息,properties 属性信息,其中 geometry 是必须字段
1 | { |
3.4.3 Gemetry Object
支持 Gemetry Object 类型
- Point
1 | { |
- MultiPoint
1 | { |
- LineSring
1 | { |
- MultiLineString
1 | { |
- Polygon
1 | { |
- Polygon With holes:
1 | { |
- MultiPolygon
1 | { |
3.4.4 Geojson 相关的 JS 库
- 地理统计分析工具
turfjs: 地理数据计算,处理,统计,分析的 Javascript 库
- 在线工具:
http://geojson.io/ 可以在线查看,绘制,修改 GeoJSON 数据
https://mapshaper.org/ 可以查看较大的 geojson,还能够简化 GeoJSON 数据
GeoJSON 虽然是通用的的地理数据格式,在具体使用场景中,数据服务人员可能并不熟悉 GeoJON,或者没有生成 GeoJON 的工具, 因此对数据定义了 Parser 的概念,你的数据可以是任何格式,使用指定数据对应的地理信息字段即可。
3.5 JSON
GeoJSON 虽然是通用的地理数据格式,在具体使用场景中,数据服务人员可能并不熟悉 GeoJON, 或者没有生成 GeoJON 的工具, 因此 对数据定义了 Parser 的概念,你的数据可以是任何格式,使用指定数据对应的地理信息字段即可。
⚠️ json 不是标准的地理数据结构,因此在使用时务必要设置 Parser。Parser 支持两种解析方式
3.5.1 简易解析方式
该方式只支持解析的点数据,或者只有两个点的线段,或者弧线数据
- type
string
必选json
- x
string
点数据表示 经度 - y
string
点数据表示 纬度 - x1
string
经度 - x2
string
纬度
如果数据是点数据,只需要设置 x,y 字段即可
如果是线段,弧线数据,需要知道起止点坐标既,x,y,x1,y1
1 | layer.source(data, { |
3.5.2 通用解析方式
可也解析任意复杂的点,线面
- type
string
必选json
- coordinates
array
必选,主要用于表达比较复杂的格式,等同于 geojson coordinates 属性
1 | layer.source(data, { |
3.5.3 点数据实例
简易解析
- type json
- x: 经度字段
- y: 纬度字段
1 | const data = [ |
通用解析
1 | const data = [ |
3.5.4 线数据示例
简易解析
- type: json
- x
string
经度 - y
string
纬度 - x1
string
经度 - x2
string
纬度
简易解析只支持两个点组成的线段,主要再绘制弧线的时候比较常用,只需指定线段的起止点坐标
1 | const data = [ |
通用解析
绘制线段、弧线也支持使用 coordinates 组织数据
coordinates 包含两个坐标, 第一个坐标 对应 x, y 第二个坐标 对应 x1, y1
1 | const data = [ |
如果需要使用绘制轨迹数据,需要通过 coodinates 指定线的点序列。
coordinate 格式 geojson 的 coordinate 字段 支持 LineString, MultiLineString
1 | const data = { |
使用时通过 coordinates 指定
1 | layer.source(data, { |
3.5.5 面数据示例
面数据 coordinates 字段比较复杂不支持简易的解析方式
通用解析
需要指定 coordinates 字段, 格式同 GeoJSON 的 coordinates 字段
注意面数据 coord 是三层数据结构
1 | [ |
3.6 CSV
支持 CSV 以逗号分隔的 CSV 数据加载。
CSV 是文本数据结构,很难表达复杂的地理数据结构,因此 CSV 仅支持两种数据结构
- 点数据 需要指定经度,纬度坐标
- 线段,弧线数据 需要指定 起止点的 经度,纬度坐标
3.6.1 parser
- type string 必选 json
- x string 点数据表示 经度
- y string 点数据表示 纬度
- x1 string 经度
- x2 string 纬度
点数据通过 CSV 加载
1 | // layer.source(data, { |
线段弧线数据通过 CSV 加载
1 | // layer.source(data, { |
3.7 Image
Image 数据主要用于在地图根据经纬度范围添加图图片,比如一幅纸制地图扫描版你要放在地图显示。
3.7.1 parser
- type: image
- extent: 图像的经纬度范围 [minlng, minlat,maxLng, maxLat]
根据图片的经纬度范围,将图片添加到地图上。
1 | layer.source( |
3.8 栅格
Raster 图层主要实现栅格数据的可视化,栅格数据主要来源是卫星遥感数据,如数字高程图,植被分布图,夜光图。
3.8.1 parser
- type: raster
- extent: 栅格的经纬度范围 [minlng, minlat,maxLng, maxLat]
- width 数据宽度
- height 数据高度
根据图片的经纬度范围,将图片添加到地图上。
1 | layer.source( |
4 组件
4.1 Control 控件
地图组件用于控制地图的状态如果平移,缩放,或者展示地图一些的辅助信息如图例、比例尺。
目前支持 Control
- Zoom 放大缩小
- Scale 比例尺
- Layers 图层列表
4.1.1 构造函数 option
position: string
控件位置支持 8 个方位
- bottomright
- topright
- bottomleft
- topleft
- topcenter
- bottomcenter
- leftcenter
- rightcenter
4.1.2 Zoom 组件
放大缩小组件 默认左上角
1 | import { Zoom } from 'cci-map'; |
4.1.3 Scale 组件
比例尺组件 默认左下角
1 | import { Scale } from 'cci-map'; |
4.1.4 Layers
图层列表目前支持可视化的图层控制
option 控件配置项 overlayers 将一组图层添加到图层列表, overlayers Object key: 列表显示的图层名字可以自定义 layer: 图层对象
1 | import { Layers } from 'cci-map' |
4.2 Popup 信息框
地图标注信息窗口,用于展示地图要素的属性信息
4.2.1 构造函数 option
- closeButton 是否显示关闭按钮,布尔值,默认为 true。
- closeButtonOffsets 显示关闭按钮时生效,[number, number],默认为 [0, 0],以右上角为起始点。
- closeOnClick 是否在点击地图的时候关闭弹框,布尔值,默认为 true
- maxWidth 弹框最宽值,默认为 240px
- anchor 弹框锚点,默认值为 bottom,可选值有 center、top、top-left、left、bottom-left、bottom、bottom-right、right、top-right
4.2.2 方法
- setLnglat 设置 popup 的经纬度位置
参数:lnglat 支持数组
1 | [112, 32]; |
经纬度对象
1 | const lnglat = { |
- setHTML 设置 popup html 内容
参数:html 字符串
1 | var html = `<p>省份 |
- setDOMContent
参数:htmlNode dom 对象 区别于 setHtml 对象只能传字符串
- setText
设置 popup 显示文本内容
1 | popup.setText('hello world'); |
- setMaxWidth
设置 popup 最大宽度
1 | popup.setMaxWidth('300px'); |
- open
显示 popup
1 | popup.open(); |
- close
关闭 popup
1 | popup.close(); |
- remove
移除 popup
1 | popup.remove(); |
4.2.3 事件
- open
1 | popup.on('open', () => {}); |
- close
1 | popup.on('close', () => {}); |
4.2.4 示例代码
添加 popup
1 | import { CMap, Popup, Mapbox } from 'cci-map' |
通过组件实例化 popup
1 | import Vue from 'vue' |
4.3 Marker 标注
Marker 地图标注 目前只支持 2D Dom 标注
1 | const Marker = new CciMap.Marker(option) |
4.3.1 构造函数 option
- color
string
设置默认 marker 的颜色
- element
Dom|string
自定义 marker Dom 节点,可以是 dom 实例,也可以是 dom id - anchor
string
锚点位置 支持 center, top, top-left, top-right, bottom, bottom-left,bottom-right,left, right - offsets
Array
偏移量 [ 0, 0 ] 分别表示 X, Y 的偏移量 - extData 用户自定义属性,支持任意数据类型,存储 marker 属性信息
4.3.2 方法
- setLnglat
设置 marker 经纬度位置
- remove
移除 marker
- getElement
获取 marker dom Element
- setElement 设置 element 通过此方法更新 Marker 样式
参数:element dom
- getLngLat
获取 marker 经纬度坐标
- togglePopup
开启或者关闭 marker 弹出框
- openPopup
打开 Popup
- closePopup
关闭 popup
- setPopup
为 marker 设置 popup
- getPopup
获取 marker 弹出框
- getExtData
获取用户自定义数据
- setExtData(data)
设置用户自定义数据
4.3.3 事件
鼠标事件
- mousemove
- click
- mousedown
- mouseup
- dblclick
- contextmenu
- mouseover
- mouseout
事件返回数据
- target 事件触发源
- data extData 用户自定义数据
- lnglat marker 经纬度
1 | marker.on('click', (e) => {}); |
4.3.4 示例代码
默认 Marker
1 | const marker = new CciMap.Marker({color:'blue'}) |
自定义 Marker
1 | var el = document.createElement('label'); |
设置 popup
1 | var popup = new CciMap.Popup({ |
4.4 Marker 图层
MarkerLayer 是 Marker 的升级版,Marker 是独立的地图标注,MarkerLayer 则是统一管理大量的 Marker 数据。
技术差异
- Marker Dom 绘制一个地图元素
- MarkerLayer 统一管理多个 DomMarker
- PointLayer 通过 WebGL 绘制元素。
功能差异
- MarkerLayer 元素的自定义性比较强,任何 HTML+ CSS 的组合都可以绘制在地图上。
- PointLayer 自定义性比较弱,实现成本比较高,优势可以绘制大量的数据,性能比较好。
1 | import { Marker, MarkerLayer } from 'cci-map'; |
4.4.1 构造函数 option
- cluster 聚合
boolean
默认false
- clusterOption 聚合配置
- field
string
聚合统计字段 - method
sum| max| min| mean
- element
function
通过回调函数设置聚合 Marker 的样式,返回 dom 元素 回调函数包含以下参数 - point_count 默认 聚合元素个数
- clusterData
Array
聚合节点的原始数据 - point_sum 聚合求和 根据 field 和 method 计算
- point_max 聚合最大值 根据 field 和 method 计算
- point_min 聚合最小值 根据 field 和 method 计算
- point_mean 聚合平均值 根据 field 和 method 计算
- field
4.4.2 方法
- addMarker
参数: marker IMarker
需要添加的 Marker
1 | // 通过 Marker 对象实例化一个 Marker |
为 Marker 添加属性信息, 如果聚合参数设置统计配置项 field| method
需要为 Marker 添加属性信息。通过 Marker 的 extData 配置项设置 Marker 属性信息
1 | const marker = new Marker({ |
- removeMarker
从 MarkerLayer 移除 Marker
- getMarkers
获取 MarkerLayer 中的所有 Marker
- clear
清除掉所有的 Marker
4.4.3 CMap 类方法
- addMarkerLayer
添加 MarkerLayer
1 | scene.addMarkerLayer(layer); |
- removeMarkerLayer
移除 MarkerLayer
1 | scene.removeMarkerLayer(layer); |
4.4.4 示例
markerLayer
1 | import { CMap, Marker, MarkerLayer, GaodeMap } from 'cci-map'; |
markerLayer 聚合
1 | import { CMap, Marker, MarkerLayer, GaodeMap } from 'cci-map'; |
5 图层
5.1 图层基类
Layer 接口设计遵循图形语法,所有图层都继承于该基类。
语法示例
1 | const layer = new Layer(option) |
5.1.1 构造函数配置项
- name
string optional default: 自动数字编号
设置图层名称,可根据 name 获取 layer;
- visible
图层是否可见 {bool } default true
- zIndex
图层绘制顺序,数值大绘制在上层,可以控制图层绘制的上下层级 {int} default 0
- minZoom
图层显示最小缩放等级,(0-18) {number} Mapbox (0-24) 高德 (2-19)
- maxZoom
图层显示最大缩放等级 (0-18) {number} Mapbox (0-24) 高德 (2-19)
- autoFit
layer 初始化完成之后,是否自动缩放到图层范围 {bool } default false
- pickingBuffer
图层拾取缓存机制,如 1px 宽度的线鼠标很难拾取(点击)到, 通过设置该参数可扩大拾取的范围 {number} default 0
- blend
图层元素混合效果 (normal 正常效果 默认, additive 叠加模式 subtractive 相减模式 max 最大值)
5.1.2 方法
5.1.2.1 数据方法
source
数据源为 layer 设置数据 source(data,config)
参数
-data {geojson|json|csv} 源数据
- config 可选 数据源配置项
- parser 数据解析,默认是解析层 geojson
- transforms [transform,transform ] 数据处理转换 可设置多个
parser 和 transforms 参见数据配置
1 | layer.source(data, { |
scale
设置数据字段映射方法
field
字段名。scaleConfig
列定义配置,对象类型,可配置的属性如下:
连续型
- linear 线性
- log
- pow 指数型
连续分类型
- quantile 等分位
- quantize 等间距
枚举型
- cat 枚举
1 | layer.scale('name', { |
5.1.2.2 视觉编码方法
可视化编码是将数据转换为可视形式的过程,目前支持形状(shape),大小(size),颜色(color) 3 种视觉通道,你可以指定数据字段,为不同要素设置不同的图形属性。
size
将数据值映射到图形的大小上的方法,具体 size 的表示具体意义可以查看对应图层的文档
1 | pointLayer.size(10); // 常量 |
- size(value)
传入数字常量,如 pointLayer.size(20)
- size(field)
根据 field 字段的值映射大小,使用默认的最大值 max:10
和最小值 min: 1
。
- size(field, callback)
使用回调函数控制图形大小。
参数:callback
: function 回调函数。
1 | pointLayer.size('age', (value) => { |
color
将数据值映射到图形的颜色上的方法。
1 | layer.color('red'); // 常量颜色 |
- color(value)
参数:value
:string 只支持接收一个参数
value 可以是:映射至颜色属性的数据源字段名,如果数据源中不存在这个字段名的话,则按照常量进行解析,这时会使用默认提供的颜色; 也可直接指定某一个具体的颜色值 color,如 ‘#fff’, ‘white’,’rgba(255,0,0,0.5)’ ,rgb(255,0,1) 等
1 | layer.color('name'); // 映射数据字段 |
- color(field, colors)
参数:field
: stringfield 为映射至颜色属性的数据源字段名,也支持指定多个参数。colors
: string | array | function
colors 的参数有以下情况: 如果为空,即未指定颜色的数组,那么使用内置的全局的颜色;如果需要指定颜色,则需要以数组格式传入,那么分类的颜色按照数组中的颜色确定。
1 | layer.color('name'); // 使用默认的颜色 |
colors 如果是回调函数,则该回调函数的参数为对应字段的数值,具体使用如下,当 color 映射为多个字段时,参数按照字段声明的顺序传入:
1 | layer.color('gender', (value) => { |
shape
将数据值映射到图形的形状上的方法。
- shape(shape)
参数shape
string
只支持接收一个参数,指定几何图像对象绘制的形状。下表列出了不同的 图层 几何图形对象支持的 shape 形状
layer 类型 | shape 类型 | 备注 |
---|---|---|
point | 2d:point,circle, square, triangle,hexagon,image,text 3d:circle,triangle,hexagon,square | |
line | line,arc, arc3d, greatcircle | |
polygon | fill,line, extrude |
shape(field, shapes)
shape(field, callback)
style
全局设置图形显示属性
- opacity 设置透明度
- stroke 线填充颜色 仅点图层支持
- offsets 偏移量 [number, number] x 和 y 方向偏移 仅支持 pointLayer
- strokeWidth 线的宽度 仅点图层支持
1 | layer.style({ |
5.1.2.3 通用样式数据纹理映射
从 L7 2.5 开始,各图层样式将逐步支持样式数据映射
layer 类型 | 支持的样式字段 | 备注 |
---|---|---|
point/fill | opacity、strokeOpacity、strokeWidth、stroke、offsets | shape circle、triangle… |
point/image | opacity、offsets | offsets 经纬度偏移 |
point/normal | opacity、offsets | |
point/text | opacity、strokeWidth、stroke、textOffset | textOffset 相对文字画布位置的偏移 |
point/extrude | opacity | |
polygon/fill | opacity | |
polygon/extrude | opacity | |
line/line | opacity | |
line/arc | opacity | |
line/arc3d | opacity | |
line/great_circle | opacity |
1 | import { CMap, PointLayer, GaodeMap } from 'cci-map'; |
5.1.2.4 线图层纹理方法
目前在线图层上单独加上了纹理方法的支持
为图层绑定纹理
1 | // 首先在全局加载图片资源 |
5.1.2.5 图层更新方法
如果已经添加了图层,需要修改图层显示样式可以再次调用图形映射方法,然后调用 scene.render()
更新渲染即可
1 | layer.color('blue'); |
setData
更新 Source 数据
参数:
- data 数据
- option 默认和初始配置项一致,如果数据格式相同可不设置
调用 setData 方法会自动更新图层渲染
1 | layer.setData(data); |
setBlend(type)
设置图层叠加方法 参数:
- type blend 类型
5.1.2.6 图层控制方法
show
图层显示
1 | layer.show(); |
hide
图层隐藏
1 | layer.hide(); |
isVisible
图层是否可见
return true | false
setIndex
设置图层绘制顺序
fitBounds
缩放到图层范围
1 | layer.fitBounds(); |
setMinZoom
设置图层最小缩放等级
参数
- zoom {number}
1 | layer.setMinZoom(zoom); |
setMaxZoom
设置图层最大缩放等级
参数
- zoom {number}
1 | layer.setMaxZoom(zoom) |
5.1.2.7 图层交互方法
active
开启或者关闭 mousehover 元素高亮效果
参数: activeOption | boolean
activeOption -color 填充颜色
1 | // 开启 Active 使用默认高亮颜色 |
setActive
根据元素 ID 设置指定元素 hover 高亮
1 | layer.setActive(id); |
select
开启或者关闭 mouseclick 元素选中高亮效果
参数: selectOption | boolean
selectOption -color 填充颜色
1 | // 开启 Active 使用默认高亮颜色 |
setSelect
根据元素 ID 设置指定元素 click 选中 高亮
1 | layer.setSelect(id); |
5.1.2.8 图层框选
boxSelect
参数 option
- box [x1: number, y1: number, x2: number, y2: number] 相较于
- cb (…args: any[]) => void 传入的回调方法,返回框选内部的 feature
1 | layer.boxSelect(box, cb); |
5.1.3 事件
鼠标事件回调参数 target
- x: number 鼠标 在地图位置 x 坐标
- y: number 鼠标 在地图位置 y 坐标
- type: string 鼠标事件类型
- lngLat: 经度度对象 {lng:number, lat: number }; 鼠标所在位置经纬度
- feature: any; 数据选中的地理要素信息
- featureId: number | null; 数据选中的地理要素的 ID
click
点击事件
mousemove
鼠标移动事件
mouseout
鼠标移除
mouseup
鼠标按下
mousedown
鼠标向下
contextmenu
鼠标右键
unclick
点击未拾取到元素
unmousemove
鼠标移动未拾取到元素
unmouseup
鼠标抬起未拾取到元素
unmousedown
鼠标按下未拾取到元素
uncontextmenu
鼠标右键位拾取到元素
unpick
所有鼠标事件未拾取到
1 | layer.on('click', (ev) => {}); // 鼠标左键点击图层事件 |
inited 图层事件
参数 option
- target 当前 layer
- type 事件类型
图层初始化完成后触发
1 | layer.on('inited', (option) => {}); |
add 图层事件
图层添加到 scene
参数 option
- target 当前 layer
- type 事件类型
remove 图层事件
图层移除时触发
参数 option
target 当前 layer
type 事件类
5.2 点图层
5.2.1 PointLayer 介绍
点数据的展示,数据源支持 JSON,GeoJSON,CSV 三种数据格式。
shape 支持
- 3D 类型 柱图
1 | 'cylinder', 'triangleColumn', 'hexagonColumn', 'squareColumn' |
- 2D 符号图**
1 | 'circle', 'square', 'hexagon', 'triangle', 'pentagon', 'octogon', 'hexagram','rhombus', 'vesica' |
基本图形代码示例
1 | import { PointLayer } from 'cci-map'; |
5.2.2 气泡图
5.2.2.1 基础使用
气泡图通过 PointLayer 对象实例化,
1 | import { PointLayer } from 'cci-map'; |
5.2.2.2 shape
通常气泡图 shape 设置为 circle
5.2.2.3 size
气泡图大小,需要指定数据映射字段
1 | const bubble = new PointLayer() |
5.2.2.4 animate
气泡图支持水波动画效果
1 | // 开启关闭动画 |
5.2.2.5 水波配置项
- speed 水波速度
- rings 水波环数
5.2.2.6 tips
目前 style 的配置项只支持全局设置,不支持数据映射。
如果 opacity 设置为 0.3 则所有的气泡都是 0.3
style 方法如果没有设置 stroke, 默认于气泡的填充色相同
5.2.3 散点图
在地理区域上放置相等大小的圆点,用来表示地域上的空间布局或数据分布。
5.2.3.1 使用
散点图通过 PointLayer 对象实例化
5.2.3.2 shape
- circle
- square
- hexagon
- triangle
- pentagon
- octogon
- hexagram
- rhombus
- vesica
散点图 shape 一般设置成常量
5.2.3.3 color
color 可以根据数据的差异设置成不同颜色,表示数据的不同分类。
5.2.3.4 size
散点图一般等大小的图形, size 一般设置成常量
1 | const scatter = new PointLayer() |
5.2.4 亮度图
亮度图又称点密度图,单位面积的内点的个数越多,亮度会越亮,亮度图一般用来表达海量点数据分布情况
5.2.4.1 shape
- dot 如果需要使用亮度图可以将 shape 设置为 dot,或者不设置 shape
5.2.4.2 color
- 无权重 如果数据没有权重可以将颜色设置为常量,渲染时会自动进行颜色叠加,点越多颜色越亮
- 有权重 如果数据有权重可以设置一组同一色相,不同亮度的色带,值越大亮度会越亮。
1 | const pointLayer = new PointLayer() |
5.2.5 符号图
在地理区域上放置不同图片作为符号,通常表示不同地理要素分布情况
5.2.5.1 使用
符号图 通过 PointLayer 对象实例化,将 shape 设置成图片符号
5.2.5.2 shape
通过 scene addImage 方法
addImage() 参数:
- id 图片的 id,
- url 图片的 url
1 | scene.addImage( |
⚠️ 符号图的 ID 不能与点图层已有 shape 名称相同,比如不能设置 circle
符号图需要把 shape 设置成图片的 id,同样符号图 shape 也支持数据映射
1 | const scatter = new PointLayer() |
5.2.6 文本标注
为图层添加文本标注
5.2.6.1 使用
地图标注需要添加一个新的图层的实现
5.2.6.2 shape
- field 标注的字段名称
- shapeType ‘text’
1 | layer.shape('name', 'text'); |
5.2.6.3 style
- opacity
number
- textAnchor
string
文本相对锚点的位置'right' | 'top-right' | 'left' | 'bottom-right' | 'left' | 'top-left' | 'bottom-left' | 'bottom' | 'bottom-right' | 'bottom-left' | 'top' | 'top-right' | 'top-left' | 'center';
- padding:
number
文本包围盒 padding [水平,垂直],影响碰撞检测结果,避免相邻文本靠的太近 - spacing: number 文本间隔
- stroke:
string
; 描边颜色 - strokeWidth
number
描边宽度 - strokeOpacity
number
描边透明度 - fontWeight
string
字体粗细 - fontFamily
string
字号 - textOffset
[number, number]
文本偏移量 - textAllowOverlap:
boolean
是否允许文字遮盖
5.2.7 聚合图
5.2.7.1 使用
目前只有点数据支持聚类方法
数据聚合主要从数据层数据,因此需要在 Source 方法配置 cluster 参数
5.2.7.2 Source
参见数据 source 部分
5.2.7.3 配置项
- cluster boolean 是否聚合
- clusterOption 聚合配置项
- radius 聚合半径 number default 40
- minZoom: 最小聚合缩放等级 number default 0
- maxZoom: 最大聚合缩放等级 number default 16
数据聚合之后,数据会增加 pointcount 属性,在可视化渲染时可以根据 pointcount 进行数据映射。
5.2.7.4 方法
- getClusters(zoom: number)
获取指定缩放等级的聚合数据
参数:zoom 缩放等级
- getClustersLeaves(id: string)
根据 id 获取聚合节点的数据,每个聚合节点会有一个唯一 ID
参数:id 聚合数据 id
1 | layer.source(pointsData, { |
- getClustersLeaves
获取聚合节点的原始数据
1 | const source = layer.getSource(); |
5.2.7.5 tips
PointLayer 的聚合图采用 WebGL 绘制,不支持自定义具体聚合样式,如果有自定义的需求可以使用 MarkerLayer 的聚合功能,你可以通过 Dom 完全自定义样式
5.2.8 3D 柱状图
3D 柱图地理区域上方会显示不同高度的柱体,主题的高度与其在数据集中的数值会成正比。
5.2.8.1 使用
3D 柱图通过 PointLayer 对象实例化,将 shape 设置成不同的 3Dshape
5.2.8.2 shape
3D Shape 支持
- cylinder
- triangleColumn
- hexagonColumn
- squareColumn
5.2.8.3 size
3D 柱图 size 需要设置三个维度 [w, l, z]
- w 宽
- l 长
- z 高度
size 设置成常量
1 | layer.size([2,2,3]) |
size 回调函数设置
1 | layer.size('unit_price', h => { |
5.3 线图层
5.3.1 LineLayer
5.3.1.1 shape
线图层支持 4 种 shape
- line 绘制路径图,
- arc 绘制弧线 通过贝塞尔曲线算法技术弧线
- greatcircle 大圆航线,地图两个点的最近距离不是两个点连线,而是大圆航线
- arc3d 3d 弧线地图 3D 视角
⚠️ 弧线只需要设置起止点坐标即可
1 | new LineLayer() |
如果 geojson 数据绘制弧线图 coordinates 第一对坐标为起点,第二对为终点
1 | { |
5.3.1.2 size
线图层 可以设置高度
- size 类型为 number 则表示 line 的宽度
- size 类型为 [number , number] 分别表示宽度和高度
1 | lineLayer.size(1); // 线的宽度为 1 |
5.3.1.3 设置渐变色
线图层通过在 style 中设置起始颜色和终点颜色来设置颜色渐变,渐变色的优先级比 color 方法设置的颜色更高
1 | const layer = new LineLayer({}) |
5.3.1.4 animate
开启关闭动画
1 | layer.animate(true); |
设置动画参数
- duration 动画时间 单位(s)秒
- interval 轨迹间隔, 取值区间 0 - 1
- trailLength 轨迹长度 取值区间 0 - 1
1 | layer.animate({ |
参数动画介绍
目前动画参数为相对单位,我们默认一条线段的长度为 1
如果 interval = 0.2,则一条轨迹将会分成 5 段,如果 interval = 0.5 则为两段。
1 | const layer = new LineLayer({}) |
5.3.2 弧线图
5.3.2.1 数据
绘制弧线只需提供起止点坐标即可(起止点调换位置,弧线的形状会对称相反,飞线动画的方向也会相反)
1 | source(data, { |
5.3.2.2 shape
弧线支持三种弧线算法
- arc 绘制弧线 通过贝塞尔曲线算法技术弧线
- greatcircle 大圆航线,地图两个点的最近距离不是两个点连线,而是大圆航线
- arc3d 3d 弧线地图 3D 视角
5.3.2.3 animate
参见线图层通用 animate 设置
5.3.2.4 示例代码
弧线地图
1 | import { CMap, LineLayer, Mapbox } from 'cci-map'; |
5.3.3 路径图
5.3.3.1 shape
shape 设置成 line 即可绘制路线图
- line
5.3.3.2 size
路径图线的 size 支持两个维度
- width 宽度
- height 高度
1 | layer.size([2, 10]); // 绘制宽度为2,高度为10的路径 |
5.4 面图层
5.4.1 PolygonLayer
绘制 2D 多边形以及沿 Z 轴拉伸后的 3D 图形。
5.4.1.1 使用
1 | import { PolygonLayer } from 'cci-map'; |
5.4.1.2 shape
填充图支持 3 种 shape
- fill 绘制填充面 不支持数据映射
- line 绘制填充图描边 不支持数据映射
- extrude 对填充图 3D 拉伸 不支持数据映射
1 | PolyonLayer.shape('fill'); |
5.4.2 3D填充图
5.4.2.1 使用
1 | import { PolygonLayer } from 'cci-map'; |
5.4.2.2 shape
3D Polygon 将多边形沿 Z 轴向上拉伸
- extrude 常量不支持数据映射
1 | layer.shape('extrude'); |
5.4.2.3 size
size 代表拉伸的高度,支持数据映射
1 | layer.size(10); // 高度设置成常量 |
5.4.3 填充图
5.4.3.1 使用
1 | import { PolygonLayer } from 'cci-map'; |
5.4.3.2 shape
绘制填充图,shape 为fill
常量不支持数据映射
1 | layer.shape('fill'); |
5.4.3.3 size
填充图无 size 不需要设置 size
5.5 城市建筑
5.5.1 使用
1 | import { CityBuildingLayer } from 'cci-map'; |
5.5.2 style
- baseColor 楼房颜色,
- windowColor: 窗户颜色,
- brightColor: 点亮窗户颜色
其他 style 配置项同图层基类 style 配置
5.5.3 animate
开启动画效果
1 | layer.animate(true); |
自定义动画频率需 关闭默认动画,通过 setLight 方法不断更新时间
1 | layer.animate(false); |
- setLight(time)
参数 time : 时间 毫秒
5.5.4 完整代码
1 | const pointLayer = new CityBuildingLayer(); |
5.6 图片图层
将图片添加到地图上,需要指定图片的经纬度范围
5.6.1 使用
1 | import { ImageLayer } from 'cci-map'; |
5.6.2 代码示例
1 | const layer = new ImageLayer({}); |
5.7 栅格图层
Raster 图层主要实现栅格数据的可视化,栅格数据主要来源是卫星遥感数据,如数字高程图,植被分布图,夜光图。
外部需要提前对栅格数据格式 如 tiff 进行解析,好做为 Source 传入。
5.7.1 使用
1 | import { RasterLayer } from 'cci-map' |
5.7.2 source
参见数据 source 的 raster 部分
5.7.3 shape
raster
5.7.4 size
无
5.7.5 color
无
5.7.6 style
clampLow Boolean 默认 false, 设置为 true,低于 domain 的数据将不显示
clampHigh Boolean 默认 false, 设置为 true,高于 domain 的数据将不显示
opacity: 0.8 Number 透明度
domain: [ 0, 8000 ] 数据映射区间
noDataValue Number noDataValue 不会显示
rampColors: { colors: [ ‘#FF4818’, ‘#F7B74A’, ‘#FFF598’, ‘#91EABC’, ‘#2EA9A1’, ‘#206C7C’ ], positions: [ 0, 0.2, 0.4, 0.6, 0.8, 1.0 ] } // 色带
⚠️ color, position 的长度要相同
5.8 热力图
5.8.1 经典热力图
5.8.1.1 使用
1 | import { HeatmapLayer } from 'cci-map'; |
5.8.1.2 shape
常量 heatmap
1 | layer.shape('heatmap'); |
5.8.1.3 size
- field: 热力图权重字段
- values: 数据映射区间 热力图显示 [0, 1] 效果最佳
1 | layer.size('weight', [0, 1]); |
5.8.1.4 color
heatmap 需要设置 color 方法,样式通过 style 设置
5.8.1.5 style
intensity 全局热力权重 推荐权重范围 1-5
radius 热力半径,单位像素
rampColors 色带参数
- colors 颜色数组
- positions 数据区间
⚠️ color, position 的长度要相同
5.8.1.6 完整代码
1 | heatmapLayer() |
5.8.2 网格热力图
将一组点数据按照等大小的正方形网格进行聚合,一个正方形网格代表网格内所有点的统计值。方格热力图特点以方格网布局。
5.8.2.1 使用
1 | import { HeatmapLayer } from 'cci-map'; |
5.8.2.2 source
网格数据只支持点数据作为数据源,数据格式支持 csv、json、geojson.
5.8.2.3 设置网格聚合参数
布局方法 通过 source 的 tansforms 属性配置
- type 数据聚合类型 grid
- size 网格半径 单位 米
- field 聚合字段
- method 聚合方法 count,max,min,sum,mean 5 个统计维度
1 | layer.source(data, { |
5.8.2.4 shape
网格热力图虽然是以标准四边形网格进行数据聚合,但是展示效果上可以设置为其形状,形状只支持常量
2d
- circle,
- triangle
- square
- heaxgon
1 | layer.shape('circle'); |
3d
- cylinder
- triangleColumn
- hexagonColumn
- squareColumn,
1 | layer.shape('cylinder'); |
5.8.2.5 size
- 2D shape
不需要设置 size 方法
- 3D 图形
size 表示高度, 支持常量和数据映射
1 | layer.size(10); // 常量 |
5.8.2.6 color
同图层基类 color 方法
5.8.2.7 style
- coverage 网格覆盖度 0 - 1
- angle 网格旋转角度 0 - 360
- opacity 透明度 0 - 1.0
1 | layer.style({ |
5.8.2.8 完整实例代码
1 | const layer = new HeatmapLayer({}) |
5.8.3 蜂窝热力图
将一组点数据按照等大小的六边形网格进行聚合,一个六边形网格代表网格内所有点的统计值。蜂窝热力图特点以六边形热力图网格布局
5.8.3.1 使用
1 | import { HeatmapLayer } from 'cci-map'; |
5.8.3.2 source
网格数据只支持点数据作为数据源,数据格式支持 csv、json、geojson.
5.8.3.3 设置网格聚合参数
布局方法 通过 source 的 tansforms 属性配置
- type 数据聚合类型 hexagon
- size 网格半径 单位 米
- field 聚合字段
- method 聚合方法 count,max,min,sum,mean 5 个统计维度
1 | layer.source(data, { |
5.8.3.4 shape
网格热力图虽然是以标准四边形网格进行数据聚合,但是展示效果上可以设置为其形状,形状只支持常量
2d
- circle,
- triangle
- square
- heaxgon
1 | layer.shape('circle'); |
3d
- cylinder
- triangleColumn
- hexagonColumn
- squareColumn,
1 | layer.shape('cylinder'); |
5.8.3.5 size
- 2D shape
不需要设置 size 方法
- 3D 图形
size 表示高度, 支持常量和数据映射
1 | layer.size(10); // 常量 |
5.8.3.6 color
同图层基类 color 方法
5.8.3.7 style
- coverage 网格覆盖度 0 - 1
- angle 网格旋转角度 0 - 360
- opacity 透明度 0 - 1.0
1 | layer.style({ |
5.8.3.8 完整代码
1 | const layer = new HeatmapLayer({ |
6 第三方引擎接入
支持允许用户接入第三方的渲染引擎对地图场景进行开发,threejs 作为当前最广泛使用的通用 3D 渲染引擎,将其集成后可以满足用户自定义开发的需求。
目前 Three 模块为了抹平不同地图底图之间的差异,提供了一些兼容方法,如 setMeshScale 方法,通过这些方法用户可以在不同的底图 环境中使用同一套代码。
目前提供的适配方法只负责 threejs 世界坐标到不同地图底图坐标的转化、 gl 上下文的共享以及渲染帧的同步,其余关于 3D 场景内容的搭建 与普通 threejs 应用的开发没有任何区别。
本身并没有集成 threejs,所以用于在使用 Three 模块的时候需要独立安装 threejs。
✨ 目前官方提供的 threejs 兼容是根据 0.115.0 版本进行开发的,使用其他版本 threejs 可能会存在兼容问题
1 | // 1、引入对应模块 |
cci-map 将 threejs 的引用封装成一个特殊的图层对象,在使用上与其他的图层相同。
6.1 构造函数 new ThreeLayer
onAddMeshes
该方法接受两个参数 threeScene: THREE.Scene, layer: ThreeLayer
- threeScene: 这是普通的 threejs 场景对象
- layer: 提供的 threeLayer 对象,上面挂载了 threejs 空间适配到地图空间所需要的方法
6.2 ThreeLayer
用户新建的图层对象,同时也会在 onAddMesh 方法的第二个参数返回。
以下是挂载在 ThreeLayer 实例上的适配方法。
getModelMatrix(lnglat, altitude, rotation, scale): Matrix
- lnglat: [number, number] 经纬度
- altitude: number = 0 相对高度
- rotation: [number, number, number] = [0, 0, 0] 旋转角度
- scale: [number, number, number] = [1, 1, 1] 缩放比例
用户可以通过该方法计算在对应经纬度点位、相对高度、旋转角度和缩放的模型矩阵 该方法的返回值是 THREE.Matrix4 类型的矩阵
applyObjectLngLat(object, lnglat, altibute): void
- object: Object3D threejs 对象
- lnglat: ILngLat[number, number] 经纬度
- altitude = 0 相对高度
用户可以通过该方法将 object 对象从当前位置向指定位置移动(地图经纬度坐标)
setObjectLngLat(object, lnglat, altibute): void
- object: Object3D threejs 对象
- lnglat: ILngLat[number, number] 经纬度
- altitude = 0 相对高度
用户可以通过该方法设置 object 对象的位置(地图经纬度坐标)
lnglatToCoord(lnglat): [number, number]
- lnglat: ILngLat[number, number] 经纬度
用户可以通过该方法将经纬度坐标转化成 threejs 世界坐标
adjustMeshToMap(object): void
- object: Object3D threejs 对象
用户在添加 threejs 对象的前可以通过该方法调整 3D 对象的姿态,保证添加对象能正确显示
✨ 在 threejs 世界坐标中,默认的上方向为 Y 轴正方向,而在地图坐标中,默认的上方向为 Z 轴正方向
✨ 用户不一定使用该方法调整物体的姿态,也可以自己实现
setMeshScale(object, x, y, z): void
- object: Object3D threejs 对象
- x: number = 1 x 轴方向的缩放比例
- y: number = 1 y 轴方向的缩放比例
- z: number = 1 z 轴方向的缩放比例
用户可以通过该方法设置 threejs 对象缩放
✨ 其实通过设置 threejs 对象的 scale 属性一样能达到同样的效果,但是由于 mapbox 在计算模型矩阵的时候引入了特殊计算,所以无法直接设置 scale 属性进行缩放
✨ 同样的,可以直接修改 threejs 的 position、rotation 等调整 3D 对象的姿态
addAnimateMixer(mixer): void
- mixer: AnimationMixer threejs 的动画混合器
用户通过该方法管理加载模型的动画
getRenderCamera(): THREE.Camera
返回根据当前地图场景参数下对应的 THREEJS 相机
6.3 加载模型
用户可以使用 threejs 提供的能力加载其支持的任意模型
✨ 以加载 gltf 模型为例
1 | // 1、引入加载器 |
八、服务
1 WFS
1.1 介绍
OGCWebFeatureService(WFS)接口标准定义了一组接口,用于在Internet上访问要素和要素属性级别的地理信息。特征是对现实世界现象的抽象,也就是说,它代表了世界上可以找到的任何事物。地理要素的属性或特征称为要素特性。WFS提供了检索或查询地理要素的方法,这种方法独立于它们发布的底层数据存储。如果WFS被授权这样做,该服务还可以更新或删除地理特征。WFS的实例还能够存储查询,以便使客户机应用程序能够在稍后的时间点检索或执行查询。
1.1.1 历史
WFS于2002年5月发布了1.0.0版,2005年5月发布了1.1.0版,2010年11月发布了2.0.0版。版本2.0.0是ISO 19142的基础。OGC于2014年7月发布了WFS版本2.0.2。
1.1.2 版本
2.0.2是当前最新版本
1.1.3 测试套件
1.1.4 使用
WFS标准通过高度可配置的界面提供地理要素数据。默认情况下,WFS返回的数据使用地理标记语言(GML),GML是作为可扩展标记语言(XML)编写的。不过,该标准的新版本也将支持JavaScript对象表示法(JSON)。政府机构、私人组织和学术机构使用本标准发布矢量地理空间数据集,以便于接收机构编制新地图或对所提供数据进行分析。
WFS为请求由地理要素及其属性组成的矢量地理空间数据提供了一个标准接口。这样做的好处是,WFS客户端可以从多个WFS服务器请求源数据,然后呈现数据以在客户端上显示,或者作为工作流的一部分进一步处理数据。该标准保证使用公共地理空间坐标参考系,可以将数据与其他数据一致地处理。使用常见数据类型(如文本字符串、日期和时间)编码的特性属性也可以得到一致的处理。
1.1.5 与其他OGC标准的关系
- OGC网络地图块服务接口标准(WMS):WMS标准更适合于需要渲染地图而不是源向量数据的地方。
- Web地图块服务接口标准(WMTS):WMTS标准更适合于发出许多并发请求的高度可伸缩系统需要静态呈现的地图。
- OGC网络地图块服务接口标准(WCS):WCS标准更适合于需要源覆盖数据(如栅格图像)的情况。
- OGC地理标记语言(GML):这个标准被WFS用作发布数据的默认编码格式。
1.2 WFS 操作概述
WFS指定了许多不同的操作,所有服务器都需要支持这些操作:
GetCapabilities
返回一个文档,该文档描述由服务器提供的WFS服务提供的功能和资源。
DescribeFeatureType
返回WFS实例提供或接受的功能类型和功能属性的结构描述。
ListStoredQueries
返回存储在WFS实例中的查询列表。
DescribeStoredQueries
返回存储在WFS实例中的查询的说明。
GetFeature
从通过WFS发布的数据存储中返回要素实例的选择。
WFS服务器还可以提供以下可选操作:
GetPropertyValue
检索一组要素实例的要素特性值或复杂要素特性值的一部分
GetFeatureWithLock
提供与GetFeature请求类似的功能,但具有锁定特性的附加功能,可能是为了后续更新或更改。
LockFeature
锁定一组要素实例,以便在锁定到位时,其他操作都不能修改数据。
交易
允许插入、更新或删除要素实例及其特性。
CreateStoredQuery
创建并存储一个查询,客户机可以在稍后的时间点快速轻松地触发该查询。
DropStoredQuery
从服务器中删除以前存储的查询
1.3 WFS 操作详细信息
提供有关WFS服务器提供的操作类型的详细信息。该列表包括由WFS服务器的不同配置(正式称为一致性类)提供的操作。
Operation | Description |
---|---|
GetCapabilities |
检索有关服务的元数据,包括支持的操作和参数,以及可用功能类型的列表。 |
DescribeFeatureType |
返回WFS实例提供或接受的功能类型和功能属性的结构描述。 |
GetFeature |
从通过WFS发布的数据存储中返回要素实例的选择。 |
ListStoredQueries |
返回存储在WFS实例中的查询列表。 |
DescribeStoredQueries |
返回存储在WFS实例中的查询的说明。 |
GetPropertyValue (可选) |
检索一组要素实例的要素特性值或复杂要素特性值的一部分 |
GetFeatureWithLock (可选) |
提供与GetFeature请求类似的功能,但具有锁定特性的附加功能,可能是为了后续更新或更改。 |
LockFeature (可选) |
锁定一组要素实例,以便在锁定到位时,其他操作都不能修改数据。 |
Transaction (可选) |
允许修改或删除要素实例及其属性。 |
CreateStoredQuery (可选) |
创建并存储一个查询,客户机可以在稍后的时间点快速轻松地触发该查询。 |
DropStoredQuery (可选) |
从服务器中删除以前存储的查询。 |
以下是可以发送到由简单和基本的WFS配置提供的操作的请求的示例(仅列出 GetFeature 和数据更新操作)
1.3.1 GetFeature(用于数据查询)
WFS服务器响应 GetFeature 请求返回根据请求客户端设置的条件筛选的地理要素实例的集合。
请求可以通过httpget或httppost发送。为了简单起见,下面的示例请求仅通过httpget发送。
1.3.1.1 请求
最简单的GetFeature请求是下载特性集合而不受任何约束来过滤内容的请求。下面显示了此类请求的一个示例。这个 GetFeature
request使用一组描述要返回的地理特征的参数来查询服务器。TYPENAMES参数确定要返回的要素实例集合。
1 | http://cite.deegree.org/deegree-webservices-3.4-RC3/services/wfs200? |
1.3.1.2 响应
从上述请求得到的响应摘要如下所示。
1 | <wfs:FeatureCollection |
1.3.1.3 计数参数
可添加其他参数以进一步筛选或转换来自WFS的响应。指定参数值所需的信息,包括下面介绍的其他参数。
要在上面的GetFeature请求中包含其他参数,只需在URL的末尾添加一个与号(&),然后添加参数名称、等号和要分配给参数的值。例如,下面的GetFeature请求将服务器返回的特性数限制为单个特性实例。限制响应的数量由count参数的值确定。
1 | https://wfst.axl.aero/AxlRest/wfs? |
请求生成的响应如下所示。请注意,返回的特性实例的数量是1(由根目录中的numberReturned属性显示)wfs:FeatureCollection元素).
1 | <wfs:FeatureCollection |
1.3.1.4 边界框(BBOX)参数
可以添加到GetFeature请求的另一个参数是边界框(BBOX)的参数。此参数是一个逗号分隔的列表,由四个数字组成,表示应返回的要素实例的最小和最大边界坐标。下面显示了使用BBOX参数的示例。
1 | http://cite.deegree.org/deegree-webservices-3.4-RC3/services/wfs200?service=WFS&version=2.0.0&request=GetFeature&TypeNames=ps:ProtectedSite&BBOX=51.607317,5.106151,51.629884,5.228022 |
上面的请求返回的响应如下所示。为了简洁起见,这里提供了一些缺少的内容。
1 | <wfs:FeatureCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wfs="http://www.opengis.net/wfs/2.0" timeStamp="2017-09-21T18:14:50Z" xmlns:gml="http://www.opengis.net/gml/3.2" numberMatched="1" numberReturned="1"> |
1.3.1.5 PropetyName参数
可以添加到GetFeature请求的另一个参数是propertyName。此参数返回只包含指定属性的功能实例。在具有多个属性的功能类型通过带宽有限的网络提供服务的情况下,此功能尤其有用。客户机应用程序可以选择要在功能实例中返回的属性。下面显示了使用此参数的示例。
1 | https://services.interactive-instruments.de/ogc-reference/simple/wfs?version=2.0.0&request=getfeature&service=wfs&typenames=ci:City&count=3&propertyName=inhabitants |
上面的请求返回的响应如下所示。
1 | <wfs:FeatureCollection timeStamp="2017-09-21T21:17:32.296+02:00" numberReturned="3" numberMatched="unknown" xmlns="http://www.interactive-instruments.de/namespaces/demo/cities/4.1/cities" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> |
1.3.1.6 sortBy参数
WFS返回的结果也可以通过sortBy参数按特定的顺序组织。此参数按指定参数确定的序列返回要素实例。在要素类型具有表示数量或总体的特性的情况下,此功能尤其有用。下面显示了使用此参数的示例。
1 | https://services.interactive-instruments.de/ogc-reference/simple/wfs?version=2.0.0&request=getfeature&service=wfs&typenames=ci:City&sortBy=inhabitants&propertyName=inhabitants |
由上述请求得到的响应如下所示。为了简洁起见,省略了一些内容。
1 | <?xml version="1.0" encoding="utf-8"?> |
1.3.1.7 srsName参数
此参数用于指定用于编码要素几何图形的空间参考系。可以从GetCapabilities响应中标识每个要素类型所允许的空间参考系统。
1 | https://services.interactive-instruments.de/ogc-reference/simple/wfs?version=2.0.0&request=getfeature&service=wfs&typenames=ci:City&count=1&srsName=urn:ogc:def:crs:EPSG::4326 |
由上述请求得到的响应如下所示。为了简洁起见,省略了一些内容。
1 | <wfs:FeatureCollection timeStamp="2017-09-21T21:26:02.213+02:00" numberReturned="1" numberMatched="unknown" xmlns="http://www.interactive-instruments.de/namespaces/demo/cities/4.1/cities" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> |
1.3.1.8 featureId参数
此参数用于筛选请求返回的功能。
1 | http://localhost:8080/geoserver/wfs? |
由上述请求得到的响应如下所示。为了简洁起见,省略了一些内容。
1 | <wfs:FeatureCollection xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:topp="http://www.openplans.org/topp" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" numberMatched="1" numberReturned="1" timeStamp="2017-09-21T19:38:52.788Z"> |
1.3.1.9 查询操作
到目前为止,我们只展示了通过httpget方法作为url发送的GetFeature请求示例。也可以通过httppost方法将请求主体作为XML文档发送。
下面是一个GetFeature请求的示例,该请求包含一个查询操作,并通过httppost方法发送。
请求被发送到以下URL https://services.interactive-instruments.de/ogc-reference/simple/wfs
1 | <wfs:GetFeature service="WFS" version="2.0.0" |
上面的请求返回的响应如下所示。
1 | <wfs:FeatureCollection timeStamp="2017-09-22T09:56:55.908+02:00" numberReturned="1" numberMatched="unknown" xmlns="http://www.interactive-instruments.de/namespaces/demo/cities/4.1/cities" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.interactive-instruments.de/namespaces/demo/cities/4.1/cities https://services.interactive-instruments.de/ogc-reference/schema/demo/cities/4.1/Cities.xsd http://www.opengis.net/wfs/2.0 https://services.interactive-instruments.de/ogc-reference/schema/ogc/wfs/2.0/wfs.xsd http://www.opengis.net/gml/3.2 https://services.interactive-instruments.de/ogc-reference/schema/ogc/gml/3.2.1/gml.xsd http://www.opengis.net/gml/3.2 https://services.interactive-instruments.de/ogc-reference/schema/ogc/gml/3.2.1/gml.xsd"> |
1.3.2 数据更新
此可选操作允许更新或删除要素实例及其属性。该操作还可用于插入新功能。WFS标准不强制实施任何特定的安全模型,因此实现应该实现适合于其自身基础设施的安全模型。
1.3.2.1 请求
下面显示了一个请求示例。由于请求修改数据,我们建议安装一个WFS的本地实例。下面的示例针对本地托管的WFS实例进行了测试<本地主机http://localhost:8080/geoserver/wfs>
1 | <wfs:Transaction version="2.0.0" service="WFS" |
1.3.2.2 响应
响应是一个XML文档,用于确认事务是否成功。
1 | <wfs:TransactionResponse xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fes="http://www.opengis.net/fes/2.0" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0.0" xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://localhost:8080/geoserver/schemas/wfs/2.0/wfs.xsd"> |
1.4 城管原生 WFS 请求实例
GetFeature 不鉴权请求服务地址直接替换 layerName
1 | const layerName = 'town_area_2' |
1.5 基于 WFS 的增加、删除、修改、查询接口前端封装
1.5.1 接口说明
对用户输入的图层进行要素查询,返回 geojson
1.5.2 参数说明
参数 | 说明 | 类型 | 必须 |
---|---|---|---|
ip | 服务ip地址,城管委为172.18.34.198 | 字符串 | 是 |
port | 服务端口号,城管委为8000 | 整数 | 是 |
workspace | 工作空间,城管委为gis | 字符串 | 是 |
layerName | 图层名称,可登录城管委GIS系统->地图图层管理->物理图层管理获取需要的图层名 | 字符串 | 是 |
geomName | 几何字段字段名,城管委数据为geom | 字符串 | 是 |
maxFeatures | 最大返回要素数量,不填全部返回,影响查询速度 | 整数 | 否 |
crs | 返回数据坐标系,只需要提供code,默认EPSG:4326 | 字符串 | 否 |
filter | 过滤条件 | 对象 | 否 |
1 | import { WFST } from "cci-map" |
1.5.3 filter 过滤器
OGC Filter Encoding v1.1.0 实现
名称 | 构造函数 |
---|---|
ID | |
GmlObjectId | GmlObjectIdFilter(value id) |
Comparisons | |
PropertyIsEqualTo | OperatorFilter.EQ(propertyExpression firstArgument, literalExpression secondArgument, bool matchCase) |
PropertyIsNotEqualTo | OperatorFilter.NotEQ(propertyExpression firstArgument, literalExpression secondArgument, bool matchCase) |
PropertyIsLessThan | OperatorFilter.LT(propertyExpression firstArgument, literalExpression secondArgument, bool matchCase) |
PropertyIsGreaterThan | OperatorFilter.GT(propertyExpression firstArgument, literalExpression secondArgument, bool matchCase) |
PropertyIsLessThanOrEqualTo | OperatorFilter.LEQ(propertyExpression firstArgument, literalExpression secondArgument, bool matchCase) |
PropertyIsGreaterThanOrEqualTo | OperatorFilter.GEQ(propertyExpression firstArgument, literalExpression secondArgument, bool matchCase) |
PropertyIsLike | LikeFilter(string propertyName,string likeExpression,object attributes) |
PropertyIsNull | IsNullFilter(string propertyName) |
PropertyIsBetween | IsBetweenFilter(propertyExpression firstArgument, literalExpression lowerBoundary, literalExpression upperBoundary) |
Logic | |
And | LogicFilter.And(expression[, expression]*) |
Or | LogicFilter.Or(expression[, expression]*) |
Not | LogicFilter.Not(filter) |
Geojson | |
Geojson | Geojson(geojson,ICRS fromCRS, ICRS toCRS) |
Spatial | |
Equals | SpatialFilter.Equals(string propertyName, Geojson geometry) |
Disjoint | SpatialFilter.Disjoint(string geomPropertyName, Geojson geometry) |
Touches | SpatialFilter.Touches(string geomPropertyName, Geojson geometry) |
Within | SpatialFilter.Within(string geomPropertyName, Geojson geometry) |
Overlaps | SpatialFilter.Overlaps(string geomPropertyName, Geojson geometry) |
Crosses | SpatialFilter.Crosses(string geomPropertyName, Geojson geometry) |
Intersects | SpatialFilter.Intersects(string geomPropertyName, Geojson geometry) |
Contains | SpatialFilter.Contains(string geomPropertyName, Geojson geometry) |
Spatial distance buffer | |
DWithin | DistanceBufferFilter.DWithin(string geomPropertyName, Geojson geometry, value distance, string units) |
Beyond | DistanceBufferFilter.Beyond(string geomPropertyName, Geojson geometry, value distance, string units) |
1.5.4 例子
1.5.4.1 WFS 查询
- PropertyIsEqualTo 字段值等于
1 | import { WFS, OperatorFilter } from 'cci-map' |
- Intersects
1 | import { WFS, Geojson, SpatialFilter } from 'cci-map' |
- And
1 | import { WFS, Geojson, LogicFilter, SpatialFilter, OperatorFilter } from 'cci-map' |
- Like
1 | import { WFS, LikeFilter } from 'cci-map' |
- Between
1 | import { WFS, IsBetweenFilter } from 'cci-map' |
- Not
1 | import { WFS, IsBetweenFilter, NotFilter } from 'cci-map' |
- IsNull
1 | import { WFS, IsNullFilter } from 'cci-map' |
1.5.4.2 WFS-T 在线编辑
- 初始化
1 | import { WFST } from 'cci-map' |
- 新增
1 | import { Geojson } from 'cci-map' |
- 编辑
1 | import { Geojson } from 'cci-map' |
- 删除
1 | // 移除数据 |
2. 搜索
2.1 根据地址描述搜索地址接口
2.1.1 接口说明
对用户输入的地名地址进行搜索,返回标准地址。
2.1.2 接口地址
http://172.18.34.198:8000/geocoding-web/geocode/getLocationByAddressV2
2.1.3 请求方式
GET/POST
2.1.4 参数说明
参数 | 说明 | 类型 | 必须 |
---|---|---|---|
addr | 待搜索的地址 | 字符串 | 是 |
page | 结果分页参数,分页页码,默认 1 | 整数 | 否 |
limit | 结果分页参数,每页结果数,默认 10 | 整数 | 否 |
where | 地址类型查询条件参数, 查询楼栋: [{“key”:”address_type”,”logic”:0,”value”:1}] 查询户室: [{“key”:”address_type”,”logic”:0,”value”:0}] 查询室外地址: [{“key”:”address_type”,”logic”:5,”value”:1}] 查询非室外地址: [{“key”:”address_type”,”logic”:4,”value”:1}] 事件报送用: [{“key”:”address_type”,”logic”:8,”value”:[“0”,”1”,”61”,”62”,” 75”,”76”,”77”,”78”,”79”,”81”,”82”,”83”,”84”,”91”,”92”,”93 “,”94”,”95”,”96”,”97”,”98”]}] | json 格式的 字符串 Post 传。 form-data | 否 |
2.1.5 请求示例
http://172.18.34.198:8000/geocoding-web/geocode/getLocationByAddressV2?addr=天街&page=1&limit=10
2.1.6 返回示例
1 | { |
2.1.7 返回参数说明
2.2 通过坐标点获取地址描述信息
2.2.1 接口说明
根据坐标获取地址描述信息,通过输入的坐标,查询离输入坐标点最近的地址数据, 并返回输入坐标点相对于该条地址的坐标方位信息和相对距离。
2.2.2 接口地址
http://172.18.34.198:8000/geocoding-web/geocode/getLocationByPoint
2.2.3 请求方式
GET/POST
2.2.4 参数说明
参数 | 说明 | 类型 | 必须 |
---|---|---|---|
lat | 纬度 | Double | 是 |
lon | 经度 | Double | 是 |
distance | 查询范围的半径, 传参时需要指定距离 单位,不传默认为 1km,支持距离单位 m 和 km,如果想查询 500m 范围内的数 据,可以传 500m 或 0.5km | String | 否 |
addressType | 地址类型:0 房屋,1 楼栋,不传查询 全部地址类型 | String | 否 |
page | 分页页码, 默认为 1 | Integer | 否 |
size | 每页大小, 默认为 1 | Integer | 否 |
2.2.5 请求示例
http://172.18.34.198:8000/geocoding-web/geocode/getLocationByPoint?lon=120&lat=30
2.2.6 返回示例
1 | { |
2.2.7 返回参数说明
3. 路径规划
路径规划方法 pathPlan 内部调用高德服务接口,参数需要传入高德地图服务 token
3.1 请求参数说明
参数 | 说明 | 类型 | 必须 |
---|---|---|---|
token | 高德地图服务 token | String | 是 |
origin | 起点火星坐标系经纬度字符串,用逗号拼接 | String | 是 |
destination | 终点火星坐标系经纬度字符串,用逗号拼接 | String | 是 |
by | 交通类型:walking/bicycling/electrobike/bus/driving 默认driving | String | 否 |
toCRS | 指定高德路径数据转换经纬度坐标系,gcj02/wgs84/bd09, 默认 gcj02,也就是不做转换 | String | 否 |
3.2 示例
1 | import { LineLayer, CMap, GaodeMap, pathPlan, polylineString2coords } from 'cci-map' |
4. 路径纠偏
路径纠偏 graspPath 内部调用高德服务接口,参数需要传入高德地图 token
纠偏之前需要按照下面的数据规格准备原始轨迹点,
x、y、sp、ag、tm
分别代表经度、纬度、速度、角度、时间。经纬度应该是高德坐标,而不是GPS直接采集的坐标
tm以秒为单位,第一个采集点的tm值从1970年0点开始,其他采集点为与第一个采集点时间的差值
4.1 请求参数说明
参数 | 说明 | 类型 | 必须 |
---|---|---|---|
token | 高德地图服务 token | String | 是 |
version | 高德地图 api 版本,默认 2.0 | String | 否 |
path | 火星坐标系经纬度数组 | Array | 是 |
toCRS | 指定高德路径数据转换经纬度坐标系,gcj02/wgs84/bd09, 默认 gcj02,也就是不做转换 | String | 否 |
4.2 返回参数
- distance 返回里程数
- newPath 返回纠偏后对应坐标系经纬度数组
4.3 示例
1 | import { Scene, MapTalks, graspPath, lineLayer } from 'cci-map' |
5. 行政区划查询
行政区划查询 districtQuery 内部调用高德服务接口,参数需要传入高德地图服务 token
5.1 请求参数说明
参数名 | 含义 | 规则说明 | 是否必须 | 缺省值 |
---|---|---|---|---|
token | 请求服务权限标识 | 高德地图服务 token | 必填 | 无 |
keywords | 查询关键字 | 规则:只支持单个关键词语搜索关键词支持:行政区名称、citycode、adcode例如,在subdistrict=2,搜索省份(例如山东),能够显示市(例如济南),区(例如历下区)adcode信息可参考城市编码表获取 | 可选 | 无 |
subdistrict | 子级行政区 | 规则:设置显示下级行政区级数(行政区级别包括:国家、省/直辖市、市、区/县、乡镇/街道多级数据)可选值:0、1、2、3等数字,并以此类推0:不返回下级行政区;1:返回下一级行政区;2:返回下两级行政区;3:返回下三级行政区; 需要在此特殊说明,目前部分城市和省直辖县因为没有区县的概念,故在市级下方直接显示街道。例如:广东-东莞、海南-文昌市 | 可选 | 1 |
page | 需要第几页数据 | 最外层的districts最多会返回20个数据,若超过限制,请用page请求下一页数据。例如page=2;page=3。默认page=1 | 可选 | 1 |
offset | 最外层返回数据个数 | 可选 | 20 | |
extensions | 返回结果控制 | 此项控制行政区信息中返回行政区边界坐标点; 可选值:base、all;base:不返回行政区边界坐标点;all:只返回当前查询district的边界值,不返回子节点的边界值;目前不能返回乡镇/街道级别的边界值 | 可选 | base |
filter | 根据区划过滤 | 按照指定行政区划进行过滤,填入后则只返回该省/直辖市信息需填入adcode,为了保证数据的正确,强烈建议填入此参数 | 可选 | |
callback | 回调函数 | callback值是用户定义的函数名称,此参数只在output=JSON时有效 | 可选 | |
output | 返回数据格式类型 | 可选值:JSON,XML | 可选 | JSON |
toCRS | 返回数据坐标系 | 指定高德行政区划查询数据转换经纬度坐标系,gcj02/wgs84/bd09, 默认 gcj02,也就是不做转换 | 可选 | gcj02 |
5.2 返回参数
名称 | 含义 | 规则说明 | |||
---|---|---|---|---|---|
status | 返回结果状态值 | 值为0或1,0表示失败;1表示成功 | |||
info | 返回状态说明 | 返回状态说明,status为0时,info返回错误原因,否则返回“OK”。 | |||
infocode | 状态码 | 返回状态说明,10000代表正确,详情参阅info状态表 | |||
suggestion | 建议结果列表 | ||||
keywords | 建议关键字列表 | ||||
cites | 建议城市列表 | ||||
districts | 行政区列表 | ||||
district | 行政区信息 | ||||
citycode | 城市编码 | ||||
adcode | 区域编码 | 街道没有独有的adcode,均继承父类(区县)的adcode | |||
name | 行政区名称 | ||||
polyline | 行政区边界坐标点 | 当一个行政区范围,由完全分隔两块或者多块的地块组成,每块地的 polyline 坐标串以 \ | 分隔 。如北京 的 朝阳区 | ||
center | 区域中心点 | ||||
level | 行政区划级别 | country:国家province:省份(直辖市会在province和city显示)city:市(直辖市会在province和city显示)district:区县street:街道 | |||
districts | 下级行政区列表,包含district元素 |
5.3 示例
1 | import { CMap, GaodeMap, districtQuery } from 'cci-map' |
6. 天气查询
天气查询 weatherQuery 内部调用高德服务接口,参数需要传入高德地图服务 token
6.1 请求参数说明
参数名 | 含义 | 规则说明 | 是否必须 | 缺省值 |
---|---|---|---|---|
token | 请求服务权限标识 | 高德地图服务 token | 必填 | 无 |
city | 城市编码 | 输入城市的adcode,adcode信息可参考城市编码表 | 必填 | 无 |
extensions | 气象类型 | 可选值:base/allbase:返回实况天气 all:返回预报天气 | 可选 | 无 |
output | 返回格式 | 可选值:JSON,XML | 可选 | JSON |
6.2 返回参数说明
实况天气每小时更新多次,预报天气每天更新3次,分别在8、11、18点左右更新。由于天气数据的特殊性以及数据更新的持续性,无法确定精确的更新时间,请以接口返回数据的reporttime字段为准。天气结果对照表>>
名称 | 含义 | 规则说明 | ||
---|---|---|---|---|
status | 返回状态 | 值为0或11:成功;0:失败 | ||
count | 返回结果总数目 | |||
info | 返回的状态信息 | |||
infocode | 返回状态说明,10000代表正确 | |||
lives | 实况天气数据信息 | |||
province | 省份名 | |||
city | 城市名 | |||
adcode | 区域编码 | |||
weather | 天气现象(汉字描述) | |||
temperature | 实时气温,单位:摄氏度 | |||
winddirection | 风向描述 | |||
windpower | 风力级别,单位:级 | |||
humidity | 空气湿度 | |||
reporttime | 数据发布的时间 | |||
forecast | 预报天气信息数据 | |||
city | 城市名称 | |||
adcode | 城市编码 | |||
province | 省份名称 | |||
reporttime | 预报发布时间 | |||
casts | 预报数据list结构,元素cast,按顺序为当天、第二天、第三天的预报数据 | |||
date | 日期 | |||
week | 星期几 | |||
dayweather | 白天天气现象 | |||
nightweather | 晚上天气现象 | |||
daytemp | 白天温度 | |||
nighttemp | 晚上温度 | |||
daywind | 白天风向 | |||
nightwind | 晚上风向 | |||
daypower | 白天风力 | |||
nightpower | 晚上风力 |
6.3 示例
1 | import { CMap, GaodeMap, weatherQuery } from 'cci-map' |
7. ip 查询
ip查询 ipQuery 内部调用高德服务接口,参数需要传入高德地图服务 token
7.1 请求参数说明
参数名 | 含义 | 规则 | 是否必填 |
---|---|---|---|
token | 请求服务权限标识 | 高德地图服务 token | 是 |
type | IP类型 | 值为 4 或 6,4 表示 IPv4,6 表示 IPv6 | 是 |
ip | 要查询的ip地址 | 如:221.206.131.10 | 是 |
sig | 数字签名 | 数字签名认证用户必填 | 否 |
toCRS | 返回数据坐标系 | 指定IP查询数据转换经纬度坐标系,gcj02/wgs84/bd09, 默认 gcj02,也就是不做转换 | 否 |
7.2 返回参数说明
名称 | 含义 | 规则 |
---|---|---|
status | 状态码 | 返回结果状态值,值为0或1,0表示失败;1表示成功 |
info | 返回状态说明 | status为0时,info返回错误原因;否则返回“OK”。详情参阅info状态 |
infocode | 状态码 | 返回状态说明,10000代表正确,详情参阅info状态表 |
country | 国家 | 国家(或地区),中文 |
province | 省份 | 省(二级),中文 |
city | 城市 | 市(三级),中文 |
district | 区县 | 区(四级),中文 |
isp | 运营商 | 如电信、联通、移动 |
location | 经纬度 | 如 116.480881,39.989410 |
Ip | IP地址 | 提交的 Ipv4/Ipv6 地址 |
7.3 示例
1 | import { CMap, GaodeMap, ipQuery } from 'cci-map' |
8 地理/逆地理编码
地理编码/逆地理编码 API 是通过 HTTP/HTTPS 协议访问远程服务的接口,提供结构化地址与经纬度之间的相互转化的能力
8.1 地理编码
地理编码 geocodeQuery 内部封装高德服务接口,需要提供高德地图服务 token
8.1.1 请求参数说明
参数名 | 含义 | 规则说明 | 是否必须 | 缺省值 | ||
---|---|---|---|---|---|---|
token | 请求权限服务标志 | 高德地图服务 token | 必填 | 无 | ||
address | 结构化地址信息 | 规则遵循:国家、省份、城市、区县、城镇、乡村、街道、门牌号码、屋邨、大厦,如:北京市朝阳区阜通东大街6号。如果需要解析多个地址的话,请用”\ | “进行间隔,并且将 batch 参数设置为 true,最多支持 10 个地址进进行”\ | “分割形式的请求。 | 必填 | 无 |
city | 指定查询的城市 | 可选输入内容包括:指定城市的中文(如北京)、指定城市的中文全拼(beijing)、citycode(010)、adcode(110000),不支持县级市。当指定城市查询内容为空时,会进行全国范围内的地址转换检索。adcode信息可参考城市编码表获取 | 可选 | 无,会进行全国范围内搜索 | ||
batch | 批量查询控制 | batch 参数设置为 true 时进行批量查询操作,最多支持 10 个地址进行批量查询。batch 参数设置为 false 时进行单点查询,此时即使传入多个地址也只返回第一个地址的解析查询结果。 | 可选 | false | ||
sig | 数字签名 | 请参考数字签名获取和使用方法 | 可选 | 无 | ||
output | 返回数据格式类型 | 可选输入内容包括:JSON,XML。设置 JSON 返回结果数据将会以JSON结构构成;如果设置 XML 返回结果数据将以 XML 结构构成。 | 可选 | JSON | ||
callback | 回调函数 | callback 值是用户定义的函数名称,此参数只在 output 参数设置为 JSON 时有效。 | 可选 | 无 | ||
toCRS | 返回数据坐标系 | 指定地理编码数据转换经纬度坐标系,gcj02/wgs84/bd09 | 可选 | gcj02 |
8.1.2 返回参数说明
名称 | 含义 | 规则说明 | |
---|---|---|---|
status | 返回结果状态值 | 返回值为 0 或 1,0 表示请求失败;1 表示请求成功。 | |
count | 返回结果数目 | 返回结果的个数。 | |
info | 返回状态说明 | 当 status 为 0 时,info 会返回具体错误原因,否则返回“OK”。详情可以参阅info状态表 | |
geocodes | 地理编码信息列表 | 结果对象列表,包括下述字段: | |
formatted_address | 结构化地址信息 | 省份+城市+区县+城镇+乡村+街道+门牌号码 | |
country | 国家 | 国内地址默认返回中国 | |
province | 地址所在的省份名 | 例如:北京市。此处需要注意的是,中国的四大直辖市也算作省级单位。 | |
city | 地址所在的城市名 | 例如:北京市 | |
citycode | 城市编码 | 例如:010 | |
district | 地址所在的区 | 例如:朝阳区 | |
street | 街道 | 例如:阜通东大街 | |
number | 门牌 | 例如:6号 | |
adcode | 区域编码 | 例如:110101 | |
location | 坐标点 | 经度,纬度 | |
level | 匹配级别 | 参见下方的地理编码匹配级别列表 |
8.1.3 示例
1 | import { CMap, GaodeMap, geocodeQuery } from 'cci-map' |
8.2 逆地理编码
地理编码 regeocodeQuery 内部封装高德服务接口,需要提供高德地图服务 token
8.2.1 请求参数说明
参数名 | 含义 | 规则说明 | 是否必须 | 缺省值 | ||
---|---|---|---|---|---|---|
key | 请求服务权限标志 | 高德地图服务 token | 必填 | 无 | ||
location | 经纬度坐标 | 传入内容规则:经度在前,纬度在后,经纬度间以“,”分割,经纬度小数点后不要超过 6 位。如果需要解析多个经纬度的话,请用”\ | “进行间隔,并且将 batch 参数设置为 true,最多支持传入 20 对坐标点。每对点坐标之间用”\ | “分割。默认是高德坐标系坐标 | 必填 | 无 |
poitype | 返回附近POI类型 | 以下内容需要 extensions 参数为 all 时才生效。逆地理编码在进行坐标解析之后不仅可以返回地址描述,也可以返回经纬度附近符合限定要求的POI内容(在 extensions 字段值为 all 时才会返回POI内容)。设置 POI 类型参数相当于为上述操作限定要求。参数仅支持传入POI TYPECODE,可以传入多个POI TYPECODE,相互之间用“\ | ”分隔。该参数在 batch 取值为 true 时不生效。获取 POI TYPECODE 可以参考POI分类码表 | 可选 | 无 | |
radius | 搜索半径 | radius取值范围在0~3000,默认是1000。单位:米 | 可选 | 1000 | ||
extensions | 返回结果控制 | extensions 参数默认取值是 base,也就是返回基本地址信息;extensions 参数取值为 all 时会返回基本地址信息、附近 POI 内容、道路信息以及道路交叉口信息。 | 可选 | base | ||
batch | 批量查询控制 | batch 参数设置为 true 时进行批量查询操作,最多支持 20 个经纬度点进行批量地址查询操作。batch 参数设置为 false 时进行单点查询,此时即使传入多个经纬度也只返回第一个经纬度的地址解析查询结果。 | 可选 | false | ||
roadlevel | 道路等级 | 以下内容需要 extensions 参数为 all 时才生效。可选值:0,1 当roadlevel=0时,显示所有道路 当roadlevel=1时,过滤非主干道路,仅输出主干道路数据 | 可选 | 无 | ||
sig | 数字签名 | 请参考数字签名获取和使用方法 | 可选 | 无 | ||
output | 返回数据格式类型 | 可选输入内容包括:JSON,XML。设置 JSON 返回结果数据将会以JSON结构构成;如果设置 XML 返回结果数据将以 XML 结构构成。 | 可选 | JSON | ||
callback | 回调函数 | callback 值是用户定义的函数名称,此参数只在 output 参数设置为 JSON 时有效。 | 可选 | 无 | ||
homeorcorp | 是否优化POI返回顺序 | 以下内容需要 extensions 参数为 all 时才生效。homeorcorp 参数的设置可以影响召回 POI 内容的排序策略,目前提供三个可选参数:0:不对召回的排序策略进行干扰。1:综合大数据分析将居家相关的 POI 内容优先返回,即优化返回结果中 pois 字段的poi顺序。2:综合大数据分析将公司相关的 POI 内容优先返回,即优化返回结果中 pois 字段的poi顺序。 | 可选 | 0 | ||
fromCRS | 请求数据坐标系 | 指定逆地理编码请求数据经纬度坐标系,gcj02/wgs84/bd09 | 可选 | gcj02 | ||
toCRS | 返回数据坐标系统 | 指定逆地理编码返回数据经纬度坐标系,gcj02/wgs84/bd09 | 可选 | gcj0 |
8.2.2 返回参数说明
名称 | 含义 | 规则说明 | |||
---|---|---|---|---|---|
status | 返回结果状态值 | 返回值为 0 或 1,0 表示请求失败;1 表示请求成功。 | |||
info | 返回状态说明 | 当 status 为 0 时,info 会返回具体错误原因,否则返回“OK”。详情可以参考info状态表 | |||
regeocode | 逆地理编码列表 | batch 字段设置为 true 时为批量请求,此时 regeocodes 标签返回,标签下为 regeocode 对象列表;batch 为false 时为单个请求,会返回 regeocode 对象;regeocode 对象包含的数据如下: | |||
formatted_address | 结构化地址信息 | 结构化地址信息包括:省份+城市+区县+城镇+乡村+街道+门牌号码如果坐标点处于海域范围内,则结构化地址信息为:省份+城市+区县+海域信息 | |||
addressComponent | 地址元素列表 | ||||
province | 坐标点所在省名称 | 例如:北京市 | |||
city | 坐标点所在城市名称 | 请注意:当城市是省直辖县时返回为空,以及城市为北京、上海、天津、重庆四个直辖市时,该字段返回为空;省直辖县列表地址元素列表 | |||
citycode | 城市编码 | 例如:010 | |||
district | 坐标点所在区 | 例如:海淀区 | |||
adcode | 行政区编码 | 例如:110108 | |||
township | 坐标点所在乡镇/街道(此街道为社区街道,不是道路信息) | 例如:燕园街道 | |||
towncode | 乡镇街道编码 | 例如:110101001000 | |||
neighborhood | 社区信息列表 | ||||
name | 社区名称 | 例如:北京大学 | |||
type | POI类型 | 例如:科教文化服务;学校;高等院校 | |||
building | 楼信息列表 | ||||
name | 建筑名称 | 例如:万达广场 | |||
type | 类型 | 例如:科教文化服务;学校;高等院校 | |||
streetNumber | 门牌信息列表 | ||||
street | 街道名称 | 例如:中关村北二条 | |||
number | 门牌号 | 例如:3号 | |||
location | 坐标点 | 经纬度坐标点:经度,纬度 | |||
direction | 方向 | 坐标点所处街道方位 | |||
distance | 门牌地址到请求坐标的距离 | 单位:米 | |||
seaArea | 所属海域信息 | 例如:渤海 | |||
businessAreas | 经纬度所属商圈列表 | ||||
businessArea | 商圈信息 | ||||
location | 商圈中心点经纬度 | ||||
name | 商圈名称 | 例如:颐和园 | |||
id | 商圈所在区域的adcode | 例如:朝阳区/海淀区 | |||
roads | 道路信息列表 | 请求参数 extensions 为 all 时返回如下内容 | |||
road | 道路信息 | ||||
id | 道路id | ||||
name | 道路名称 | ||||
distance | 道路到请求坐标的距离 | 单位:米 | |||
direction | 方位 | 输入点和此路的相对方位 | |||
location | 坐标点 | ||||
roadinters | 道路交叉口列表 | 请求参数 extensions 为 all 时返回如下内容 | |||
roadinter | 道路交叉口 | ||||
distance | 交叉路口到请求坐标的距离 | 单位:米 | |||
direction | 方位 | 输入点相对路口的方位 | |||
location | 路口经纬度 | ||||
first_id | 第一条道路id | ||||
first_name | 第一条道路名称 | ||||
second_id | 第二条道路id | ||||
second_name | 第二条道路名称 | ||||
pois | poi信息列表 | 请求参数 extensions 为 all 时返回如下内容 | |||
poi | poi信息 | ||||
id | poi的id | ||||
name | poi点名称 | ||||
type | poi类型 | ||||
tel | 电话 | ||||
distance | 该POI的中心点到请求坐标的距离 | 单位:米 | |||
direction | 方向 | 为输入点相对建筑物的方位 | |||
address | poi地址信息 | ||||
location | 坐标点 | ||||
businessarea | poi所在商圈名称 | ||||
aois | aoi信息列表 | 请求参数 extensions 为 all 时返回如下内容 | |||
aoi | aoi信息 | ||||
id | 所属 aoi的id | ||||
name | 所属 aoi 名称 | ||||
adcode | 所属 aoi 所在区域编码 | ||||
location | 所属 aoi 中心点坐标 | ||||
area | 所属aoi点面积 | 单位:平方米 | |||
distance | 输入经纬度是否在aoi面之中 | 0,代表在aoi内其余整数代表距离AOI的距离 |
8.2.3 示例
1 | import { CMap, GaodeMap, regeocodeQuery } from 'cci-map' |
九、小程序
1. 教程
1.1 简介
通过引入 Mini 模块,能让用户在小程序环境中使用 地图可视化的能力,增强原生地图组件的可视化能力。
✨ 目前 Mini 兼容支付宝小程序,尚不支持微信小程序。
✨ 目前 Mini 只支持无底图模式,即只展示可视化层。
✨ Mini 模块的使用,除了画布获取和和事件注册因为小程序环境的原因需要用户额外处理,其余部分和普通 cci-map 使用保持一致。
下面将介绍如何在支付宝小程序中使用 Mini 模块。
1.2 安装
目前在小程序开发中使用的能力全部来自 Mini 模块,用户只需要执行一次安装即可。
1 | npm install cci-mini --save |
1.3 地图引用
在小程序环境中,用户无法引用高德地图和 Mapbox 地图, 只能引用小程序版本的地图类型。
在 .ts/.js 页面脚本文件中引用
1 | import { |
地图小程序环境的使用和普通 H5 环境的使用保持一致。
1 | const miniMap = new Map({ |
1.4 节点注册
由于小程序限制无法动态创建新的节点,因此需要事先在 .axml 文件中创建 canvas 画布节点
1 | <canvas onReady="onCanvasReady" type="webgl" id="canvas" /> |
注册完的节点会在脚本文件中获取使用。
✨ 需要完成 onCanvasReady 事件的注册,以便明确获取节点的时机。
1.5 事件注册
由于小程序环境的限制无法动态注册事件,所以需要用户自己完成事件代理,下面将会说明如何完成事件的代理。
✨ 如果不进行事件的注册和转发,用户将无法对地图进行操作。
- 在 .axml 文件中绑定基础事件
✨ 事件需要绑定在 canvas 节点上或是 canvas 的父节点上
1 | <view id="box" class="wrap" |
- .ts/.js 文件中完成事件的代理转发
引入代理方法
1 | import { |
在 page 对象中注册方法
1 | page({ |
只需要完成基础方法的注册(touchstart/touchmove/touchend),Mini 会完成复合方法、手势的判断。
1.6 画布的获取与使用
在小程序中,需要使用小程序提供的方法来获取页面节点。
通过在 .axml 在 canvas 画布组件上注册的 onCanvasReady 方法来判断获取画布的时机。
1 | page({ |
下面提供了获取画布节点通用方法,同时对画布进行一些处理方便后续使用。
1 | function handleCanvas(my, callback) { |
在获取到画布对象后需要传递给 scene 使用。
1 | const miniScene = new Scene({ |
1.7 销毁
为了保证小程序的良好体验,在页面关闭时记得及时将地图内容进行销毁。
1 | page({ |
1.8 限制
目前 Mini 尚不支持 marker/popup 等需要动态创建页面节点的能力,用户若是需要可以自己单独创建。
2. 3D 柱状实例
- index.axml 页面结构代码
1 | <view class="isLoading" style="height: 100vh" a:if="{{isLoading}}"> |
- index.less 样式代码
1 | .wrap { |
- index.js 脚本代码
1 | import { |
- 方法代码
1 | export function getJSON(url, callback) { |