From 0af472703f8ffc5b548b6ed2f337f72b844b888e Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Mon, 28 Feb 2022 16:03:24 +0800
Subject: [PATCH] 地图位置获取重新修改
---
pages/registerUser/registerUser.vue | 40 +++-
static/WSCoordinate.js | 166 +++++++++++++++++++++++
pages/registerUser/map.vue | 200 ++++++++++++++++++++++++----
3 files changed, 365 insertions(+), 41 deletions(-)
diff --git a/pages/registerUser/map.vue b/pages/registerUser/map.vue
index a02591f..34841cf 100644
--- a/pages/registerUser/map.vue
+++ b/pages/registerUser/map.vue
@@ -3,23 +3,45 @@
<u-navbar height="44" :is-back="false" title="获取地址" title-color="#fff" :background="{background: '#103289'}">
<u-button class="slot-wrap" type="primary" size="mini" @click="returnPage">确定</u-button>
</u-navbar>
- <map id="SignLocationMap"
- style="position: absolute; left: 0; width: 100%; z-index: 99;"
- :style="{height: screenHeight + 'px'}"
- @regionchange="regionChange" :latitude="latitude" :longitude="longitude" :scale="scale">
+
+ <map id="SignLocationMap" style="position: absolute; left: 0; width: 100%; z-index: 99;"
+ :style="{height: screenHeight + 'px'}" @regionchange="regionChange" :latitude="latitude"
+ :longitude="longitude" :scale="scale">
<cover-view class="dingwBut">
<cover-image class="location-log" src="../../static/img/location.png">
</cover-image>
</cover-view>
+
</map>
+
+ <scroll-view id="LocationListBox" class="location-list-box" scroll-y="true">
+ <u-loading color="#103289" class="load" :show="loadShow" size="54"></u-loading>
+ <view class="location-list-item" v-for="(item, index) in locationList" :key="index"
+ v-show="locationList.length > 0"
+ @click="selectLocation(item)">
+ <view class="item-box">
+ <view class="item-name">{{item.name}}</view>
+ <view class="item-address">{{item.address}}</view>
+ </view>
+ <view class="slection-icon">
+ <u-icon :name="item.iconName" color="#103289" size="44"></u-icon>
+ </view>
+ </view>
+ </scroll-view>
</view>
</template>
<script>
+ import util from "../../static/WSCoordinate.js"
+
export default {
data() {
return {
+ loadShow: true,
+ // 位置列表
+ locationList: [],
+
screenHeight: 0,
mapLocationName: '',
mapLocationLatitude: '',
@@ -27,23 +49,72 @@
regionID: '',
- latitude: 28.678983439095823,
longitude: 115.84414205551147,
- scale: 15 //缩放级别
+ latitude: 28.678983439095823,
+ scale: 18 //缩放级别
+ }
+ },
+ onLoad(options) {
+ var that = this
+ if (options.lng != '' && options.lat != '') {
+ that.longitude = Number(options.lng)
+ that.latitude = Number(options.lat)
+ } else {
+ uni.getLocation({
+ type: 'gcj02',
+ isHighAccuracy: true,
+ success: function(res) {
+ that.longitude = Number(res.longitude)
+ that.latitude = Number(res.latitude)
+ }
+ });
}
},
onReady() {
var that = this
-
+
uni.getSystemInfo({
- success: function(res) {
- console.log(res, 465)
- that.screenHeight = res.windowHeight - 44
+ success(res) {
+ let {
+ windowWidth,
+ windowHeight,
+ safeArea
+ } = res;
+ const query = uni.createSelectorQuery().in(that);
+
+ query
+ .select('#LocationListBox')
+ .boundingClientRect(data => {
+
+ that.screenHeight = (safeArea.bottom - safeArea.top - data.height - 44);
+
+ })
+
+ .exec();
}
- })
+ });
+
},
methods: {
+ // 选择位置
+ selectLocation(param) {
+ this.locationList.forEach((item) => {
+ item.iconName = ''
+ })
+ param.iconName = 'checkbox-mark'
+
+ this.parentPageParam(param)
+ },
+
+ parentPageParam(param) {
+ this.mapLocationName = param.address
+ this.mapLocationLongitude = param.point.longitude
+ this.mapLocationLatitude = param.point.latitude
+ },
+
regionChange() { // 移动地图后重新获取门店
+ this.loadShow = true
+ this.locationList = []
var that = this
uni.createMapContext('SignLocationMap', this).getCenterLocation({
success: res => {
@@ -61,32 +132,56 @@
getLocationInfor(longitude, latitude) {
var that = this
var point = new plus.maps.Point(longitude, latitude);
- plus.maps.Map.reverseGeocode(
- point, {},
- function(event) {
- var address = event.address; // 转换后的地理位置
- var point = event.coord; // 转换后的坐标信息
- var coordType = event.coordType; // 转换后的坐标系类型
+ var map = plus.maps.getMapById('SignLocationMap');
+ var searchObj = new plus.maps.Search(map);
-
- that.mapLocationName = address
- that.mapLocationLongitude = point.longitude
- that.mapLocationLatitude = point.latitude
-
- },
- function(e) {}
- );
+ searchObj.onPoiSearchComplete = function(state, result) {
+ if (state == 0) {
+ if (result.currentNumber <= 0) {
+ that.locationList = []
+ } else {
+ result.poiList.forEach((item) => {
+ item.iconName = ''
+ })
+ result.poiList[0].iconName = 'checkbox-mark'
+ that.parentPageParam(result.poiList[0])
+ that.locationList = result.poiList
+ that.loadShow = false
+ that.getRegionId()
+ }
+ } else {
+ alert("检索失败");
+ }
+ }
+ searchObj.poiSearchNearBy(' ', point, 1000)
},
-
+
returnPage() {
- console.log(1)
var that = this
uni.$emit('getLocation', {
mapLocationName: that.mapLocationName,
- regionID: that.regionID
+ regionID: that.regionID,
+ mapLocationLongitude: that.mapLocationLongitude,
+ mapLocationLatitude: that.mapLocationLatitude
});
//关闭当前窗口
uni.navigateBack({});
+ },
+
+ getRegionId() {
+ var that = this
+ var position = util.transformFromGCJToWGS(that.mapLocationLatitude, that.mapLocationLongitude)
+ uni.request({
+ url: that.$store.state.piAPI + '/jurisdiction/isOnArea',
+ method: 'get',
+ data: {
+ jd: position.longitude,
+ wd: position.latitude
+ },
+ success: (res) => {
+ that.regionID = res.data.data[0].id
+ }
+ });
}
},
@@ -129,4 +224,53 @@
transform: translateY(-22px);
}
+ .location-list-box {
+ position: absolute;
+ left: 0;
+ bottom: 0;
+
+ width: 100%;
+ height: 40%;
+
+ border-radius: 5px;
+ z-index: 99999;
+
+ .load {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ margin: auto;
+ }
+
+ .location-list-item {
+ display: flex;
+ padding: 4px 6px;
+ height: 60px;
+ align-items: center;
+
+ .item-box {
+ padding: 0 4px;
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+
+ .item-name {
+ font-size: 14px;
+ flex: 1;
+ }
+
+ .item-address {
+ height: 20px;
+ font-size: 0.675rem;
+ color: #bebebe !important;
+ }
+ }
+
+ .slection-icon {
+ width: 36px;
+ }
+ }
+ }
</style>
diff --git a/pages/registerUser/registerUser.vue b/pages/registerUser/registerUser.vue
index 0ba084c..3fed9b6 100644
--- a/pages/registerUser/registerUser.vue
+++ b/pages/registerUser/registerUser.vue
@@ -29,14 +29,21 @@
<u-form-item v-show="jobValue == '有'" label="工作地点" prop="xq" left-icon="map-fill" label-width="200"
:required="true">
- <u-input v-model="form.xq" type="select" placeholder="请选择工作地点" :border="true"
- @click="regionClick()" />
+ <u-field :disabled="true" style="width: 100%;" label-width="0" v-model="form.xq" type="textarea"
+ placeholder="请选择工作地点" :fixed="true">
+ <u-icon @click="regionClick" name="map-fill" slot="right" size="44" label="定位" label-pos="bottom"
+ label-color="#103289" color="#103289"></u-icon>
+ </u-field>
</u-form-item>
<u-form-item label="居住地" prop="address" left-icon="map" label-width="200" :required="true">
- <u-input v-model="form.address" type="select" placeholder="请选择居住地" :border="true"
- @click="placeClick()" />
+ <u-field :disabled="true" style="width: 100%;" label-width="0" v-model="form.address" type="textarea"
+ placeholder="请选择居住地" :fixed="true">
+ <u-icon @click="placeClick" name="map-fill" slot="right" size="44" label="定位" label-pos="bottom"
+ label-color="#103289" color="#103289"></u-icon>
+ </u-field>
</u-form-item>
+
<u-form-item label="性别" label-width="200" left-icon="man">
<u-radio-group v-model="form.sex">
<u-radio v-for="(item, index) in sex" :key="index" :name="item.name" :disabled="item.disabled">
@@ -98,6 +105,13 @@
};
return {
+ // 工作地点经纬度
+ jobLng: '',
+ jobLat: '',
+ // 居住地经纬度
+ liveLng: '',
+ liveLat: '',
+
userConsent: false,
jobValue: '无',
jobList: [{
@@ -226,7 +240,6 @@
trigger: ['change', 'blur'],
}, {
validator: (rule, value, callback) => {
- console.log(this.form.pass, value)
if (this.form.pass == value) {
return true
} else {
@@ -331,14 +344,15 @@
//监听事件
uni.$on('getLocation', (res) => {
that.form.xq = res.mapLocationName
- this.form.workjurisdiction = res.regionID
+ that.form.workjurisdiction = res.regionID
+ that.jobLng = res.mapLocationLongitude
+ that.jobLat = res.mapLocationLatitude
//清除监听,不清除会消耗资源
uni.$off('getLocation');
-
})
uni.navigateTo({
- url: '/pages/registerUser/map'
+ url: '/pages/registerUser/map?lng=' + that.jobLng + '&lat=' + that.jobLat,
});
},
placeClick() {
@@ -347,14 +361,16 @@
//监听事件
uni.$on('getLocation', (res) => {
that.form.address = res.mapLocationName
- this.form.jurisdiction = res.regionID
+ that.form.jurisdiction = res.regionID
+ that.liveLng = res.mapLocationLongitude
+ that.liveLat = res.mapLocationLatitude
//清除监听,不清除会消耗资源
uni.$off('getLocation');
-
})
uni.navigateTo({
- url: '/pages/registerUser/map'
+ // url: '/pages/registerUser/map'
+ url: '/pages/registerUser/map?lng=' + that.liveLng + '&lat=' + that.liveLat
});
},
zc() {
@@ -435,7 +451,6 @@
method: 'POST',
data: data,
success: (result) => {
- console.log(result, 456)
uni.showToast({
title: '注册成功,请等待审核',
icon: 'none',
@@ -468,7 +483,6 @@
},
watch: {
faceState() {
- // console.log(this.faceState);
if (this.faceState == -1) {
this.facebc = '#ff7f29';
this.faceco = '#fff';
diff --git a/static/WSCoordinate.js b/static/WSCoordinate.js
new file mode 100644
index 0000000..f5cc7db
--- /dev/null
+++ b/static/WSCoordinate.js
@@ -0,0 +1,166 @@
+/**
+ * 判断经纬度是否超出中国境内
+ */
+function isLocationOutOfChina(latitude, longitude) {
+ if (longitude < 72.004 || longitude > 137.8347 || latitude < 0.8293 || latitude > 55.8271)
+ return true;
+ return false;
+}
+
+
+/**
+ * 将WGS-84(国际标准)转为GCJ-02(火星坐标):
+ */
+function transformFromWGSToGCJ(latitude, longitude) {
+ var lat = "";
+ var lon = "";
+ var ee = 0.00669342162296594323;
+ var a = 6378245.0;
+ var pi = 3.14159265358979324;
+
+ if (isLocationOutOfChina(latitude, longitude)) {
+ lat = latitude;
+ lon = longitude;
+ } else {
+ var adjustLat = transformLatWithXY(longitude - 105.0, latitude - 35.0);
+ var adjustLon = transformLonWithXY(longitude - 105.0, latitude - 35.0);
+ var radLat = latitude / 180.0 * pi;
+ var magic = Math.sin(radLat);
+ magic = 1 - ee * magic * magic;
+ var sqrtMagic = Math.sqrt(magic);
+ adjustLat = (adjustLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
+ adjustLon = (adjustLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
+ latitude = latitude + adjustLat;
+ longitude = longitude + adjustLon;
+ }
+ return {
+ latitude: latitude,
+ longitude: longitude
+ };
+
+}
+
+/**
+ * 将GCJ-02(火星坐标)转为百度坐标:
+ */
+function transformFromGCJToBaidu(latitude, longitude) {
+ var pi = 3.14159265358979324 * 3000.0 / 180.0;
+
+ var z = Math.sqrt(longitude * longitude + latitude * latitude) + 0.00002 * Math.sin(latitude * pi);
+ var theta = Math.atan2(latitude, longitude) + 0.000003 * Math.cos(longitude * pi);
+ var a_latitude = (z * Math.sin(theta) + 0.006);
+ var a_longitude = (z * Math.cos(theta) + 0.0065);
+
+ return {
+ latitude: a_latitude,
+ longitude: a_longitude
+ };
+}
+
+/**
+ * 将百度坐标转为GCJ-02(火星坐标):
+ */
+function transformFromBaiduToGCJ(latitude, longitude) {
+ var xPi = 3.14159265358979323846264338327950288 * 3000.0 / 180.0;
+
+ var x = longitude - 0.0065;
+ var y = latitude - 0.006;
+ var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * xPi);
+ var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * xPi);
+ var a_latitude = z * Math.sin(theta);
+ var a_longitude = z * Math.cos(theta);
+
+ return {
+ latitude: a_latitude,
+ longitude: a_longitude
+ };
+}
+
+/**
+ * 将GCJ-02(火星坐标)转为WGS-84:
+ */
+function transformFromGCJToWGS(latitude, longitude) {
+ var threshold = 0.00001;
+
+ // The boundary
+ var minLat = latitude - 0.5;
+ var maxLat = latitude + 0.5;
+ var minLng = longitude - 0.5;
+ var maxLng = longitude + 0.5;
+
+ var delta = 1;
+ var maxIteration = 30;
+
+ while (true) {
+ var leftBottom = transformFromWGSToGCJ(minLat, minLng);
+ var rightBottom = transformFromWGSToGCJ(minLat, maxLng);
+ var leftUp = transformFromWGSToGCJ(maxLat, minLng);
+ var midPoint = transformFromWGSToGCJ((minLat + maxLat) / 2, (minLng + maxLng) / 2);
+ delta = Math.abs(midPoint.latitude - latitude) + Math.abs(midPoint.longitude - longitude);
+
+ if (maxIteration-- <= 0 || delta <= threshold) {
+ return {
+ latitude: (minLat + maxLat) / 2,
+ longitude: (minLng + maxLng) / 2
+ };
+ }
+
+ if (isContains({
+ latitude: latitude,
+ longitude: longitude
+ }, leftBottom, midPoint)) {
+ maxLat = (minLat + maxLat) / 2;
+ maxLng = (minLng + maxLng) / 2;
+ } else if (isContains({
+ latitude: latitude,
+ longitude: longitude
+ }, rightBottom, midPoint)) {
+ maxLat = (minLat + maxLat) / 2;
+ minLng = (minLng + maxLng) / 2;
+ } else if (isContains({
+ latitude: latitude,
+ longitude: longitude
+ }, leftUp, midPoint)) {
+ minLat = (minLat + maxLat) / 2;
+ maxLng = (minLng + maxLng) / 2;
+ } else {
+ minLat = (minLat + maxLat) / 2;
+ minLng = (minLng + maxLng) / 2;
+ }
+ }
+
+}
+
+function isContains(point, p1, p2) {
+ return (point.latitude >= Math.min(p1.latitude, p2.latitude) && point.latitude <= Math.max(p1.latitude, p2
+ .latitude)) && (point.longitude >= Math.min(p1.longitude, p2.longitude) && point.longitude <= Math.max(p1
+ .longitude, p2.longitude));
+}
+
+function transformLatWithXY(x, y) {
+ var pi = 3.14159265358979324;
+ var lat = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
+ lat += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
+ lat += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
+ lat += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
+ return lat;
+}
+
+function transformLonWithXY(x, y) {
+ var pi = 3.14159265358979324;
+ var lon = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
+ lon += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
+ lon += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
+ lon += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0;
+ return lon;
+}
+
+
+
+module.exports = {
+ isLocationOutOfChina: isLocationOutOfChina,
+ transformFromWGSToGCJ: transformFromWGSToGCJ,
+ transformFromGCJToBaidu: transformFromGCJToBaidu,
+ transformFromBaiduToGCJ: transformFromBaiduToGCJ,
+ transformFromGCJToWGS: transformFromGCJToWGS
+}
--
Gitblit v1.9.3