前言

​ 高德地图应用在许多领域,平常我们用的地图导航,除过正常的地图导航指引功能之外,其实还有很多实用的功能。如高德影像地图应用在包括地理、土地测量、水文学、生态学、气象学以及海洋学等方面。AutoCAD在行业中常用于城市规划、平面设计、建筑师等,这其中也要用到高德地图。最常见的是CAD图与高德地图叠加使用,通过两者叠加直观显示,助力行业提高工作效率。那如何将高德地图与CAD图叠加显示呢?下面听小编把方法一一介绍下以及各种方法的优缺点。

方法一:高德SDK加载CAD的WMS图层

原理

高德SDK

高德SDK提供了行业标准图层符合 OGC 标准或者行业通行规范的的图层类型

AMap.TileLayer.WMS

用于加载OGC标准的WMS地图服务的一种图层类,仅支持EPSG3857坐标系统的WMS图层。

查看 WMS的OGC标准

new AMap.TileLayer.WMS(opts: WMSLayerOptions)

参数说明:

opts (WMSLayerOptions) 默认图层参数

Name Description
opts.url String wmts服务的url地址,如:' https://services.arcgisonline.com/arcgis/rest/services/'+ 'Demographics/USA_Population_Density/MapServer/WMTS/'
opts.blend Boolean 地图级别切换时,不同级别的图片是否进行混合,如图层的图像内容为部分透明请设置为false
opts.params Object OGC标准的WMS地图服务的GetMap接口的参数,包括VERSION、LAYERS、STYLES、FORMAT、TRANSPARENT等, CRS、BBOX、REQUEST、WIDTH、HEIGHT等参数请勿添加,例如: { LAYERS: 'topp:states', VERSION:'1.3.0', FORMAT:'image/png' }
opts.zooms [Number, Number] (default [2,30]) 支持的缩放级别范围,默认范围 [2-30]
opts.opacity Number (default 1) 透明度,默认 1
opts.visible Boolean (default true) 是否显示,默认 true
opts.zIndex Number (default 4) 图层叠加的顺序值,1 表示最底层。默认 zIndex:4

CAD的WMS图层

唯杰地图VJMAPCAD图或自定义地图格式WebGIS可视化显示开发提供的一站式解决方案,支持的格式如常用的AutoCADDWG格式文件、GeoJSON等常用GIS文件格式,它使用WebGL矢量图块自定义样式呈现交互式地图, 提供了全新的大数据可视化实时流数据可视化功能。

唯杰地图https://vjmap.com/无需转换可直接打开CAD的DWG格式的图形,并提供了WMS服务接口。

其接口文档为:


/**
* wms服务url地址接口
*/
export interface IWmsTileUrl {
/** 地图ID(为空时采用当前打开的mapid), 为数组时表时同时请求多个. */
mapid?: string | string[];
/** 地图版本(为空时采用当前打开的地图版本). */
version?: string | string[];
/** 图层名称(为空时采用当前打开的地图图层名称). */
layers?: string | string[];
/** 范围,缺省{bbox-epsg-3857}. (如果要获取地图cad一个范围的wms数据无需任何坐标转换,将此范围填cad范围,srs,crs,mapbounds填为空).*/
bbox?: string;
/** 当前坐标系,缺省(EPSG:3857). */
srs?: string;
/** cad图的坐标系,为空的时候由元数据坐标系决定. */
crs?: string | string[];
/** 地理真实范围,如有值时,srs将不起作用 */
mapbounds?: string;
/** 宽. */
width?: number;
/** 高. */
height?: number;
/** 是否透明. */
transparent?: boolean;
/** 四参数(x偏移,y偏移,缩放,旋转弧度),可选,对坐标最后进行修正*/
fourParameter?: string | string[];
/** 是否是矢量瓦片. */
mvt?: boolean;
/** 是否考虑旋转,在不同坐标系中转换是需要考虑。默认自动考虑是否需要旋转. */
useImageRotate?: boolean;
/** 旋转时图像处理算法. 1或2,默认自动选择(旋转时有用)*/
imageProcessAlg?: number;
/** 当前互联网底图地图类型 WGS84(84坐标,如天地图,osm), GCJ02(火星坐标,如高德,腾讯地图), BD09LL(百度经纬度坐标,如百度地图), BD09MC(百度墨卡托米制坐标,如百度地图)*/
webMapType?: "WGS84" | "GCJ02" | "BD09LL" | "BD09MC";
}

实现

参考高德提拱的WMS的示例代码 https://developer.amap.com/demo/jsapi-v2/example/thirdlayer/wms-layer ,实现代码如下

