当前位置:   article > 正文

离线高德地图_js 离线地图

js 离线地图

最近公司需要内网开发,使用到高德地图,正好碰到,在这里记录一下。本博客中实现了离线高德地图显示,点聚合,非聚合点自定义图标,图标点击弹出信息框,框选,圈选区域这些功能。

效果图:

实现思路:

1、下载地图瓦片数据,gitee有个开源地图瓦片下载项目,我fork了一下,地图下载器

如果有fork失败的兄弟,可以找我私信要。

2、下载高德地图离线2.0JS API,高德地图离线地图api地址

amap文件夹放在public下边,和瓦片数据同一级。

声明

  • 本离线包基于高德地图js-api2.0,在此基础进行修改。
  • 本项目仅为个人兴趣开发,不收费,作者也不提供任何付费服务。
  • 本项目仅供个人学习研究使用。
  • 本项目禁止商用,禁止在企业项目开发中使用此地图离线包,禁止使用此离线包以及基于此项目二次开发的软件从事盈利活动。

3、第一步和第二步已经能实现简单的高德地图渲染了,但是我们加载地图肯定是需要别的操作,比如点聚合,非聚合点自定义图标,图标点击弹出信息框,框选,圈选区域这些功能。这时候就需要我们我们自带的AMap3.js可能没有或者对应的插件包报错,我们就应该添加新的插件对应的js。

下载方法,本地项目中引入在线的高德地图,plugins中把我们需要的插件添加进去。

然后运行起来,在网页端network中下载对应的js,然后查找关键字_jsload_,把我们新添加插件对应的这一串添加到我们本地AMap3.js的最下边就OK了。

