/* * @Description : * @Version : 1.0 * @Author : Shiming * @Date : 2021-12-24 15:37:00 * @LastEditors : Shiming * @LastEditTime : 2022-02-18 10:45:06 * @FilePath : \\tms-obc-web\\src\\app\\shared\\components\\amap\\amap.service.ts * Copyright (C) 2022 huzhenhong. All rights reserved. */ import { Injectable } from '@angular/core'; import { Observable, Subject, throwError } from 'rxjs'; import AMapLoader from '@amap/amap-jsapi-loader'; import { amapConf } from '@conf/amap.config'; import { formatDate } from '@angular/common'; import { DateTimePickerUtil } from '@delon/util'; declare var AMap: any; declare var AMapUI: any; const CONFIG = amapConf; @Injectable({ providedIn: 'root' }) export class AmapService { constructor() {} sub = new Subject(); currentSub = new Subject(); //计算路径驾车最优路线的长度与所需时间 drivingCompute(starts: any[], ends: any[]): Observable { AMap.plugin('AMap.Driving', () => { let driving = new AMap.Driving({ // 驾车路线规划策略,AMap.DrivingPolicy.LEAST_TIME是最快捷模式 policy: AMap.DrivingPolicy.LEAST_TIME }); const points = starts.concat(ends).map(item => { return { keyword: item.detailedAddress, city: item.city }; }); driving.search(points, (status: any, result: any) => { const repData = { distance: (result?.routes?.[0]?.distance / 1000).toFixed(2), time: (result?.routes?.[0]?.time / 60 / 60).toFixed(2) }; this.sub.next(repData); }); }); return this.sub; } getCurrentPosition(): Observable { AMapLoader.load({ key: CONFIG.key, version: CONFIG.version, plugins: [ // 需要使用的的插件列表,如比例尺'AMap.Scale'等 'AMap.PathSimplifier' ], AMapUI: { version: CONFIG.AMapUIVersion, plugins: ['misc/PathSimplifier'] // 需要加载的 AMapUI ui插件 } }) .then(AMap => { AMap.plugin('AMap.Geolocation', () => { let driving = new AMap.Geolocation({ enableHighAccuracy: true, //是否使用高精度定位,默认:true timeout: 10000, //超过10秒后停止定位,默认:5s buttonPosition: 'RB', //定位按钮的停靠位置 buttonOffset: new AMap.Pixel(10, 20), //定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20) zoomToAccuracy: true //定位成功后是否自动调整地图视野到定位点 }); driving.getCurrentPosition((status: string, result: any) => { if (status == 'complete') { this.currentSub.next(result); } else { console.log('定位获取失败', result); } }); }); }) .catch(e => { throwError(e); }); return this.currentSub; } /** * 增加标记点 * * @param poi */ setPOI(poi: POI, aMap: any) { AMapUI.loadUI(['overlay/SimpleMarker'], (SimpleMarker: any) => { //启动页面 new SimpleMarker({ //普通文本 iconLabel: { //普通文本 innerHTML: poi.markerLabel, //设置样式 style: { color: '#fff', fontSize: '110%', marginTop: '2px' } }, iconStyle: poi.color, map: aMap, position: poi.position }); }); } formatTime(time: string): string { if (!time) { return ''; } return `${time.slice(0, 4)}-${time.slice(4, 6)}-${time.slice(6, 8)} ${time.slice(9, 11)}:${time.slice(11, 13)}:${time.slice(13, 15)}`; } } export interface POI { markerLabel?: string; title: string; color: string; position: string[]; } export interface InfoItem { title?: string; content?: string; time?: string; position: string[]; } export interface MapList { name: string; time: string; lnglat: string[]; } export interface PathList { name: string; points: MapList[]; }