Files
ezbookkeeping/src/lib/map/amap.js
T
2023-06-18 15:43:27 +08:00

170 lines
5.3 KiB
JavaScript

import { asyncLoadAssets } from '@/lib/misc.js';
import services from '@/lib/services.js';
import settings from '@/lib/settings.js';
import logger from '@/lib/logger.js';
const amapHolder = {
AMap: null
};
export function loadAmapAssets() {
if (amapHolder.AMap) {
return;
}
if (!window._AMapSecurityConfig) {
const amapSecurityConfig = {};
if (settings.getAmapSecurityVerificationMethod() === 'internalproxy') {
amapSecurityConfig.serviceHost = services.generateAmapApiInternalProxyUrl();
} else if (settings.getAmapSecurityVerificationMethod() === 'externalproxy') {
amapSecurityConfig.serviceHost = settings.getAmapApiExternalProxyUrl();
} else if (settings.getAmapSecurityVerificationMethod() === 'plaintext') {
amapSecurityConfig.securityJsCode = settings.getAmapApplicationSecret();
}
window._AMapSecurityConfig = amapSecurityConfig;
}
if (!window.onAMapCallback) {
window.onAMapCallback = () => {
amapHolder.AMap = window.AMap;
};
}
return asyncLoadAssets('js', services.generateAmapJavascriptUrl('onAMapCallback'));
}
export function createAmapHolder() {
return {
mapProvider: 'amap',
dependencyLoaded: !!amapHolder.AMap,
inited: false,
defaultZoomLevel: 14,
minZoomLevel: 1,
amapInstance: null,
amapToolbar: null,
amapCenterPosition: null,
amapCenterMarker: null
};
}
export function createAmapInstance(mapHolder, mapContainer, options) {
if (!amapHolder.AMap) {
return null;
}
const AMap = amapHolder.AMap;
const amapInstance = new AMap.Map(mapContainer, {
zoom: options.zoomLevel,
center: [ options.initCenter.longitude, options.initCenter.latitude ],
zooms: [ 1, 19 ],
jogEnable: false
});
AMap.plugin([
'AMap.ToolBar'
], function() {
mapHolder.amapToolbar = new AMap.ToolBar({
position: 'LT'
});
amapInstance.addControl(mapHolder.amapToolbar);
});
mapHolder.amapInstance = amapInstance;
mapHolder.inited = true;
}
export function setAmapCenterTo(mapHolder, center, zoomLevel) {
if (!amapHolder.AMap || !mapHolder.amapInstance) {
return;
}
const AMap = amapHolder.AMap;
if (amapHolder.amapCenterPosition
&& amapHolder.amapCenterPosition.originalLongitude === center.longitude
&& amapHolder.amapCenterPosition.originalLatitude === center.latitude
&& amapHolder.amapCenterPosition.convertedLongitude
&& amapHolder.amapCenterPosition.convertedLatitude
) {
mapHolder.amapInstance.setZoomAndCenter(zoomLevel, new AMap.LngLat(amapHolder.amapCenterPosition.convertedLongitude, amapHolder.amapCenterPosition.convertedLatitude));
return;
}
amapHolder.amapCenterPosition = {
originalLongitude: center.longitude,
originalLatitude: center.latitude,
convertedLongitude: null,
convertedLatitude: null
};
const centerPoint = new AMap.LngLat(center.longitude, center.latitude);
AMap.convertFrom(centerPoint, 'gps', (status, result) => {
let convertedCenterPoint = centerPoint;
if (result.info !== 'ok' || !result.locations) {
logger.warn('amap geo position convert failed');
} else {
convertedCenterPoint = result.locations[0];
amapHolder.amapCenterPosition.convertedLongitude = convertedCenterPoint.getLng();
amapHolder.amapCenterPosition.convertedLatitude = convertedCenterPoint.getLat();
}
mapHolder.amapInstance.setZoomAndCenter(zoomLevel, convertedCenterPoint);
});
}
export function setAmapCenterMaker(mapHolder, position) {
if (!amapHolder.AMap || !mapHolder.amapInstance) {
return;
}
const AMap = amapHolder.AMap;
const setMaker = function (point) {
if (!mapHolder.amapCenterMarker) {
mapHolder.amapCenterMarker = new AMap.Marker({
position: point
});
mapHolder.amapInstance.add(mapHolder.amapCenterMarker);
} else {
mapHolder.amapCenterMarker.setPosition(point);
}
}
if (amapHolder.amapCenterPosition
&& amapHolder.amapCenterPosition.originalLongitude === position.longitude
&& amapHolder.amapCenterPosition.originalLatitude === position.latitude
&& amapHolder.amapCenterPosition.convertedLongitude
&& amapHolder.amapCenterPosition.convertedLatitude
) {
setMaker(new AMap.LngLat(amapHolder.amapCenterPosition.convertedLongitude, amapHolder.amapCenterPosition.convertedLatitude));
return;
}
const markerPoint = new AMap.LngLat(position.longitude, position.latitude);
AMap.convertFrom(markerPoint, 'gps', (status, result) => {
let convertedMarkPoint = markerPoint;
if (result.info !== 'ok' || !result.locations) {
logger.warn('amap geo position convert failed');
} else {
convertedMarkPoint = result.locations[0];
}
setMaker(convertedMarkPoint);
});
}
export function removeAmapCenterMaker(mapHolder) {
if (!mapHolder.amapInstance || !mapHolder.amapCenterMarker) {
return;
}
mapHolder.amapInstance.remove(mapHolder.amapCenterMarker);
mapHolder.amapCenterMarker = null;
}