基本步骤就说清楚了,下边是一些显示,点聚合,非聚合点自定义图标,图标点击弹出信息框的代码。

  1. //初始化
  2. async initData() {
  3. //定义地图
  4. const base_url = "../../";
  5. const layers = [new AMap.TileLayer({
  6. getTileUrl: function (x, y, z) {
  7. return `${base_url}MAP_zxy/${z}/${x}/${y}.png`;
  8. },
  9. opacity: 1,
  10. zIndex: 99,
  11. })]
  12. this.map = new AMap.Map('container', { // 设置地图容器id
  13. zoom: 10,
  14. resizeEnable: true,
  15. rotateEnable: true,
  16. pitchEnable: true,
  17. // center: [104.96824,33.375687],
  18. center: [103.847998, 36.067468],
  19. defaultCursor: 'pointer',
  20. showLabel: true, //是否显示文字标注
  21. layers: layers
  22. })
  23. //聚合打点
  24. this.addCluster();
  25. //定义鼠标框选工具
  26. this.mouseTool = new AMap.MouseTool(this.map);
  27. const that = this;
  28. this.mouseTool.on('draw', function (event) {
  29. that.markerForFigure = [];
  30. that.mouseTool.close(false);
  31. // 获取所有点
  32. var allMarkers = that.map.getAllOverlays('marker');
  33. var eObject = event.obj;//obj覆盖物对象。
  34. allMarkers.forEach((marker => {
  35. var markerInPolygon = eObject.contains(marker.getPosition());//是否包含marker
  36. if (markerInPolygon) {
  37. that.markerForFigure.push(marker)
  38. }
  39. }));
  40. console.log(that.markerForFigure, "被选中的标记")
  41. });
  42. },
  43. addCluster() {
  44. let pointers = [];
  45. if (this.rawData) {
  46. this.rawData.map((value, index) => {
  47. if (value.longitude !== undefined && value.latitude !== undefined) {
  48. pointers.push({
  49. weight: 1,
  50. lnglat: [
  51. this.toFixedDigit(value.longitude - 0, 5),
  52. this.toFixedDigit(value.latitude - 0, 5),
  53. ],
  54. deviceId: value.deviceId,
  55. deviceCode: value.channelId,
  56. deviceName: value.channelName,
  57. orgCode: value.orgCode,
  58. isOnline: value.psOnlineState,
  59. manufacture: value.manufacture,
  60. });
  61. this.allPointers = pointers;
  62. }
  63. });
  64. }
  65. if (this.cluster && this.cluster != null) { //1. 如果存在 cluster 说明已经初始化过了,直接使用,变更它的点的内容就可以了。
  66. this.cluster.setData(pointers);
  67. } else {//2. 如果没有 cluster 就进行初始化。
  68. this.infoWindow = new AMap.InfoWindow({ closeWhenClickMap: true, offset: new AMap.Pixel(0, -30) });
  69. this.cluster = new AMap.MarkerCluster(
  70. this.map, // 地图实例
  71. pointers, // 海量点数据,数据中需包含经纬度信息字段 lnglat
  72. {
  73. gridSize: 60,// 设置网格像素大小
  74. // renderClusterMarker: this.renderClusterMarker, // 自定义聚合点样式
  75. renderMarker: this.renderMarker, // 自定义非聚合点样式
  76. }
  77. )
  78. }
  79. this.cluster.on('click', (item) => {
  80. //此处是通过包含点的数量判断是否是聚合点,不是聚合点就执行上方单个点的点击方式
  81. if (item.clusterData.length <= 1) {
  82. return;
  83. }
  84. //这里是计算所有聚合点的中心点
  85. let alllng = 0, alllat = 0;
  86. for (const mo of item.clusterData) {
  87. alllng += mo.lnglat.lng;
  88. alllat += mo.lnglat.lat;
  89. }
  90. const lat = alllat / item.clusterData.length;
  91. const lng = alllng / item.clusterData.length;
  92. //这里是放大地图,此处写死了每次点击放大的级别,可以根据点的数量和当前大小适应放大,体验更佳
  93. this.map.setZoomAndCenter(this.map.getZoom() + 4, [lng, lat]);
  94. });
  95. },
  96. //格式化经纬度
  97. toFixedDigit(num, n) {
  98. //保留n位
  99. if (typeof num != "number") {
  100. return false;
  101. }
  102. num = num.toString();
  103. var result = "";
  104. var zeroResult = function (n) {
  105. var zero = "";
  106. for (var i = 0; i < n; i++) {
  107. zero += "0";
  108. }
  109. return zero;
  110. };
  111. if (num % 1 == 0) {
  112. //整数
  113. result = num + "." + zeroResult(n);
  114. } else {
  115. //小数
  116. var num1 = num.split(".");
  117. if (num1[1].length < n) {
  118. result = num1[0] + "." + num1[1] + zeroResult(n - num1[1].length);
  119. } else {
  120. result = num1[0] + "." + num1[1].substring(0, n);
  121. }
  122. }
  123. return result;
  124. },
  125. //自定义非聚合点样式
  126. renderMarker(context) {
  127. const { marker, data } = context;
  128. let iconOn = new AMap.Icon({
  129. size: new AMap.Size(66, 80), // 图标尺寸
  130. image: require(`../../assets/images/video-online.png`), // Icon的图像
  131. imageSize: new AMap.Size(38, 50), // 根据所设置的大小拉伸或压缩图片
  132. });
  133. let iconOff = new AMap.Icon({
  134. size: new AMap.Size(66, 80), // 图标尺寸
  135. image: require(`../../assets/images/video-offline.png`), // Icon的图像
  136. imageSize: new AMap.Size(38, 50), // 根据所设置的大小拉伸或压缩图片
  137. });
  138. if (data[0].isOnline == '1') {
  139. marker.setIcon(iconOn)
  140. } else if (data[0].isOnline == '0') {
  141. marker.setIcon(iconOff)
  142. }
  143. marker.on("click", (e) => {
  144. this.singleData = [];
  145. console.log(this.$refs.infoWindow);
  146. this.allPointers.forEach(item => {
  147. if (item.deviceId == data[0].deviceId) {
  148. this.singleData.push(item)
  149. }
  150. })
  151. console.log(this.singleData);
  152. this.$nextTick(()=>{
  153. this.openInfoWindow(e)
  154. })
  155. });
  156. },
  157. openInfoWindow(e) {
  158. this.infoWindow = new AMap.InfoWindow({
  159. isCustom: true,
  160. autoMove: true,
  161. avoid: [20, 20, 20, 20],
  162. content: this.$refs.infoWindow,
  163. closeWhenClickMap: true,
  164. offset: new AMap.Pixel(16, -40)
  165. })
  166. this.infoWindow.open(this.map, e.target.getPosition())
  167. },
  168. // 线段
  169. drawPolyline() {
  170. this.mouseTool.polyline({
  171. strokeColor: "#3366FF",
  172. strokeOpacity: 1,
  173. strokeWeight: 6,
  174. // 线样式还支持 'dashed'
  175. strokeStyle: "solid",
  176. // strokeStyle是dashed时有效
  177. // strokeDasharray: [10, 5],
  178. })
  179. },
  180. // 多边形
  181. drawPolygon() {
  182. this.mouseTool.close(true)
  183. this.mouseTool.polygon({
  184. strokeColor: "#FF33FF",
  185. strokeOpacity: 1,
  186. strokeWeight: 6,
  187. // strokeOpacity: 0.2,
  188. fillColor: '#1791fc',
  189. fillOpacity: 0.4,
  190. // 线样式还支持 'dashed'
  191. strokeStyle: "solid",
  192. // strokeStyle是dashed时有效
  193. // strokeDasharray: [30,10],
  194. })
  195. },
  196. // 矩形
  197. drawRectangle() {
  198. this.mouseTool.close(true)
  199. this.mouseTool.rectangle({
  200. strokeColor: 'red',
  201. strokeOpacity: 0.5,
  202. strokeWeight: 6,
  203. fillColor: 'blue',
  204. fillOpacity: 0.5,
  205. // strokeStyle还支持 solid
  206. strokeStyle: 'solid',
  207. // strokeDasharray: [30,10],
  208. })
  209. },

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/824546
推荐阅读
相关标签
  

闽ICP备14008679号