let map = new AMap.Map('map', {
zoom: 15,
center: [106.166187, 29.44102]
});
// 调用唯杰地图服务对象
let svc = new vjmap.Service(env.serviceUrl, env.accessToken)
// 打开地图
let mapId = "sys_cadcesium";
let res = await svc.openMap({
mapid: mapId, // 地图ID
mapopenway: vjmap.MapOpenWay.GeomRender, // 以几何数据渲染方式打开
style: vjmap.openMapDarkStyle() // div为深色背景颜色时,这里也传深色背景样式
})
if (res.error) {
// 如果打开出错
message.error(res.error)
}
let layer = res.layer;//图层样式名 let cadEpsg = "EPSG:4544";// cad图的espg代号
// 增加唯杰地图中cad的wms图层
let wmsUrl = svc.wmsTileUrl({
mapid: mapId, // 地图id
layers: layer, // 图层名称
bbox: '', // bbox这里不需要
srs: "EPSG:3857", //
crs: cadEpsg,
webMapType: "GCJ02"
})
function getQueryStringArgs(url) {
let theRequest = {};
let idx = url.indexOf("?");
if (idx != -1) {
let str = url.substr(idx + 1);
let strs = str.split("&");
for (let i = 0; i < strs.length; i++) {
let items = strs[i].split("=");
theRequest[items[0]] = items[1];
}
}
return theRequest;
} let wms = new AMap.TileLayer.WMS({
url: wmsUrl.substr(0, wmsUrl.indexOf("?")),
blend: true,
tileSize: 256,
params: getQueryStringArgs(wmsUrl)
}); wms.setMap(map);

效果如下

在线体验地址: https://vjmap.com/demo/#/demo/map/web/08gaodeCadWmsLayer

优点

(1)能利用高德SDK开发,如果之前的项目是基于高德SDK开发的, 工作量不大

​ (2) 能用高德原生的地图数据,互联网地图数据丰富效果好

缺点

​ (1) 不能用唯杰地图vjmap的SDK进行开发,一些与CAD相关的功能开发受限。

​ (2) 由于高德地图的级别有限,导致CAD图缩放至一定级别后,不能再放大。如果图纸大的话,会导致级别不够的问题

方法二: 唯杰地图SDK中高德地图上加载CAD图

原理

​ 唯杰地图SDK中也可以显示互联网地图。可以利用唯杰地图同时显示高德地图和CAD图。此方法为互联网地图做为底图,CAD做为一个WMS图层进行叠加。唯杰地图本身没有互联网地图数据,加载互联网地图是利用了在线公共地图瓦片数据地址 https://blog.csdn.net/weixin_45728126/article/details/119040004

实现

// --高德地图与CAD图叠加[高德地图为底图]--高德地图与CAD图叠加,以高德地图为坐标系
let svc = new vjmap.Service(env.serviceUrl, env.accessToken)
// 根据地图范围建立经纬度投影坐标系
let prj = new vjmap.LnglatProjection(); // 地图对象
let map = new vjmap.Map({
container: 'map', // DIV容器ID
style: {
version: svc.styleVersion(),
glyphs: svc.glyphsUrl(),
sources: {
gaode: {
type: 'raster',
tiles: ["https://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}"],
}
},
layers: [{
id: 'gaode',
type: 'raster',
source: 'gaode',
}]
},
center: [0, 0],
zoom: 12,
pitch: 0,
renderWorldCopies: false // 不显示多屏地图
}); // 关联服务对象和投影对象
map.attach(svc, prj);
await map.onLoad(); // 先打开cad图
let mapId = "sys_cadcesium";
let res = await svc.openMap({
mapid: mapId, // 地图ID
mapopenway: vjmap.MapOpenWay.GeomRender, // 以几何数据渲染方式打开
style: vjmap.openMapLightStyle() // div为深色背景颜色时,这里也传深色背景样式
})
if (res.error) {
// 如果打开出错
message.error(res.error)
}
let layer = res.layer;//图层样式名 let cadEpsg = "EPSG:4544";// cad图的espg代号
// 增加cad的wms图层
let wmsUrl = svc.wmsTileUrl({
mapid: mapId, // 地图id
layers: layer, // 图层名称
srs: "EPSG:3857",
crs: cadEpsg,
webMapType: "GCJ02" // 底图是高德地图,所以要选GCJ02,如果是天地图,可以不用填此项
})
map.addSource('wms-test-source', {
'type': 'raster',
'tiles': [
wmsUrl
],
'tileSize': 256
});
map.addLayer({
'id': 'wms-test-layer',
'type': 'raster',
'source': 'wms-test-source',
'paint': { "raster-opacity": 1 }
}
);

在线体验地址:

https://vjmap.com/demo/#/demo/map/web/04webWmsGaode

优点

(1)能利用唯杰地图的SDK同时加载高德地图和CAD图

(2) CAD相关的功能开发不受限制

缺点

