346 lines
9.0 KiB
Vue
346 lines
9.0 KiB
Vue
|
|
<template>
|
||
|
|
<view>
|
||
|
|
<view class="fixedheader">
|
||
|
|
<headers :showBack="true">
|
||
|
|
<view class="headerName"> 当前位置 </view>
|
||
|
|
</headers>
|
||
|
|
</view>
|
||
|
|
<view class="content" :style="{ paddingTop: mobileTopHeight + fixedHeaderHeight + 'px' }" v-show="showMap">
|
||
|
|
<view class="search-box">
|
||
|
|
<input class="search-input" v-model="searchVal" placeholder="请输入地点" />
|
||
|
|
<button class="search-btn" size="mini" type="primary" @click="searchArea">搜索</button>
|
||
|
|
</view>
|
||
|
|
<map
|
||
|
|
id="map"
|
||
|
|
:style="{
|
||
|
|
width: mapConfig.width + 'px',
|
||
|
|
height: mapConfig.height + 'px',
|
||
|
|
margin: 0
|
||
|
|
}"
|
||
|
|
:show-scale="true"
|
||
|
|
:scale="mapConfig.scale"
|
||
|
|
:latitude="mapConfig.latitude"
|
||
|
|
:longitude="mapConfig.longitude"
|
||
|
|
:markers="mapConfig.markers"
|
||
|
|
:circles="mapConfig.circles"
|
||
|
|
></map>
|
||
|
|
</view>
|
||
|
|
</view>
|
||
|
|
</template>
|
||
|
|
|
||
|
|
<script>
|
||
|
|
let mapSearch = weex.requireModule('mapSearch')
|
||
|
|
export default {
|
||
|
|
data() {
|
||
|
|
return {
|
||
|
|
mobileTopHeight: 0,
|
||
|
|
fixedHeaderHeight: 0,
|
||
|
|
mapConfig: {
|
||
|
|
width: 0,
|
||
|
|
height: 0,
|
||
|
|
scale: 14,
|
||
|
|
latitude: undefined,
|
||
|
|
longitude: undefined,
|
||
|
|
markers: [], // 定位配置
|
||
|
|
circles: [], // 显示圆配置
|
||
|
|
address: ''
|
||
|
|
},
|
||
|
|
showMap: false,
|
||
|
|
coordType: 'gcj02',
|
||
|
|
map: null,
|
||
|
|
standOptions: [30, 50, 100, 200, 300],
|
||
|
|
searchVal: ''
|
||
|
|
}
|
||
|
|
},
|
||
|
|
async mounted() {
|
||
|
|
let that = this
|
||
|
|
uni.getSystemInfo({
|
||
|
|
success(res) {
|
||
|
|
that.mobileTopHeight = res.statusBarHeight ? res.statusBarHeight : 0
|
||
|
|
uni.setStorageSync('systemInfo', res)
|
||
|
|
console.log(res)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
let info = uni.getWindowInfo()
|
||
|
|
this.mapConfig.width = info.windowWidth
|
||
|
|
this.fixedHeaderHeight = await this.getHeight('.fixedheader')
|
||
|
|
console.info(this.fixedHeaderHeight, '--------')
|
||
|
|
this.mapConfig.height = info.windowHeight - this.mobileTopHeight - this.fixedHeaderHeight - 2 - 50
|
||
|
|
// this.mapConfig.height = 450;
|
||
|
|
console.log('this.mobileTopHeight', this.mobileTopHeight, this.mapConfig.height)
|
||
|
|
this.init()
|
||
|
|
},
|
||
|
|
onLoad(option) {
|
||
|
|
this.mapConfig.latitude = option.latitude
|
||
|
|
this.mapConfig.longitude = option.longitude
|
||
|
|
this.mapConfig.address = option.addr
|
||
|
|
|
||
|
|
// console.info(info, 'info.windowHeight')
|
||
|
|
this.showMap = false
|
||
|
|
uni.showLoading({
|
||
|
|
title: '加载地图资源中'
|
||
|
|
})
|
||
|
|
// this.openMonitor()
|
||
|
|
},
|
||
|
|
methods: {
|
||
|
|
async getHeight(name) {
|
||
|
|
const query = uni.createSelectorQuery().in(this)
|
||
|
|
return new Promise(resolve => {
|
||
|
|
query
|
||
|
|
.select(name)
|
||
|
|
.boundingClientRect(data => {
|
||
|
|
resolve(data.height)
|
||
|
|
})
|
||
|
|
.exec()
|
||
|
|
})
|
||
|
|
},
|
||
|
|
init() {
|
||
|
|
let that = this
|
||
|
|
if (this.mapConfig.address) {
|
||
|
|
mapSearch.poiKeywordsSearch(
|
||
|
|
{
|
||
|
|
point: {
|
||
|
|
latitude: this.mapConfig.latitude,
|
||
|
|
longitude: this.mapConfig.longitude
|
||
|
|
},
|
||
|
|
key: this.mapConfig.address
|
||
|
|
},
|
||
|
|
res => {
|
||
|
|
console.info('搜索:', res)
|
||
|
|
if (res.poiList.length) {
|
||
|
|
const { latitude, longitude } = res.poiList[0].location
|
||
|
|
that.mapConfig.latitude = latitude
|
||
|
|
that.mapConfig.longitude = longitude
|
||
|
|
that.initMap()
|
||
|
|
}
|
||
|
|
}
|
||
|
|
)
|
||
|
|
} else {
|
||
|
|
this.initMap()
|
||
|
|
}
|
||
|
|
},
|
||
|
|
initMap() {
|
||
|
|
console.info(this.mapConfig, 'initMap')
|
||
|
|
if (this.mapConfig.latitude && this.mapConfig.longitude) {
|
||
|
|
this.map = uni.createMapContext('map', this)
|
||
|
|
// this.registerEvent()
|
||
|
|
this.mapSetLocation()
|
||
|
|
// this.drawCircle()
|
||
|
|
this.showMap = true
|
||
|
|
uni.hideLoading()
|
||
|
|
} else {
|
||
|
|
// this.mapGetLocation()
|
||
|
|
}
|
||
|
|
},
|
||
|
|
mapGetLocation() {
|
||
|
|
let that = this
|
||
|
|
uni.getLocation({
|
||
|
|
type: that.coordType,
|
||
|
|
geocode: true,
|
||
|
|
isHighAccuracy: 'true',
|
||
|
|
accuracy: 'best', // 精度值为20m
|
||
|
|
success: function (res) {
|
||
|
|
console.log('当前位置的经度:' + res.longitude)
|
||
|
|
console.log('当前位置的纬度:' + res.latitude)
|
||
|
|
console.log(res, 'res..')
|
||
|
|
that.mapConfig.latitude = res.latitude
|
||
|
|
that.mapConfig.longitude = res.longitude
|
||
|
|
const { country, province, city, district, street, streetNum, poiName } = res.address
|
||
|
|
that.mapConfig.address = country + province + city + district + street + streetNum + poiName
|
||
|
|
that.map = uni.createMapContext('map', that)
|
||
|
|
// that.registerEvent()
|
||
|
|
that.mapSetLocation()
|
||
|
|
// that.drawCircle()
|
||
|
|
that.showMap = true
|
||
|
|
uni.hideLoading()
|
||
|
|
},
|
||
|
|
fail: function (msg) {
|
||
|
|
console.log('获取位置失败', msg)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
},
|
||
|
|
// 注册点击事件
|
||
|
|
registerEvent() {
|
||
|
|
let that = this
|
||
|
|
this.map.$getAppMap().onclick = function (point) {
|
||
|
|
console.info(point, 'point')
|
||
|
|
that.mapConfig.longitude = point.longitude
|
||
|
|
that.mapConfig.latitude = point.latitude
|
||
|
|
that.mapSetLocation()
|
||
|
|
that.drawCircle()
|
||
|
|
that.getAddress()
|
||
|
|
}
|
||
|
|
},
|
||
|
|
// 设置定位
|
||
|
|
mapSetLocation() {
|
||
|
|
this.mapConfig.markers = [
|
||
|
|
{
|
||
|
|
latitude: this.mapConfig.latitude,
|
||
|
|
longitude: this.mapConfig.longitude,
|
||
|
|
iconPath: '../../static/map/end.png'
|
||
|
|
}
|
||
|
|
]
|
||
|
|
},
|
||
|
|
//画圆
|
||
|
|
drawCircle() {
|
||
|
|
this.mapConfig.circles = [
|
||
|
|
// 显示圆配置
|
||
|
|
{
|
||
|
|
latitude: this.mapConfig.latitude,
|
||
|
|
longitude: this.mapConfig.longitude,
|
||
|
|
color: '#3C71F2',
|
||
|
|
// 填充颜色
|
||
|
|
fillColor: '#5181F670',
|
||
|
|
fillOpacity: 0.56,
|
||
|
|
// 边
|
||
|
|
strokeWidth: 1,
|
||
|
|
level: 'aboveroads'
|
||
|
|
}
|
||
|
|
]
|
||
|
|
this.mapConfig.scale = this.standArea >= 200 ? 16 : this.standArea >= 100 ? 17 : 18
|
||
|
|
},
|
||
|
|
// handleTapMap(e) {
|
||
|
|
// console.info('点击', e)
|
||
|
|
// let that = this;
|
||
|
|
// const res = that.map.getCenterLocation({
|
||
|
|
// success: (res) => {
|
||
|
|
// console.info('当前定位', res)
|
||
|
|
// that.mapConfig.latitude = res.latitude;
|
||
|
|
// that.mapConfig.longitude = res.longitude;
|
||
|
|
// that.mapSetLocation()
|
||
|
|
// that.drawCircle()
|
||
|
|
// }
|
||
|
|
// })
|
||
|
|
// },
|
||
|
|
// 切换范围
|
||
|
|
handleChangeStandArea(e) {
|
||
|
|
this.standArea = this.standOptions[e.detail.value]
|
||
|
|
this.drawCircle()
|
||
|
|
},
|
||
|
|
// 搜索详细位置
|
||
|
|
searchArea() {
|
||
|
|
let that = this
|
||
|
|
if (!this.searchVal) return
|
||
|
|
mapSearch.poiKeywordsSearch(
|
||
|
|
{
|
||
|
|
point: {
|
||
|
|
latitude: this.mapConfig.latitude,
|
||
|
|
longitude: this.mapConfig.longitude
|
||
|
|
},
|
||
|
|
key: this.searchVal
|
||
|
|
},
|
||
|
|
res => {
|
||
|
|
console.info('搜索:', res)
|
||
|
|
if (res.poiList.length) {
|
||
|
|
const { latitude, longitude } = res.poiList[0].location
|
||
|
|
that.mapConfig.latitude = latitude
|
||
|
|
that.mapConfig.longitude = longitude
|
||
|
|
that.mapSetLocation()
|
||
|
|
// that.drawCircle()
|
||
|
|
that.getAddress()
|
||
|
|
}
|
||
|
|
}
|
||
|
|
)
|
||
|
|
},
|
||
|
|
// 保存位置
|
||
|
|
saveLocation() {
|
||
|
|
uni.$emit('locationSuccessEvent', {
|
||
|
|
latitude: this.mapConfig.latitude,
|
||
|
|
longitude: this.mapConfig.longitude,
|
||
|
|
address: this.mapConfig.address
|
||
|
|
})
|
||
|
|
setTimeout(() => {
|
||
|
|
uni.navigateBack()
|
||
|
|
}, 10)
|
||
|
|
},
|
||
|
|
// 地址逆解析,根据经纬度获取详细位置
|
||
|
|
getAddress() {
|
||
|
|
mapSearch.reverseGeocode(
|
||
|
|
{
|
||
|
|
point: {
|
||
|
|
latitude: this.mapConfig.latitude,
|
||
|
|
longitude: this.mapConfig.longitude
|
||
|
|
}
|
||
|
|
},
|
||
|
|
res => {
|
||
|
|
console.info('成功回调', res, this.mapConfig)
|
||
|
|
this.mapConfig.address = res.address || '未知位置'
|
||
|
|
}
|
||
|
|
)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<style lang="less" scoped>
|
||
|
|
.fixedheader {
|
||
|
|
position: fixed;
|
||
|
|
top: 0;
|
||
|
|
left: 0;
|
||
|
|
width: 100%;
|
||
|
|
z-index: 2;
|
||
|
|
.headerName {
|
||
|
|
z-index: 1;
|
||
|
|
}
|
||
|
|
/deep/ .headerBox {
|
||
|
|
background-color: #5181f6;
|
||
|
|
color: white;
|
||
|
|
.uni-icons {
|
||
|
|
color: white !important;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
.content {
|
||
|
|
width: 100%;
|
||
|
|
box-sizing: border-box;
|
||
|
|
}
|
||
|
|
.search-box {
|
||
|
|
height: 50px;
|
||
|
|
background-color: rgba(16, 16, 16, 0.08);
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
}
|
||
|
|
.picker {
|
||
|
|
width: 140rpx;
|
||
|
|
height: 62rpx;
|
||
|
|
line-height: 40rpx;
|
||
|
|
border-radius: 22rpx;
|
||
|
|
background-color: rgba(255, 255, 255, 1);
|
||
|
|
color: rgba(51, 51, 51, 0.48);
|
||
|
|
font-size: 28rpx;
|
||
|
|
display: flex;
|
||
|
|
padding: 0 16rpx;
|
||
|
|
margin: 0 16rpx;
|
||
|
|
align-items: center;
|
||
|
|
}
|
||
|
|
.search-input {
|
||
|
|
flex: 1;
|
||
|
|
min-width: 400rpx;
|
||
|
|
height: 62rpx;
|
||
|
|
line-height: 40rpx;
|
||
|
|
border-radius: 22rpx;
|
||
|
|
background-color: rgba(255, 255, 255, 1);
|
||
|
|
color: rgba(51, 51, 51, 0.48);
|
||
|
|
font-size: 28rpx;
|
||
|
|
padding: 0 16rpx;
|
||
|
|
}
|
||
|
|
.search-btn {
|
||
|
|
margin: 0 16rpx;
|
||
|
|
flex-shrink: 0;
|
||
|
|
}
|
||
|
|
.save-btn {
|
||
|
|
width: 50%;
|
||
|
|
z-index: 999;
|
||
|
|
border-radius: 0;
|
||
|
|
}
|
||
|
|
uni-button:after {
|
||
|
|
border-radius: 0;
|
||
|
|
}
|
||
|
|
.btn-group {
|
||
|
|
padding: 0;
|
||
|
|
margin: 0;
|
||
|
|
display: flex;
|
||
|
|
// height: 50px;
|
||
|
|
}
|
||
|
|
</style>
|