123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- <template>
- <!-- #ifdef APP -->
- <scroll-view style="flex: 1;">
- <!-- #endif -->
- <page-head :title="title"></page-head>
- <view style="padding: 4px">
- <text class="hello-text">
- 定位功能默认调用操作系统定位API实现。也支持三方SDK定位\n
- 部分老款Android手机因gms问题可能导致无法使用系统定位。\n
- Web、Android、iOS平台,gcj国标、逆地理信息等功能需调用腾讯定位。</text>
- </view>
- <view class="uni-padding-wrap uni-common-mt">
- <!-- #ifdef APP-ANDROID || APP-IOS -->
- <view class="uni-list-cell-db">定位服务商provider(如系统定位,腾讯定位等)</view>
- <view class="uni-list" style="margin-bottom: 20px">
- <radio-group @change="radioChangePV">
- <radio class="uni-list-cell uni-list-cell-pd" v-for="(item, index) in providerList" :key="item.id"
- :class="index < providerList.length - 1 ? 'uni-list-cell-line' : ''" :value="item.id"
- :checked="index === currentProvider">
- {{ item.name }}
- </radio>
- </radio-group>
- </view>
- <!-- #endif -->
- <view class="uni-list-cell-db">定位类型</view>
- <view class="uni-list">
- <radio-group @change="radioChange">
- <radio class="uni-list-cell uni-list-cell-pd" v-for="(item, index) in items" :key="item.value"
- :class="index < items.length - 1 ? 'uni-list-cell-line' : ''" :value="item.value"
- :checked="index === current">
- {{ item.name }}
- </radio>
- </radio-group>
- </view>
- <view class="uni-list-cell uni-list-cell-pd" style="margin-top: 20px">
- <view class="uni-list-cell-db">高度信息</view>
- <switch :checked="altitudeSelect" @change="altitudeChange" />
- </view>
- <view class="uni-list-cell uni-list-cell-pd">
- <view class="uni-list-cell-db">开启高精度定位</view>
- <switch :checked="isHighAccuracySelect" @change="highAccuracySelectChange" />
- </view>
- <view class="uni-list-cell uni-list-cell-pd">
- <view class="uni-list-cell-db">是否解析地址信息</view>
- <switch :checked="geocodeSelect" @change="geocodeChange" />
- </view>
- <view class="get-location-result">{{ exeRet }}</view>
- <view class="uni-btn-v">
- <button class="uni-btn" type="default" @tap="getLocationTap">
- 获取定位
- </button>
- </view>
- </view>
- <!-- #ifdef APP -->
- </scroll-view>
- <!-- #endif -->
- </template>
- <script lang="uts">
- type GetLocationType = 'wgs84' | 'gcj02'
- export type LocationItem = { id : string, name : string, provider ?: UniProvider }
- export type ItemType = { value : GetLocationType, name : GetLocationType }
- export default {
- data() {
- return {
- title: 'get-location',
- altitudeSelect: false,
- isHighAccuracySelect: false,
- geocodeSelect: false,
- exeRet: '',
- items: [
- {
- value: 'wgs84',
- name: 'wgs84'
- },
- {
- value: 'gcj02',
- name: 'gcj02'
- }
- ] as ItemType[],
- providerList: [] as LocationItem[],
- current: 0,
- currentProvider: 0,
- jest_provider: '',
- jest_type: 'wgs84' as GetLocationType,
- jest_isAltitude: false,
- jest_isGeocode: false,
- jest_isHighAccuracy: false,
- jest_altitude: -1000,
- jest_longitude: 200,
- jest_latitude: 100,
- jest_address: '',
- jest_errCode: 0,
- jest_complete: false
- }
- },
- onLoad: function () {
- // #ifdef APP
- this.getProvider()
- // #endif
- },
- methods: {
- getProvider() {
- // #ifdef APP
- let provider = uni.getProviderSync({
- service: "location",
- } as GetProviderSyncOptions)
- console.log(provider)
- provider.providerObjects.forEach((value : UniProvider) => {
- var currentProvider = value
- // if (value.id == 'system') {
- // currentProvider = value as UniLocationSystemProvider
- // } else if (value.id == 'tencent') {
- // currentProvider = value as UniLocationTencentProvider
- // }
- this.providerList.push({
- name: currentProvider.description,
- id: currentProvider.id,
- provider: currentProvider
- } as LocationItem);
- })
- this.providerList.forEach((value, index) => {
- if (value.id == "system") {
- this.currentProvider = index
- }
- })
- // #endif
- },
- altitudeChange: function (e : UniSwitchChangeEvent) {
- this.altitudeSelect = e.detail.value
- },
- geocodeChange: function (e : UniSwitchChangeEvent) {
- this.geocodeSelect = e.detail.value
- },
- highAccuracySelectChange: function (e : UniSwitchChangeEvent) {
- this.isHighAccuracySelect = e.detail.value
- },
- radioChange(e : UniRadioGroupChangeEvent) {
- for (let i = 0; i < this.items.length; i++) {
- if (this.items[i].value === e.detail.value) {
- this.current = i;
- break;
- }
- }
- },
- radioChangePV(e : UniRadioGroupChangeEvent) {
- for (let i = 0; i < this.providerList.length; i++) {
- if (this.providerList[i].id === e.detail.value) {
- this.currentProvider = i;
- break;
- }
- }
- if (e.detail.value == "system") {
- this.current = 0
- } else if (e.detail.value == "tencent") {
- this.current = 1
- }
- },
- getLocationTap: function () {
- // #ifdef APP
- if (this.providerList.length == 0) {
- uni.showToast({
- title: '未获取到provider,请确定基座中包含location功能',
- icon: "error"
- })
- console.log("未获取到provider,请确定基座中包含location功能")
- return
- }
- // #endif
- uni.showLoading({
- title: '定位中'
- })
- uni.getLocation(({
- // #ifdef APP
- provider: this.providerList[this.currentProvider].id,
- // #endif
- type: this.items[this.current].value,
- altitude: this.altitudeSelect,
- isHighAccuracy: this.isHighAccuracySelect,
- geocode: this.geocodeSelect,
- success: (res : any) => {
- uni.hideLoading()
- this.exeRet = JSON.stringify(res)
- },
- fail: (res : any) => {
- uni.hideLoading()
- this.exeRet = JSON.stringify(res)
- },
- complete: (res : any) => {
- uni.hideLoading()
- this.exeRet = JSON.stringify(res)
- }
- }));
- },
- // 仅用于自动化测试
- jestGetLocation() {
- this.jest_complete = false
- this.jest_errCode = 0
- uni.getLocation(({
- // #ifdef APP
- provider: this.jest_provider,
- // #endif
- type: this.jest_type,
- altitude: this.jest_isAltitude,
- isHighAccuracy: this.jest_isHighAccuracy,
- geocode: this.jest_isGeocode,
- success: (res) => {
- if (res.address != null) {
- this.jest_address = res.address!
- }
- this.jest_longitude = res.longitude
- this.jest_latitude = res.latitude
- this.jest_altitude = res.altitude
- this.jest_complete = true
- },
- fail: (err) => {
- this.jest_errCode = err.errCode
- this.jest_complete = true
- }
- }));
- }
- }
- }
- </script>
- <style>
- .get-location-result {
- /* #ifdef WEB || MP */
- word-break: break-all;
- /* #endif */
- }
- </style>
|