适用版本:船讯网海图GIS平台 H5 API 3.5 前置阅读:《7.1-快速入门:从注册到接入》。阅读本文前,请确认您已获得 API 密钥并能在页面上成功显示地图。 本文内容:地图初始化 options 全参数、地图操作方法、内置控件、图源切换、点/线/面标注绘制。
| 参数 | 类型 | 说明 |
|---|---|---|
| map | Object | HTML 容器对象(容器 id 字符串,如 "map") |
| options | Object | 配置信息,详见下文参数表 |
L.Map(Leaflet 原生地图对象)。返回值上既可调用 Leaflet 原生方法,也挂载了平台扩展的控件与服务(如 basemapsControl、PolylineMeasureControl、Draw 等)。ak 必填)。| 参数 | 类型 | 默认值 / 示例 | 说明 |
|---|---|---|---|
| ak | String | "" | 授权码(API 密钥),必填 |
| attribution | Object | {isShow: true, emptyString: '©2018 <a class="shipxy_small"></a> <a>Elane Inc.</a>'} | 公司版权信息(支持 html),默认显示 Elane Inc. |
| mapTypes | Array | ['MT_SEA', 'MT_GOOGLE', 'MT_SATELLITE'] | 显示地图类型(图源切换控件中出现的图源列表) |
| defaultMapType | String | 'MT_SEA' | 默认展示的地图类型 |
| gratings | Object | {isShow: false, maxZoom: 9, type: "RASTER_WORLD"} | 光栅图:是否显示、最大显示级别,默认不显示 |
| centerPoint | Array | [32.1, 122.11] | 初始中心点坐标 [纬度, 经度] |
| zoom | Number | 4 | 初始缩放级别 |
| minZoom | Number | 2 | 最小缩放级别 |
| maxZoom | Number | 18 | 最大缩放级别 |
| measureCtrl | Object | {isShow: true, position: 'topleft'} | 测量(测距)控件的显示隐藏,详见 3.3 节 |
| mousePostionCtrl | Object | {isShow: true, position: 'bottomright'} | 鼠标移动悬浮经纬度控件 |
| zoomControlElane | Object | {isShow: true, position: 'topright'} | 缩放控件的显示隐藏 |
| zoomviewControl | Object | {isShow: true, position: 'topleft'} | 缩放级别显示控件 |
| basemapsControl | Object | {isShow: true, position: 'topright'} | 地图切换(图源切换)控件的位置 |
| mapReadyCallBack | Function | function (map) {} | 地图初始化完成后的回调方法,参数为地图对象 |
| scaleCtrl | Object | {isShow: true, position: "bottomleft"} | 比例尺控件 |
| addTileLayer | Array | [] | 自定义图源(Leaflet TileLayer 对象数组) |
| cjhdTileLayer | Object | {isShow: false} | 是否显示长江航道,默认:false |
| miniMapControl | Object | {isShow: false, options: {}} | 鹰眼(小地图)控件 |
| tileLayer | Object | 见下方说明 | 默认图源设置(url、errorTileUrl),默认图源类型有:sea、google、satellite |
tileLayer 用于覆盖内置图源的瓦片地址,结构如下(一般无需修改):centerPoint/zoom 时的默认视野。gratings)。ShipxyAPI.Map 的返回值就是 Leaflet 的 L.Map 对象,因此以下 Leaflet 原生能力 均可直接使用(详细用法可查阅 Leaflet 官方文档):| 方法 | 说明 |
|---|---|
map.setView([lat, lng], zoom) | 设置中心点与缩放级别 |
map.panTo([lat, lng]) | 平移视野到指定坐标 |
map.fitBounds(bounds) | 调整视野以完整包含指定范围(常与标注的 getBounds() 配合) |
map.getCenter() / map.getZoom() | 获取当前中心点 / 缩放级别 |
map.on('click', fn) | 监听地图事件(click、mousemove、zoomend、moveend 等 Leaflet 原生事件) |
map.addLayer(layer) / map.removeLayer(layer) | 添加 / 移除图层 |
ShipxyAPI.latLng(lat, lng) | 创建坐标对象(等同 Leaflet 的 L.latLng) |
ShipxyAPI 命名空间导出(ShipxyAPI.marker、ShipxyAPI.polyline、ShipxyAPI.polygon 等,底层即 Leaflet 对应类);而图标、坐标参考系等仍使用 L 命名空间(L.icon、L.CRS.EPSG3857 等)。position 可选值为 Leaflet 控件方位:'topleft'、'topright'、'bottomleft'、'bottomright'。| 控件 | options 参数 | 默认位置 | 功能 |
|---|---|---|---|
| 缩放控件 | zoomControlElane | topright | 放大 / 缩小按钮 |
| 缩放级别显示控件 | zoomviewControl | topleft | 实时显示当前缩放级别数字 |
| 图源切换控件 | basemapsControl | topright | 海图 / 地图 / 卫星图源切换(见第 4 节) |
| 测距控件 | measureCtrl | topleft | 在地图上连续点击测量多点距离(见 3.3) |
| 比例尺控件 | scaleCtrl | bottomleft | 左下角显示比例尺 |
| 鼠标坐标控件 | mousePostionCtrl | bottomright | 鼠标悬浮时实时显示所在经纬度 |
| 鹰眼控件 | miniMapControl | 默认关闭 | 右下角小地图(鹰眼),{isShow: true, options: {}} 开启 |
| 版权信息 | attribution | 左下角 | 平台版权文字,支持 html |
measureCtrl 的子参数:| 参数 | 默认值 | 说明 |
|---|---|---|
| isShow | true | 是否开启测距控件 |
| showMeasurementsMeasureControl | true | 是否显示测距按钮 |
| showMeasurementsClearControl | true | 是否显示删除按钮 |
| showUnitControl | true | 是否显示切换单位按钮 |
| position | topleft | 控件位置 |
| 方法 | 说明 |
|---|---|
map.PolylineMeasureControl._toggleMeasure() | 开始 / 结束测距(切换测距状态) |
map.PolylineMeasureControl._changeUnit() | 切换测距单位(如公里 / 海里) |
map.PolylineMeasureControl._clearAllMeasurements() | 删除全部测距结果 |
map.PolylineMeasureControl._measuring() | 查询当前是否正在测距 |
mapTypes 配置可选列表,defaultMapType 配置默认图源:| 图源标识 | 说明 |
|---|---|
| MT_SEA | 电子海图(默认) |
| MT_GOOGLE | 谷歌地图(陆地图) |
| MT_SATELLITE | 卫星影像 |
basemapsControl 后,地图右上角会出现图源切换控件,用户可点击切换。也可以通过代码切换:ShipxyAPI 命名空间导出 latLng、marker、polyline、polygon 等工厂方法(对应 Leaflet 的 L.latLng、L.marker、L.polyline、L.polygon),创建后调用 .addTo(_map) 即可加到地图上。此外平台还封装了 _map.Draw 交互式绘制插件,支持用户在地图上手工绘制并编辑图形。| 接口 | 参数 | 说明 |
|---|---|---|
ShipxyAPI.latLng(lat, lng) | lat:纬度;lng:经度 | 创建坐标对象(等同 L.latLng) |
ShipxyAPI.marker(latlng, options) | latlng:坐标;options:Leaflet marker 配置(如 icon) | 创建点标注(等同 L.marker) |
marker.addTo(map) | map:地图对象 | 把标注添加到地图 |
marker.remove() | 无 | 从地图上删除该标注 |
L.icon 可以自定义标注图标;通过 bindPopup / bindTooltip 可以绑定弹窗与悬浮提示;通过 marker.on(...) 可以监听 click、mouseover、mouseout 等鼠标事件。| 接口 | 关键参数 | 说明 |
|---|---|---|
L.icon(options) | iconUrl:图标图片地址;iconAnchor:图标锚点 [x, y](图标上哪个像素对准坐标点);iconSize:图标大小 [宽, 高](可选) | 自定义标注图标(Leaflet 原生) |
ShipxyAPI.marker([lat, lng], {icon}) | icon:上面创建的图标对象 | 创建使用自定义图标的点标注 |
marker.bindPopup(content, options) | content:HTML 字符串或返回 HTML 的函数;options.className:弹窗样式类名(示例用 shipxy_popup);options.closeButton:是否显示关闭按钮 | 绑定点击弹窗 |
marker.openPopup() | 无 | 立即打开弹窗 |
marker.bindTooltip(content) | content:提示文字 | 绑定鼠标悬浮提示 |
marker.on(event, fn) | event:'click'、'mouseover'、'mouseout' 等 | 监听鼠标事件,e.target 为 marker 本身 |
marker.setIcon(icon) | icon:图标对象 | 动态更换标注图标 |
_map.Draw 绘制插件,让用户在地图上手工绘制图形。点绘制的核心流程(完整代码见官方示例 a1_5.htm):| 接口 | 说明 |
|---|---|
_map.Draw.begin({shape}) | 开始交互绘制,shape:'Marker' 点 / 'Line' 线 / 'Poly' 面,返回 shape 对象 |
_map.Draw.end(shape) | 结束绘制 |
_map.Draw.getLayer(shape) | 根据 shape 取得绘制出的 Leaflet 图层 |
_map.Draw.edit(layer, flag) | 进入编辑模式(可拖动顶点修改图形) |
_map.Draw.cancelEdit(layer) | 退出编辑模式 |
map.on("pm:create", fn) | 绘制完成事件 |
layer.on("pm:edit", fn) | 图形被编辑后的事件 |
ShipxyAPI.polyline(latlngs, options),样式项为 Leaflet 原生 Path 配置):| 参数 | 示例值 | 说明 |
|---|---|---|
| latlngs | [[45.51, 122.68], [37.77, 122.43], [34.04, 118.2]] | 折线顶点数组,元素为 [纬度, 经度] |
| color | 'red' | 折线颜色 |
| weight | 3 | 折线宽度(像素) |
| opacity | 1 | 折线透明度,范围 [0,1] |
| dashArray | [5,10] | 虚线配置 [线段长度、间隙长度、线段长度、间隙长度...],不传则为实线 |
polyline.getBounds() 取得折线外包矩形,配合 _map.fitBounds(...) 让视野刚好包含整条线;polyline.getLatLngs() 取得点集;polyline.remove() 删除。ShipxyAPI.polygon(latlngs, options),样式项为 Leaflet 原生 Path 配置):| 参数 | 示例值 | 说明 |
|---|---|---|
| latlngs | [[45.51, 122.68], ...] | 多边形顶点数组,元素为 [纬度, 经度] |
| stroke | true | 是否显示边框 |
| color | "red" | 边框颜色 |
| weight | 3 | 边框 宽度(像素) |
| opacity | 1 | 边框透明度,范围 [0,1] |
| dashArray | [5,10] | 边框虚线配置 [线段长度、间隙长度...] |
| fill | true | 是否填充 |
| fillColor | "red" | 填充颜色,缺省时使用 color 值 |
| fillOpacity | 0.2 | 填充透明度,范围 [0,1] |
_map.Draw.begin({shape: 'Poly'});多边形编辑后通过 draw_layer.getLatLngs()[0] 取得顶点集合。除多边形外,Leaflet 原生还提供 L.circle(圆形)、L.rectangle(矩形)等面状图形,创建后同样 .addTo(_map) 即可使用。centerPoint、latLng、点集数组)都是纬度在前、经度在后,与部分"经度在前"的地图 API 相反,传反会导致标注跑到地球另一端。ShipxyAPI.marker / polyline / polygon(或等价的 L.marker 等),图标与坐标参考系用 L.icon、L.CRS.EPSG3857,两者都来自同一个 Leaflet 引擎,混用没有问题。remove():如 mm.remove()、draw_layer.remove();编辑状态要先 cancelEdit 再删除。z-index(官方示例用 888)并在点击事件中调用 e.stopPropagation(),避免点击穿透到地图触发地图事件。position 只支持 'topleft'、'topright'、'bottomleft'、'bottomright' 四个方位;同一位置放多个控件时会自动堆叠。_map.basemapsControl.changeMap(...) 报错或没反应?basemapsControl 的 isShow 为 true(默认开启);切换的目标图源标识必须在 mapTypes 列表中,自定义图源则需在 addTileLayer 中注册过。centerPoint 和 zoom,但初始视野不对?[纬度, 经度];zoom 需在 minZoom 与 maxZoom 之间,超出范围会被限制。.addTo(_map);2) 确认坐标在当前视野内,可用 _map.fitBounds(layer.getBounds()) 或 _map.setView(...) 把视野移过去;3) 自定义图标的 iconUrl 图片地址需可访问,否则图标显示为空。_map.Draw.begin 绘制时没有任何提示,如何知道绘制完成?pm:create 事件,绘制完成会触发;编辑顶点会触发图层的 pm:edit 事件,在回调里用 getLatLng() / getLatLngs() 取最新坐标。_map.PolylineMeasureControl._changeUnit() 切换单位,_clearAllMeasurements() 清除全部测距,清除后建议再调用一次 _toggleMeasure() 更新控件状态。mapReadyCallBack: function (map) { ... } 回调,地图初始化完成后会调用并传入地图对象;在简单场景下,直接在 new ShipxyAPI.Map(...) 之后的代码中操作通常也可以(官方示例即如此)。L.Map,Leaflet 的视图控制(setView/panTo/fitBounds)、事件(on/off)、图层管理(addLayer/removeLayer)等原生能力都可直接使用;平台未封装的 Leaflet 插件(如 circle、rectangle、GeoJSON 等)同样可以自行引入使用。