7 changed files with 324 additions and 3 deletions
@ -0,0 +1,26 @@ |
|||
let amapKey = process.env.VUE_APP_MAP_KEY |
|||
let amapVersion = '2.0' |
|||
let _createScript = url => { |
|||
let jsapi = document.createElement('script') |
|||
jsapi.charset = 'utf-8' |
|||
jsapi.src = url |
|||
document.head.appendChild(jsapi) |
|||
} |
|||
|
|||
export default () => { |
|||
return new Promise((resolve, reject) => { |
|||
if (!window.AMap) { // 判断window下有没有AMap对象,再判断是否引入cdn地图
|
|||
_createScript(`https://webapi.amap.com/maps?v=${amapVersion}&key=${amapKey}.Key&callback=aMapInitCallback`) |
|||
window.aMapInitCallback = () => { |
|||
_createScript('//webapi.amap.com/ui/1.1/main.js&callback=amapUiCallback') |
|||
// 创建定时器 当AMapUI有值的时候 清除定时器 并resolve
|
|||
let interval = setInterval(() => { |
|||
if (window.AMapUI) { |
|||
clearInterval(interval) |
|||
resolve(window.AMap) |
|||
} |
|||
}, 50) |
|||
} |
|||
} else resolve(window.AMap) |
|||
}) |
|||
} |
@ -0,0 +1,35 @@ |
|||
<template> |
|||
<div class="p-map"> |
|||
<div id="mapContainer"> |
|||
<!--渲染地图的div--> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import MapLoader from '@/components/form/InputMap/amap.js' |
|||
export default { |
|||
name: 'Index', |
|||
created() { |
|||
this.loadMap() |
|||
}, |
|||
methods: { |
|||
loadMap() { |
|||
const _this = this |
|||
MapLoader().then(AMap => { |
|||
console.log('地图加载成功') |
|||
this.map = new AMap.Map('mapContainer', { |
|||
center: [117.000923, 36.675807], |
|||
zoom: 6 |
|||
}) |
|||
// map初始化插件 |
|||
AMap.plugin(['AMap.ToolBar'], function() { |
|||
_this.map.addControl(new AMap.ToolBar()) |
|||
}) |
|||
}, e => { |
|||
console.log('地图加载失败', e) |
|||
}) |
|||
} |
|||
} |
|||
} |
|||
</script> |
@ -0,0 +1,253 @@ |
|||
<!--<template>--> |
|||
<!-- <div :class="b()">--> |
|||
<!-- <el-input ref="main"--> |
|||
<!-- v-model="address"--> |
|||
<!-- :size="size"--> |
|||
<!-- :clearable="disabled?false:clearable"--> |
|||
<!-- :disabled="disabled"--> |
|||
<!-- :placeholder="placeholder"--> |
|||
<!-- @clear="handleClear"--> |
|||
<!-- @focus="handleShow"--> |
|||
<!-- @click.native="handleClick"--> |
|||
<!-- />--> |
|||
|
|||
<!-- <el-dialog class="avue-dialog"--> |
|||
<!-- width="80%"--> |
|||
<!-- append-to-body--> |
|||
<!-- :title="placeholder"--> |
|||
<!-- :visible.sync="box"--> |
|||
<!-- @close="handleClose"--> |
|||
<!-- >--> |
|||
<!-- <div v-if="box"--> |
|||
<!-- :class="b('content')"--> |
|||
<!-- >--> |
|||
<!-- <el-input id="map__input"--> |
|||
<!-- v-model="formattedAddress"--> |
|||
<!-- :class="b('content-input')"--> |
|||
<!-- :size="size"--> |
|||
<!-- :readonly="disabled"--> |
|||
<!-- clearable--> |
|||
<!-- placeholder="输入关键字选取地点"--> |
|||
<!-- @clear="clear"--> |
|||
<!-- />--> |
|||
<!-- <div :class="b('content-box')">--> |
|||
<!-- <div id="map__container"--> |
|||
<!-- :class="b('content-container')"--> |
|||
<!-- tabindex="0"--> |
|||
<!-- />--> |
|||
<!-- <div id="map__result"--> |
|||
<!-- :class="b('content-result')"--> |
|||
<!-- />--> |
|||
<!-- </div>--> |
|||
<!-- </div>--> |
|||
<!-- <span slot="footer"--> |
|||
<!-- class="dialog-footer"--> |
|||
<!-- >--> |
|||
<!-- <el-button v-if="!(disabled || readonly)"--> |
|||
<!-- type="primary"--> |
|||
<!-- :size="size"--> |
|||
<!-- icon="el-icon-check"--> |
|||
<!-- @click="handleSubmit"--> |
|||
<!-- >确 定</el-button>--> |
|||
<!-- </span>--> |
|||
<!-- </el-dialog>--> |
|||
<!-- </div>--> |
|||
<!--</template>--> |
|||
<!--<script>--> |
|||
<!--import packages from 'core/packages'--> |
|||
<!--import create from 'core/create'--> |
|||
<!--import props from '../../core/common/props.js'--> |
|||
<!--import event from '../../core/common/event.js'--> |
|||
<!--export default create({--> |
|||
<!-- name: 'input-map',--> |
|||
<!-- mixins: [props(), event()],--> |
|||
<!-- data() {--> |
|||
<!-- return {--> |
|||
<!-- formattedAddress: '',--> |
|||
<!-- address: '',--> |
|||
<!-- poi: {},--> |
|||
<!-- marker: null,--> |
|||
<!-- map: null,--> |
|||
<!-- box: false--> |
|||
<!-- }--> |
|||
<!-- },--> |
|||
<!-- watch: {--> |
|||
<!-- poi(val) {--> |
|||
<!-- this.formattedAddress = val.formattedAddress--> |
|||
<!-- },--> |
|||
<!-- value(val) {--> |
|||
<!-- if (this.validatenull(val)) {--> |
|||
<!-- this.poi = {}--> |
|||
<!-- }--> |
|||
<!-- },--> |
|||
<!-- text(val) {--> |
|||
<!-- if (!this.validatenull(val)) {--> |
|||
<!-- this.poi = {--> |
|||
<!-- longitude: val[0],--> |
|||
<!-- latitude: val[1],--> |
|||
<!-- formattedAddress: val[2]--> |
|||
<!-- }--> |
|||
<!-- this.address = val[2]--> |
|||
<!-- }--> |
|||
<!-- },--> |
|||
<!-- box: {--> |
|||
<!-- handler() {--> |
|||
<!-- if (this.box) {--> |
|||
<!-- this.$nextTick(() =>--> |
|||
<!-- this.init(() => {--> |
|||
<!-- if (this.longitude && this.latitude) {--> |
|||
<!-- this.addMarker(this.longitude, this.latitude)--> |
|||
<!-- this.getAddress(this.longitude, this.latitude)--> |
|||
<!-- }--> |
|||
<!-- })--> |
|||
<!-- )--> |
|||
<!-- }--> |
|||
<!-- },--> |
|||
<!-- immediate: true--> |
|||
<!-- }--> |
|||
<!-- },--> |
|||
<!-- computed: {--> |
|||
<!-- longitude() {--> |
|||
<!-- return this.text[0]--> |
|||
<!-- },--> |
|||
<!-- latitude() {--> |
|||
<!-- return this.text[1]--> |
|||
<!-- },--> |
|||
<!-- title() {--> |
|||
<!-- return (this.disabled || this.readonly) ? '查看' : '选择'--> |
|||
<!-- }--> |
|||
<!-- },--> |
|||
<!-- methods: {--> |
|||
<!-- clear() {--> |
|||
<!-- this.poi = {}--> |
|||
<!-- this.clearMarker()--> |
|||
<!-- },--> |
|||
<!-- handleSubmit() {--> |
|||
<!-- this.setVal()--> |
|||
<!-- this.box = false--> |
|||
<!-- },--> |
|||
<!-- handleClear() {--> |
|||
<!-- this.text = []--> |
|||
<!-- this.poi = {}--> |
|||
<!-- this.handleChange(this.text)--> |
|||
<!-- },--> |
|||
<!-- setVal() {--> |
|||
<!-- this.text = [this.poi.longitude, this.poi.latitude, this.poi.formattedAddress]--> |
|||
<!-- this.handleChange(this.text)--> |
|||
<!-- },--> |
|||
<!-- handleShow() {--> |
|||
<!-- this.$refs.main.blur()--> |
|||
<!-- this.box = true--> |
|||
<!-- },--> |
|||
<!-- // 新增坐标--> |
|||
<!-- addMarker(R, P) {--> |
|||
<!-- this.clearMarker()--> |
|||
<!-- this.marker = new window.AMap.Marker({--> |
|||
<!-- position: [R, P]--> |
|||
<!-- })--> |
|||
<!-- this.marker.setMap(this.map)--> |
|||
<!-- },--> |
|||
<!-- // 清空坐标--> |
|||
<!-- clearMarker() {--> |
|||
<!-- if (this.marker) {--> |
|||
<!-- this.marker.setMap(null)--> |
|||
<!-- this.marker = null--> |
|||
<!-- }--> |
|||
<!-- },--> |
|||
<!-- // 获取坐标--> |
|||
<!-- getAddress(R, P) {--> |
|||
<!-- new window.AMap.service('AMap.Geocoder', () => {--> |
|||
<!-- // 回调函数--> |
|||
<!-- let geocoder = new window.AMap.Geocoder({})--> |
|||
<!-- geocoder.getAddress([R, P], (status, result) => {--> |
|||
<!-- if (status === 'complete' && result.info === 'OK') {--> |
|||
<!-- const regeocode = result.regeocode--> |
|||
<!-- this.poi = Object.assign(regeocode, {--> |
|||
<!-- longitude: R,--> |
|||
<!-- latitude: P--> |
|||
<!-- })--> |
|||
<!-- // 自定义点标记内容--> |
|||
<!-- var markerContent = document.createElement('div')--> |
|||
|
|||
<!-- // 点标记中的图标--> |
|||
<!-- var markerImg = document.createElement('img')--> |
|||
<!-- markerImg.src =--> |
|||
<!-- '//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png'--> |
|||
<!-- markerContent.appendChild(markerImg)--> |
|||
|
|||
<!-- // 点标记中的文本--> |
|||
<!-- var markerSpan = document.createElement('span')--> |
|||
<!-- markerSpan.className = 'avue-input-map__marker'--> |
|||
<!-- markerSpan.innerHTML = this.poi.formattedAddress--> |
|||
<!-- markerContent.appendChild(markerSpan)--> |
|||
<!-- this.marker.setContent(markerContent) // 更新点标记内容--> |
|||
<!-- }--> |
|||
<!-- })--> |
|||
<!-- })--> |
|||
<!-- },--> |
|||
<!-- handleClose() {--> |
|||
<!-- window.poiPicker.clearSearchResults()--> |
|||
<!-- },--> |
|||
<!-- addClick() {--> |
|||
<!-- this.map.on('click', e => {--> |
|||
<!-- if (this.disabled || this.readonly) return--> |
|||
<!-- const lnglat = e.lnglat--> |
|||
<!-- const P = lnglat.P || lnglat.Q--> |
|||
<!-- const R = lnglat.R--> |
|||
<!-- this.addMarker(R, P)--> |
|||
<!-- this.getAddress(R, P)--> |
|||
<!-- })--> |
|||
<!-- },--> |
|||
<!-- init(callback) {--> |
|||
<!-- if (!window.AMap) {--> |
|||
<!-- packages.logs('Map')--> |
|||
<!-- return--> |
|||
<!-- }--> |
|||
<!-- this.map = new window.AMap.Map('map__container', Object.assign({--> |
|||
<!-- zoom: 13,--> |
|||
<!-- center: (() => {--> |
|||
<!-- if (this.longitude && this.latitude) return [this.longitude, this.latitude]--> |
|||
<!-- })()--> |
|||
<!-- }, this.params))--> |
|||
<!-- this.initPoip()--> |
|||
<!-- this.addClick()--> |
|||
<!-- callback()--> |
|||
<!-- },--> |
|||
<!-- initPoip() {--> |
|||
<!-- if (!window.AMapUI) {--> |
|||
<!-- packages.logs('MapUi')--> |
|||
<!-- return--> |
|||
<!-- }--> |
|||
<!-- window.AMapUI.loadUI(['misc/PoiPicker'], PoiPicker => {--> |
|||
<!-- var poiPicker = new PoiPicker({--> |
|||
<!-- input: 'map__input',--> |
|||
<!-- placeSearchOptions: {--> |
|||
<!-- map: this.map,--> |
|||
<!-- pageSize: 10--> |
|||
<!-- },--> |
|||
<!-- searchResultsContainer: 'map__result'--> |
|||
<!-- })--> |
|||
<!-- // 初始化poiPicker--> |
|||
<!-- this.poiPickerReady(poiPicker)--> |
|||
<!-- })--> |
|||
<!-- },--> |
|||
<!-- poiPickerReady(poiPicker) {--> |
|||
<!-- window.poiPicker = poiPicker--> |
|||
<!-- // 选取了某个POI--> |
|||
<!-- poiPicker.on('poiPicked', poiResult => {--> |
|||
<!-- this.clearMarker()--> |
|||
<!-- var source = poiResult.source,--> |
|||
<!-- poi = poiResult.item--> |
|||
<!-- this.poi = Object.assign(poi, {--> |
|||
<!-- formattedAddress: poi.name,--> |
|||
<!-- longitude: poi.location.R,--> |
|||
<!-- latitude: poi.location.P || poi.location.Q--> |
|||
<!-- })--> |
|||
<!-- if (source !== 'search') {--> |
|||
<!-- poiPicker.searchByKeyword(poi.name)--> |
|||
<!-- }--> |
|||
<!-- })--> |
|||
<!-- }--> |
|||
<!-- }--> |
|||
<!--})--> |
|||
<!--</script>--> |
Loading…
Reference in new issue