(1)由于加载互联网地图是利用了在线公共地图瓦片数据地址,所以数据不如高德SDK开发的效果好

​ (2) 由于高德地图的级别有限,导致CAD图缩放至一定级别后,不能再放大。如果图纸大的话,会导致级别不够的问题

​ (3) 因为底图是高德地图,所以整个地图的坐标系是高德的火星坐标,如果业务数据是CAD数据的话,都需要通过坐标转换才能加载到图上。

方法三: 唯杰地图SDK中CAD图上加载高德地图

原理

其原理同方法二。不同的是,此方法是以CAD图做为底图,高德地图做为一个图层去叠加CAD图层。

但是唯杰地图本身没有互联网地图数据,加载互联网地图是利用了在线公共地图瓦片数据地址,其地址没有提供互联网地图的WMS服务。所以此方法需要唯杰地图后台根据前端传递的高德瓦片WMTS地址,根据一定的算法转成WMS服务去适配CAD图。

实现

// --CAD图与互联网图叠加--CAD图与互联网图叠加显示,以CAD图为坐标系
// 假设我们希望CAD全图显示是对应级别为8级,这样地图缩小后,互联网地图还会显示
let initZoom = 8;
let style = {
backcolor: 0, // div为深色背景颜色时,这里也传深色背景样式
clipbounds: Math.pow(2, initZoom) // 只传值,不传范围,表示之前的范围放大多少倍
}
let svc = new vjmap.Service(env.serviceUrl, env.accessToken)
let res = await svc.openMap({
mapid: "sys_cad2000",
mapopenway: vjmap.MapOpenWay.GeomRender, // 以几何数据渲染方式打开
style: style
})
if (res.error) {
message.error(res.error)
}
let mapExtent = vjmap.GeoBounds.fromString(res.bounds);
let prj = new vjmap.GeoProjection(mapExtent);
let center = mapExtent.center();
let map = new vjmap.Map({
container: 'map', // container ID
style: svc.rasterStyle(),
center: prj.toLngLat(center),
zoom: initZoom,
renderWorldCopies: false
});
map.attach(svc, prj);
await map.onLoad(); // 增加高德地图底图
const addGaodeMap = async (isRoadway) => {
const tileUrl = svc.webMapUrl({
tileCrs: "gcj02",
tileUrl: isRoadway ? [
"https://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}"
] :
/* 如果用影像 */
[
"https://webst0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=6&x={x}&y={y}&z={z}",
"https://webst0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}"
],
tileSize: 256,
tileRetina: 1,
tileMaxZoom: 18,
tileShards: "1,2,3,4",
tileToken: "",
tileFlipY: false,
mapbounds: res.bounds,
srs: "EPSG:4527",// 可通过前两位获取 vjmap.transform.getEpsgParam(vjmap.transform.EpsgCrsTypes.CGCS2000, 39).epsg
// 因为sys_cad2000这个图只有6位,没有带系。需要在坐标转换前平移下带系 https://blog.csdn.net/thinkpang/article/details/124172626
fourParameterBefore: "39000000,0,1,0"
}) map.addSource('web-gaode-source', {
'type': 'raster',
'tiles': [
tileUrl
],
'tileSize': 256
});
map.addLayer({
'id': 'web-gaode-layer',
'type': 'raster',
'source': 'web-gaode-source',
'paint': { "raster-opacity": 1 }
}
);
let layers = map.getStyle().layers
// 把这个图层放至所有图层的最下面
map.moveLayer('web-gaode-layer', layers[0].id)

在线体验地址

https://vjmap.com/demo/#/demo/map/web/04webcadmap

优点

(1)能利用唯杰地图的SDK同时加载高德地图和CAD图

(2) CAD相关的功能开发不受限制

(3) 因为此方法是以CAD图为底图,所以坐标系和CAD图为坐标系。如果业务数据是CAD的数据,这样无需进行坐标转换就能直接显示在地图上,非常方便。

(4) 此方法不受高德地图的级别限制,即使图纸大的话,也不会造成级别不够的问题

缺点

(1)由于加载互联网地图是利用了在线公共地图瓦片数据地址,所以数据不如高德SDK开发的效果好

高德地图与CAD图叠加显示方法汇总及优缺点分析的更多相关文章

  1. CAD图与互联网地图网页端相互叠加显示技术分析和实现

    需求分析 之前相关的博文中介绍了如果在Web网页端展示CAD图形(唯杰地图云端图纸管理平台 https://vjmap.com/app/cloud),当一些CAD图纸有实际地理坐标位置时,如地形图等, ...

  2. 高德地图教程_poi搜索和显示

    通过高仿深圳的应用近期打算.UI我们已经做了,我见过APP查询界面.关闭网络也将是能够查询其指示数据被存储在数据库中,或者是第一网络,所有网站上的数据是好了.我想简单地使用查询地图提供了. 曾经是接触 ...

  3. iOS 高德地图轨迹回放的 思路, 及方法

    // 开始,公司要求制作一段跑步轨迹 在地图上的 动画回放, 传入一段经纬度, 开始一想,这不是很简单吗, 高德地图有可以把经纬度转换成坐标点的方法 /** * @brief 将经纬度转换为指定vie ...

  4. 提高Mxd地图渲染出图效率的方法

    测试 在ArcGIS地图渲染非常耗时,特别是标注较多时,下面是做的一些性能测试   小结 1.地图渲染的数据量是显示出图速度的关键.主要注意: (1)与数据库存储的数据量关系不大.例如数据库有1万条数 ...

  5. 高德地图——添加标记的两种方法&删除地标记的两种方法

    添加标记: 1.marker.setMap(map); 2.marker.add([marker]); 删除标记: 1.marker.setMap(null); 2 map.remove([marke ...

  6. 通过openlayers加载dwg格式的CAD图并与互联网地图叠加

    Openlayers介绍 ​ Openlayers是一个基于Javacript开发,免费.开源的前端地图开发库,使用它,可以很容易的开发出WebGIS系统.目前Openlayers支持地图瓦片.矢量数 ...

  7. 如何实现通过Leaflet加载dwg格式的CAD图

    前言 ​ 在前面介绍了通过openlayers加载dwg格式的CAD图并与互联网地图叠加,openlayers功能很全面,但同时也很庞大,入门比较难,适合于大中型项目中.而在中小型项目中,一般用开源的 ...

  8. AngularJS指令封装高德地图组件

    1 概述 公司移动门户原来是基于AngularJS指令封装的百度地图组件,用于签到.签退.定位等功能,在使用过程中发现百度地图频繁的弹出广告,所以打算重新引用其它地图组件,最后决定基于AngularJ ...

  9. 【高德地图API】从零开始学高德JS API(六)——坐标转换

    原文:[高德地图API]从零开始学高德JS API(六)——坐标转换 摘要:如何从GPS转到谷歌?如何从百度转到高德?这些都是小case.我们还提供,如何将基站cell_id转换为GPS坐标? --- ...

随机推荐

  1. bat-配置环境变量2-给PATH追加环境变量

    使用setx /M path "%path%;%%winrar%%"这种方式修改环境变量存在的问题 对于 path 这种 既有用户级变量和系统级变量的变量 直接使用setx /M ...

  2. vmware修改虚拟机网卡mac地址

    选中"虚拟机" 右键 "设置",然后选中"网络适配器",然后点击"高级",设置"MAC地址"

  3. 全新升级的AOP框架Dora.Interception[6]: 框架设计和实现原理

    本系列前面的五篇文章主要介绍Dora.Interception(github地址,觉得不错不妨给一颗星)的编程模式以及对它的扩展定制,现在我们来聊聊它的设计和实现原理.(拙著<ASP.NET C ...

  4. HMS Core音频编辑服务3D音频技术,助力打造沉浸式听觉盛宴

    2022年6月28日,HDD·HMS Core.Sparkle影音娱乐沙龙在线上与开发者们见面.HMS Core音频编辑服务(Audio Editor Kit)专家为大家详细分享了基于分离的3D音乐创 ...

  5. PowerDesigner安装

    1.双击安装包进行安装 2.选择PRC 3.一路往下就行 4.将下图文件夹中的内容覆盖安装的内容 ----------------------------------------分割线 5.安装成功 ...

  6. 本地使用 Docker Compose 与 Nestjs 快速构建基于 Dapr 的 Redis 发布/订阅分布式应用

    Dapr(分布式应用程序运行时)介绍 Dapr 是一个可移植的.事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的.无状态和有状态的应用程序,并可运行在云平台或边缘计算中,它同时也支持多种编程语言 ...

  7. 部署yum仓库

    YUM介绍 YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器. 基于RPM包管理,能够从指定的 ...

  8. C#基础语法之-泛型

    泛型:一共7个知识点 1.引入泛型,延迟声明 2.如何声明和使用泛型 3.泛型的好处和原理 4.泛型类,泛型方法,泛型接口,泛型委托 5.泛型约束 6.协变,逆变 7.泛型缓存 一.为啥会出现泛型,有 ...

  9. 2022-07-25 第四组 java之抽象、接口

    目录 一.抽象类 1.概念 2.抽象类以及抽象方法格式定义 3.抽象类总结规定 二.接口 1.什么是接口 2.接口的定义 3.接口特性 4.抽象类和接口的区别 5.继承抽象类和实现接口的异同 6.规则 ...

  10. YII 技巧

    大部分来源于  https://getyii.com/topic/47#comment24 获取当前Controller name和action name(在控制器里面使用) echo $this-& ...