Files
mini-programs/src/components/MapDisplay/mapService.ts
2025-08-17 22:58:00 +08:00

190 lines
5.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 腾讯地图SDK服务
import QQMapWX from "qqmap-wx-jssdk";
import Taro from '@tarojs/taro';
// 扩展Window接口添加qqmapsdk属性
declare global {
interface Window {
qqmapsdk?: any;
}
}
export interface LocationInfo {
lat: number
lng: number
address?: string
}
export interface SearchResult {
id: string
title: string
address: string
location: {
lat: number
lng: number
}
}
export interface SearchOptions {
keyword: string
location?: string
page_size?: number
page_index?: number
}
class MapService {
private qqmapsdk: any = null
private isInitialized = false
// 初始化腾讯地图SDK
async initSDK(): Promise<boolean> {
if (this.isInitialized) {
return true
}
try {
// 直接使用QQMapWX不需要通过window对象
this.qqmapsdk = new QQMapWX({
key: 'AZNBZ-VCSC4-MLVUF-KBASD-6GZ6H-KBFTX'
});
this.isInitialized = true
console.log('腾讯地图SDK初始化成功')
return true
} catch (error) {
console.error('初始化腾讯地图SDK失败:', error)
return false
}
}
// 搜索地点
async search(options: SearchOptions): Promise<SearchResult[]> {
if (!this.isInitialized) {
await this.initSDK()
}
try {
console.log(this.qqmapsdk,11)
if (this.qqmapsdk && this.qqmapsdk.search) {
return new Promise((resolve, reject) => {
this.qqmapsdk.getSuggestion({
keyword: options.keyword,
location: options.location || '39.908802,116.397502', // 默认北京
page_size: options.page_size || 20,
page_index: options.page_index || 1,
success: (res: any) => {
console.log('搜索成功:', res)
if (res.data && res.data.length > 0) {
const results: SearchResult[] = res.data.map((item: any, index: number) => ({
id: `search_${index}`,
title: item.title || item.name || '未知地点',
address: item.address || item.location || '地址未知',
location: {
lat: item.location?.lat || 0,
lng: item.location?.lng || 0
}
}))
resolve(results)
} else {
resolve([])
}
},
fail: (err: any) => {
console.error('搜索失败:', err)
reject(err)
}
})
})
} else {
// 使用模拟数据
console.log('使用模拟搜索数据')
return this.getMockSearchResults(options.keyword)
}
} catch (error) {
console.error('搜索异常:', error)
return this.getMockSearchResults(options.keyword)
}
}
// 获取模拟搜索结果
private getMockSearchResults(keyword: string): SearchResult[] {
const mockResults: SearchResult[] = [
{
id: 'mock_1',
title: `${keyword}相关地点1`,
address: '模拟地址1 - 这是一个示例地址',
location: { lat: 39.908802, lng: 116.397502 }
},
{
id: 'mock_2',
title: `${keyword}相关地点2`,
address: '模拟地址2 - 这是另一个示例地址',
location: { lat: 39.918802, lng: 116.407502 }
},
{
id: 'mock_3',
title: `${keyword}相关地点3`,
address: '模拟地址3 - 第三个示例地址',
location: { lat: 39.898802, lng: 116.387502 }
}
]
return mockResults
}
// 获取当前位置
async getCurrentLocation(): Promise<{ lat: number; lng: number } | null> {
try {
// 这里可以集成实际的定位服务
// 暂时返回模拟位置
const res = await Taro.getLocation({
type: 'gcj02',
isHighAccuracy: true
})
return {
lat: res.latitude,
lng: res.longitude
}
} catch (error) {
console.error('获取位置失败:', error)
return null
}
}
async getAddress(lat: number, lng: number): Promise<string | null | undefined> {
try {
const addressRes: any = await new Promise((resolve, reject) => {
this.qqmapsdk.reverseGeocoder({
location: {
latitude: lat,
longitude: lng
},
success: resolve,
fail: reject
})
})
return addressRes?.results?.address
} catch (error) {
console.error('获取地址失败:', error)
}
}
async getLocation(): Promise<{ lat: number; lng: number; address: string } | null | undefined> {
try {
const currentInfo: any = {};
const location = await this.getCurrentLocation();
const { lat, lng } = location || {};
if (lat && lng) {
currentInfo.lat = lat;
currentInfo.lng = lng;
const addressRes = await this.getAddress(lat, lng)
if (addressRes) {
currentInfo.address = addressRes;
}
}
return currentInfo;
} catch (error) {
console.error('获取位置失败:', error)
}
}
}
export const mapService = new MapService()