在实际项目中,我们经常需要加载各种标准地图服务,比如 WMS、WMTS,或者自定义的 XYZ 格式瓦片。今天就来学习一下如何在 mapvthree 中使用这些服务,以及理解不同的瓦片切图规则。
在 GIS 领域,有几种常见的地图服务标准:
我的理解:WMS 是动态生成地图图片,WMTS 和 XYZ 是使用预切好的瓦片,性能更好。
WMS 是 OGC 标准的 Web 地图服务,通过参数化的 HTTP 请求获取地图图片。
import * as mapvthree from '@baidumap/mapv-three';
const container = document.getElementById('container');
const engine = new mapvthree.Engine(container, {
map: {
center: [120.628, 27.786],
range: 500000,
provider: null,
projection: 'EPSG:3857',
},
});
// 添加 WMS 服务
const mapView = engine.add(new mapvthree.MapView({
imageryProvider: new mapvthree.WMSImageryTileProvider({
url: 'https://ows.mundialis.de/services/service',
params: {
LAYERS: 'TOPO-WMS,OSM-Overlay-WMS',
SRS: 'EPSG:3857',
VERSION: '1.1.1',
WIDTH: 256,
HEIGHT: 256,
},
}),
}));我的发现:WMS 需要配置服务 URL 和请求参数,包括图层名称、坐标系、版本等。
参数说明:
url:WMS 服务地址params.LAYERS:要加载的图层名称,多个图层用逗号分隔params.SRS:空间参考系统,常用 EPSG:3857(Web 墨卡托)或 EPSG:4326(WGS84)params.VERSION:WMS 版本,常用 1.1.1 或 1.3.0params.WIDTH 和 params.HEIGHT:请求图片的尺寸,通常为 256WMTS 是 OGC 标准的 Web 地图瓦片服务,提供预切好的瓦片,性能比 WMS 更好。
const mapView = engine.add(new mapvthree.MapView({
imageryProvider: new mapvthree.WMTSImageryTileProvider({
url: 'https://mrdata.usgs.gov/mapcache/wmts?LAYER=sgmc2&TILEMATRIX={z}',
params: {
STYLE: 'default',
TILEMATRIXSET: 'GoogleMapsCompatible',
VERSION: '1.0.0',
FORMAT: 'image/png',
},
}),
}));我的发现:WMTS 的 URL 中可以使用 {z} 占位符,引擎会自动替换为对应的缩放级别。
参数说明:
url:WMTS 服务地址,可以使用 {z}、{x}、{y} 占位符params.STYLE:图层样式params.TILEMATRIXSET:瓦片矩阵集,常用 GoogleMapsCompatibleparams.VERSION:WMTS 版本,通常为 1.0.0params.FORMAT:图片格式,如 image/png、image/jpeg我的理解:
XYZ 是最通用的瓦片格式,通过 URL 模板直接访问瓦片,支持各种自定义瓦片服务。
const mapView = engine.add(new mapvthree.MapView({
imageryProvider: new mapvthree.XYZImageryTileProvider({
url: 'https://server.arcgisonline.com/ArcGIS/rest/services/' +
'World_Topo_Map/MapServer/tile/{z}/{y}/{x}',
}),
}));我的发现:XYZ 格式使用 {z}/{y}/{x} 占位符,分别代表缩放级别、行号、列号。
不同的瓦片服务可能使用不同的切图规则,主要体现在 Y 轴的起始位置:
// 使用 y 规则(左上角为原点)
const mapView1 = engine.add(new mapvthree.MapView({
imageryProvider: new mapvthree.XYZImageryTileProvider({
url: 'https://example.com/tiles/{z}/{x}/{y}.png',
// 默认使用 y 规则
}),
}));
// 使用 reverseY 规则(左下角为原点,TMS 标准)
const mapView2 = engine.add(new mapvthree.MapView({
imageryProvider: new mapvthree.XYZImageryTileProvider({
url: 'https://example.com/tms/{z}/{x}/{reverseY}.png',
// 使用 reverseY 占位符
}),
}));我的理解:
{y}{reverseY}const mapView = engine.add(new mapvthree.MapView({
imageryProvider: new mapvthree.XYZImageryTileProvider({
url: 'https://mapopen-pub-jsapigl.bj.bcebos.com/tms-bj/{z}/{x}/{reverseY}.png',
startLevel: 7,
maxLevel: 12,
}),
}));我的发现:可以设置 startLevel 和 maxLevel 来限制瓦片的缩放级别范围。
作为一个初学者,理解切图规则很重要,这决定了瓦片能否正确显示。
地图瓦片通常使用两种坐标系:
我的经验:
yreverseY我的理解:
z:缩放级别,数值越大,地图越详细x:瓦片的列号,从 0 开始y:瓦片的行号,从 0 开始2^z × 2^z 个瓦片我想写一个完整的示例,展示三种服务的使用:
import * as mapvthree from '@baidumap/mapv-three';
const container = document.getElementById('container');
const engine = new mapvthree.Engine(container, {
map: {
center: [120.628, 27.786],
range: 500000,
provider: null,
projection: 'EPSG:3857',
},
});
// 示例 1:WMS 服务
const wmsMapView = engine.add(new mapvthree.MapView({
imageryProvider: new mapvthree.WMSImageryTileProvider({
url: 'https://ows.mundialis.de/services/service',
params: {
LAYERS: 'TOPO-WMS',
SRS: 'EPSG:3857',
VERSION: '1.1.1',
WIDTH: 256,
HEIGHT: 256,
},
}),
}));
// 示例 2:WMTS 服务
const wmtsMapView = engine.add(new mapvthree.MapView({
imageryProvider: new mapvthree.WMTSImageryTileProvider({
url: 'https://mrdata.usgs.gov/mapcache/wmts?LAYER=sgmc2&TILEMATRIX={z}',
params: {
STYLE: 'default',
TILEMATRIXSET: 'GoogleMapsCompatible',
VERSION: '1.0.0',
FORMAT: 'image/png',
},
}),
}));
// 示例 3:XYZ 格式(y 规则)
const xyzMapView = engine.add(new mapvthree.MapView({
imageryProvider: new mapvthree.XYZImageryTileProvider({
url: 'https://server.arcgisonline.com/ArcGIS/rest/services/' +
'World_Topo_Map/MapServer/tile/{z}/{y}/{x}',
}),
}));
// 示例 4:XYZ 格式(reverseY 规则,TMS)
const tmsMapView = engine.add(new mapvthree.MapView({
imageryProvider: new mapvthree.XYZImageryTileProvider({
url: 'https://mapopen-pub-jsapigl.bj.bcebos.com/tms-bj/{z}/{x}/{reverseY}.png',
startLevel: 7,
maxLevel: 12,
}),
}));我的感受:掌握了这三种服务的使用方法,就可以加载各种标准地图服务了!
作为一个初学者,我踩了不少坑,记录下来避免再犯:
原因:参数配置错误,比如图层名称不对、坐标系不匹配。
解决:
SRS 参数与引擎的投影设置一致LAYERS 参数中的图层名称正确原因:URL 占位符使用错误,或者 TILEMATRIXSET 不匹配。
解决:
{z}、{x}、{y})TILEMATRIXSET 是否与服务提供的一致原因:切图规则选择错误,应该用 y 却用了 reverseY,或者相反。
解决:
y,左下角原点用 reverseY原因:服务地址访问慢,或者网络问题。
解决:
原因:服务只提供了特定缩放级别的瓦片。
解决:使用 startLevel 和 maxLevel 限制缩放级别范围。
经过这一天的学习,我掌握了:
y 和 reverseY 的区别,正确选择切图规则我的感受:标准地图服务虽然配置有点复杂,但是用起来其实不难。关键是要理解不同服务的特点,然后正确配置参数和切图规则!
下一步计划:
学习笔记就到这里啦!作为一个初学者,我觉得标准地图服务虽然配置有点复杂,但是用起来其实不难。关键是要理解不同服务的特点,然后正确配置参数和切图规则!希望我的笔记能帮到其他初学者!大家一起加油!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。