微信小程序定位功能开发实战:实现自动定位、城市切换与地图导航

3 阅读11分钟

一、文章背景

最近在开发一个充电桩查询小程序,需要实现定位功能。踩了不少坑,也积累了一些经验。今天就把完整的实现过程分享出来,希望能帮助到正在开发类似功能的朋友。

  • 打开小程序自动获取你的城市
  • 可以手动切换其他城市
  • 地图自动定位到选定城市
  • 一键回到你的当前位置

二、技术栈

  • 框架: Uni-app (Vue 3 Composition API)
  • 状态管理: Pinia
  • 地图组件: Uni-app 原生 map 组件
  • 地图服务: 高德地图 API
  • 坐标系统: GCJ02(火星坐标系)

三、数据流图

┌─────────────────┐
│   首页导航栏      │ ← 获取用户位置
│  homeNavbar.vue │
└────────┬────────┘
         │ 自动定位
         ↓
┌─────────────────┐     Pinia Store      ┌─────────────────┐
│  地图页面        │ ◄─────────────────► │   状态管理       │
│   map/index.vue │    当前城市/真实城市   │  app.js        │
└────────┬────────┘                      └─────────────────┘
         │                                       ↑
         │ 手动选择城市                           │
         ↓                                       │
┌─────────────────┐                              │
│  城市选择页面     │ ───────────────────────────┘
│citySelect/index  │    更新城市
└─────────────────┘

四、定位功能实现详解

4.1 获取定位权限

const getLocation = () => {
    // 先检查定位权限
    uni.getSetting({
        success: (res) => {
            if (res.authSetting['scope.userLocation']) {
                // 已授权,直接获取定位
                authorizeLocation()
            } else {
                // 未授权,先请求授权
                uni.authorize({
                    scope: 'scope.userLocation',
                    success: () => authorizeLocation(),
                    fail: () => {
                        // 显示提示,引导用户手动开启
                        uni.showModal({
                            title: '提示',
                            content: '需要获取您的位置信息以显示当前城市,请在设置中开启定位权限',
                            confirmText: '去设置',
                            success: (modalRes) => {
                                if (modalRes.confirm) {
                                    ...
                                }
                            }
                        })
                    }
                })
            }
        }
    })
}

执行流程图

┌──────────────┐
│  打开小程序    │
└──────┬───────┘
       ↓
┌──────────────┐
│ onMounted    │
└──────┬───────┘
       ↓
┌──────────────┐
│ getLocation()│
└──────┬───────┘
       ↓
┌──────────────┐
│ getSetting() │
└──────┬───────┘
       ↓
┌──────────────┐
│ 已授权?      │
└──┬───────┬──┘
   │是     │否
   ↓       ↓
┌─────┐  ┌─────────┐
│授权  │  │authorize│
│失败  │  │ Location│
└─────┘  └────┬────┘
              ↓
       ┌─────────────┐
       │ 显示设置弹窗  │
       └─────────────┘

4.2 获取用户经纬度

const authorizeLocation = () => {
    uni.getLocation({
        type: 'gcj02',           // 使用火星坐标系
        altitude: true,          // 获取高度信息
        isHighAccuracy: true     // 开启高精度定位
    }).then((res) => {
        console.log('获取定位成功:', res)
    }).catch(err => {
        console.log('获取定位失败:', err)
        appStore.setCurrentCity('定位失败')
    })
}

参数说明

参数说明
type'gcj02'使用 GCJ02 坐标系,符合国内地图规范
altitudetrue获取海拔信息
isHighAccuracytrue开启高精度定位模式

4.3 逆地理编码获取城市名称

const getCityByLocation = (lat, lng) => {
    uni.request({
        url: 'https://restapi.amap.com/v3/geocode/regeo',
        data: {
            location: `${lng},${lat}`,  // 高德地图使用 经度,纬度 顺序
            key: '你的高德API密钥',
            extensions: 'base'  // base: 基础定位信息
        },
        success: (res) => {
            const city = res.data.regeocode.addressComponent.city
            updateCityInfo(city.replace('市', '')
        }
    })
}

数据处理流程

┌─────────────────┐
  经纬度:         
  lat: 22.547    
  lng: 114.086   
└────────┬────────┘
         
┌─────────────────┐
  高德逆地理编码   
└────────┬────────┘
         
┌─────────────────┐
 addressComponent│
  - province: 广东│
  - city: 深圳    
  - district: 南山│
└────────┬────────┘
         
┌─────────────────┐
  去除"市"后缀    
  结果: "深圳"    
└────────┬────────┘
         
┌─────────────────┐
 存储到 appStore 
 userRealCity:   
   "深圳"        
└─────────────────┘

4.4 城市选择功能

const handleSelectCity = (city) => {
    console.log('选择城市:', city)

    // 更新 appStore 中的城市
    appStore.setCurrentCity(city)

    // 标记已经手动选择过城市
    appStore.setHasSelectedCity(true)

    // 设置需要定位到新城市的标志
    appStore.setNeedRelocate(true)

    // 返回上一页
    uni.navigateBack({
        delta: 1,
    })
}

关键状态标志

状态变量类型说明
currentCityref当前显示的城市名称
userRealCityref用户真实所在城市(定位获得)
hasSelectedCityref是否手动选择过城市
needRelocateref是否需要重新定位到新城市

4.5 地图定位到城市中心

const getCityLocation = (cityName) => {
    // 城市坐标数据库
    const cityCoordinates = {
        '深圳': { lng: 114.0859, lat: 22.5470 },
        '北京': { lng: 116.4074, lat: 39.9042 },
        '上海': { lng: 121.4737, lat: 31.2304 },
        // ... 更多城市
    }

    const coords = cityCoordinates[cityName]

    if (coords) {
        // 更新地图中心点
        lng.value = coords.lng
        lat.value = coords.lat

      

        // 使用地图 API 移动到新位置
        uni.createMapContext("map", _this).moveToLocation({
            latitude: coords.lat,
            longitude: coords.lng,
            success: () => {
                console.log('地图移动成功')
            }
        })

        uni.showToast({
            title: `定位到${cityName}`,
            icon: 'success'
        })
    }
}

城市坐标数据库设计

const cityCoordinates = {
    '城市名': {
        lng: 经度,
        lat: 纬度
    }
}

优势

  • 响应速度快,无需网络请求
  • 数据稳定,不受第三方 API 限制
  • 支持离线使用

4.6 重新定位到用户当前位置

const backMyLocation = () => {
    console.log('重新获取用户位置')

    // 清除手动选择城市的标志
    appStore.setHasSelectedCity(false)

    uni.getLocation({
        type: 'gcj02',
        altitude: true,
        isHighAccuracy: true
    }).then((res) => {
        if (res.errMsg === 'getLocation:ok') {
            // 更新地图坐标
            lng.value = res.longitude
            lat.value = res.latitude

            // 获取城市名称并更新
            getCityByLocation(res.latitude, res.longitude)
        }
    })
}

4.7 注意事项

  • 开发版可以忽略域名白名单(开发者工具中可关闭域名校验)
  • 正式版必须配置白名单
  • 确保使用 HTTPS 协议
  • 高德 API Key 需要在高德开放平台申请并配置域名白名单

域名配置对比

环境域名校验配置要求
开发工具可关闭无需配置
体验版开启需要配置
正式版开启必须配置

六、最佳实践总结

6.1 定位权限处理

// ✅ 推荐:完整的权限处理流程
const getLocation = () => {
    uni.getSetting({
        success: (res) => {
            if (res.authSetting['scope.userLocation']) {
                authorizeLocation()
            } else {
                uni.authorize({
                    scope: 'scope.userLocation',
                    success: () => authorizeLocation(),
                    fail: () => {
                        uni.showModal({
                            title: '提示',
                            content: '需要位置权限',
                            confirmText: '去设置',
                            success: (modalRes) => {
                                if (modalRes.confirm) {
                                    uni.openSetting()
                                }
                            }
                        })
                    }
                })
            }
        }
    })
}

6.2 城市坐标存储

// ✅ 推荐:使用内置坐标数据库
const cityCoordinates = {
    '深圳': { lng: 114.0859, lat: 22.5470 },
    '北京': { lng: 116.4074, lat: 39.9042 },
    // ...
}

// ❌ 不推荐:每次都调用地理编码 API
// 性能差,依赖网络,有配额限制

6.3 延迟调用地图 API

// ✅ 推荐:使用 nextTick + setTimeout
nextTick(() => {
    setTimeout(() => {
        getCityLocation(newCity)
    }, 300)
})

// ❌ 不推荐:直接调用
// 可能导致地图组件未准备好
getCityLocation(newCity)

6.4 状态管理

// ✅ 推荐:使用多个状态标志
const hasSelectedCity = ref(false)  // 区分自动定位和手动选择
const userRealCity = ref('')        // 记录用户真实位置
const needRelocate = ref(false)     // 控制定位时机

// ❌ 不推荐:只使用一个状态
const currentCity = ref('定位中...')  // 无法区分场景

七、常见问题 FAQ

Q1: 为什么使用 GCJ02 坐标系?

A: GCJ02 是中国官方使用的火星坐标系,国内地图服务(百度、高德、腾讯)都使用该坐标系。使用 WGS84(GPS 坐标)会导致位置偏移。

Q2: 逆地理编码返回的城市为空怎么办?

A: 某些情况下 addressComponent.city 可能为空(如直辖市),需要回退到 addressComponent.province

const city = addressComponent.city || addressComponent.province || '未知城市'

Q3: 如何提高定位精度?

A: 在 uni.getLocation 中设置:

  • isHighAccuracy: true - 开启高精度模式
  • altitude: true - 获取高度信息
  • 建议在空旷、信号好的地方测试

Q4: 城市坐标数据库从哪里获取?

A:

  1. 高德地图开放平台:lbs.amap.com/api/webserv…
  2. 百度地图拾取坐标:api.map.baidu.com/lbsapi/getp…
  3. 坐标转换工具:www.gpsspg.com/maps.htm

Q5: 如何支持港澳台地区?

A: 在坐标数据库中添加港澳台城市坐标,并确保高德 API Key 支持海外定位。


八、调试技巧

8.1 使用 console.log 追踪状态

console.log('========== 开始获取定位 ==========')
console.log('当前城市:', appStore.currentCity)
console.log('用户真实城市:', appStore.userRealCity)
console.log('是否手动选择:', appStore.hasSelectedCity)
console.log('=====================================')

8.2 使用开发者工具模拟定位

微信开发者工具 → 调试器 → Sensors → Location → 模拟位置

8.3 查看网络请求

微信开发者工具 → 调试器 → Network → 查看 uni.request 请求


九、城市坐标数据库(核心数据)

这是整个定位功能的基础,包含了全国主要城市的经纬度坐标。腾讯地图和高德地图都使用 GCJ02 坐标系,数据可以共用。

export const CITY_COORDINATES = {
  // 直辖市
  '北京': { lng: 116.4074, lat: 39.9042 },
  '上海': { lng: 121.4737, lat: 31.2304 },
  '天津': { lng: 117.2008, lat: 39.0842 },
  '重庆': { lng: 106.5516, lat: 29.5630 },

  // 广东省
  '广州': { lng: 113.2644, lat: 23.1291 },
  '深圳': { lng: 114.0859, lat: 22.5470 },
  '珠海': { lng: 113.5767, lat: 22.2707 },
  '汕头': { lng: 116.7286, lat: 23.3839 },
  '佛山': { lng: 113.1227, lat: 23.0288 },
  '韶关': { lng: 113.5975, lat: 24.8104 },
  '湛江': { lng: 110.3648, lat: 21.2749 },
  '肇庆': { lng: 112.4725, lat: 23.0515 },
  '江门': { lng: 113.0949, lat: 22.5904 },
  '茂名': { lng: 110.9192, lat: 21.6639 },
  '惠州': { lng: 114.4164, lat: 23.1123 },
  '梅州': { lng: 116.1176, lat: 24.2991 },
  '汕尾': { lng: 115.3642, lat: 22.7745 },
  '河源': { lng: 114.6978, lat: 23.7463 },
  '阳江': { lng: 111.9751, lat: 21.8592 },
  '清远': { lng: 113.0512, lat: 23.6850 },
  '东莞': { lng: 113.7462, lat: 23.0462 },
  '中山': { lng: 113.3824, lat: 22.5211 },
  '潮州': { lng: 116.6323, lat: 23.6617 },
  '揭阳': { lng: 116.3557, lat: 23.5438 },
  '云浮': { lng: 112.0445, lat: 22.9298 },

  // 江苏省
  '南京': { lng: 118.7969, lat: 32.0603 },
  '无锡': { lng: 120.3017, lat: 31.5747 },
  '徐州': { lng: 117.1848, lat: 34.2618 },
  '常州': { lng: 119.9469, lat: 31.7728 },
  '苏州': { lng: 120.6196, lat: 31.3179 },
  '南通': { lng: 120.8646, lat: 32.0162 },
  '连云港': { lng: 119.1788, lat: 34.6000 },
  '淮安': { lng: 119.0215, lat: 33.5975 },
  '盐城': { lng: 120.1400, lat: 33.3776 },
  '扬州': { lng: 119.4210, lat: 32.3932 },
  '镇江': { lng: 119.4528, lat: 32.2044 },
  '泰州': { lng: 119.9152, lat: 32.4849 },
  '宿迁': { lng: 118.2752, lat: 33.9630 },

  // 浙江省
  '杭州': { lng: 120.1551, lat: 30.2741 },
  '宁波': { lng: 121.5498, lat: 29.8683 },
  '温州': { lng: 120.6721, lat: 28.0006 },
  '嘉兴': { lng: 120.7509, lat: 30.7627 },
  '湖州': { lng: 120.1024, lat: 30.8672 },
  '绍兴': { lng: 120.5821, lat: 30.0120 },
  '金华': { lng: 119.6495, lat: 29.0895 },
  '衢州': { lng: 118.8726, lat: 28.9417 },
  '舟山': { lng: 122.1069, lat: 30.0160 },
  '台州': { lng: 121.4286, lat: 28.6614 },
  '丽水': { lng: 119.9218, lat: 28.4520 },

  // 山东省
  '济南': { lng: 117.1205, lat: 36.6510 },
  '青岛': { lng: 120.3826, lat: 36.0671 },
  '淄博': { lng: 118.0476, lat: 36.8149 },
  '枣庄': { lng: 117.5570, lat: 34.8564 },
  '东营': { lng: 118.6647, lat: 37.4346 },
  '烟台': { lng: 121.3914, lat: 37.5393 },
  '潍坊': { lng: 119.1071, lat: 36.7093 },
  '济宁': { lng: 116.5872, lat: 35.4154 },
  '泰安': { lng: 117.1291, lat: 36.1950 },
  '威海': { lng: 122.1164, lat: 37.5097 },
  '日照': { lng: 119.4619, lat: 35.4286 },
  '临沂': { lng: 118.3565, lat: 35.1047 },
  '德州': { lng: 116.3074, lat: 37.4540 },
  '聊城': { lng: 115.9804, lat: 36.4560 },
  '滨州': { lng: 118.0165, lat: 37.3835 },
  '菏泽': { lng: 115.4694, lat: 35.2465 },

  // 辽宁省
  '沈阳': { lng: 123.4315, lat: 41.8057 },
  '大连': { lng: 121.6147, lat: 38.9140 },
  '鞍山': { lng: 122.9956, lat: 41.1106 },
  '抚顺': { lng: 123.9211, lat: 41.8759 },
  '本溪': { lng: 123.7705, lat: 41.2979 },
  '丹东': { lng: 124.3830, lat: 40.1243 },
  '锦州': { lng: 121.1357, lat: 41.1193 },
  '营口': { lng: 122.2352, lat: 40.6674 },
  '阜新': { lng: 121.6481, lat: 42.0118 },
  '辽阳': { lng: 123.1815, lat: 41.2694 },
  '盘锦': { lng: 122.0696, lat: 41.1245 },
  '铁岭': { lng: 123.8443, lat: 42.2906 },
  '朝阳': { lng: 120.4512, lat: 41.5768 },
  '葫芦岛': { lng: 120.8564, lat: 40.7556 },

  // 福建省
  '福州': { lng: 119.2965, lat: 26.0745 },
  '厦门': { lng: 118.0894, lat: 24.4798 },
  '莆田': { lng: 119.0075, lat: 25.4310 },
  '三明': { lng: 117.6350, lat: 26.2654 },
  '泉州': { lng: 118.5894, lat: 24.9089 },
  '漳州': { lng: 117.6618, lat: 24.5109 },
  '南平': { lng: 118.1785, lat: 26.6356 },
  '龙岩': { lng: 117.0298, lat: 25.0916 },
  '宁德': { lng: 119.5271, lat: 26.6592 },

  // 河北省
  '石家庄': { lng: 114.5149, lat: 38.0423 },
  '唐山': { lng: 118.1754, lat: 39.6351 },
  '秦皇岛': { lng: 119.5866, lat: 39.9425 },
  '邯郸': { lng: 114.4907, lat: 36.6127 },
  '邢台': { lng: 114.5088, lat: 37.0682 },
  '保定': { lng: 115.4823, lat: 38.8677 },
  '张家口': { lng: 114.8841, lat: 40.8119 },
  '承德': { lng: 117.9392, lat: 40.9762 },
  '沧州': { lng: 116.8575, lat: 38.3106 },
  '廊坊': { lng: 116.7044, lat: 39.5239 },
  '衡水': { lng: 115.6660, lat: 37.7351 },

  // 河南省
  '郑州': { lng: 113.6253, lat: 34.7466 },
  '开封': { lng: 114.3414, lat: 34.7972 },
  '洛阳': { lng: 112.4345, lat: 34.6630 },
  '平顶山': { lng: 113.3077, lat: 33.7352 },
  '安阳': { lng: 114.3525, lat: 36.1034 },
  '鹤壁': { lng: 114.2954, lat: 35.8982 },
  '新乡': { lng: 113.8836, lat: 35.3026 },
  '焦作': { lng: 113.2383, lat: 35.2390 },
  '濮阳': { lng: 115.0413, lat: 35.7682 },
  '许昌': { lng: 113.8261, lat: 34.0230 },
  '漯河': { lng: 114.0264, lat: 33.5759 },
  '三门峡': { lng: 111.1941, lat: 34.7773 },
  '南阳': { lng: 112.5409, lat: 32.9991 },
  '商丘': { lng: 115.6505, lat: 34.4371 },
  '信阳': { lng: 114.0750, lat: 32.1233 },
  '周口': { lng: 114.6496, lat: 33.6204 },
  '驻马店': { lng: 114.0247, lat: 32.9802 },

  // 湖北省
  '武汉': { lng: 114.3054, lat: 30.5931 },
  '黄石': { lng: 115.0770, lat: 30.2201 },
  '十堰': { lng: 110.7879, lat: 32.6469 },
  '宜昌': { lng: 111.2908, lat: 30.7026 },
  '襄阳': { lng: 112.1442, lat: 32.0424 },
  '鄂州': { lng: 114.8906, lat: 30.3965 },
  '荆门': { lng: 112.2043, lat: 31.0354 },
  '孝感': { lng: 113.9267, lat: 30.9264 },
  '荆州': { lng: 112.2381, lat: 30.3268 },
  '黄冈': { lng: 114.8794, lat: 30.4477 },
  '咸宁': { lng: 114.3289, lat: 29.8328 },
  '随州': { lng: 113.3738, lat: 31.7175 },
  '恩施': { lng: 109.4870, lat: 30.2831 },

  // 湖南省
  '长沙': { lng: 112.9388, lat: 28.2282 },
  '株洲': { lng: 113.1517, lat: 27.8358 },
  '湘潭': { lng: 112.9440, lat: 27.8297 },
  '衡阳': { lng: 112.6077, lat: 26.9004 },
  '邵阳': { lng: 111.4692, lat: 27.2378 },
  '岳阳': { lng: 113.1329, lat: 29.3703 },
  '常德': { lng: 111.6913, lat: 29.0402 },
  '张家界': { lng: 110.4799, lat: 29.1274 },
  '益阳': { lng: 112.3550, lat: 28.5700 },
  '郴州': { lng: 113.0321, lat: 25.7936 },
  '永州': { lng: 111.6080, lat: 26.4345 },
  '怀化': { lng: 109.9782, lat: 27.5501 },
  '娄底': { lng: 112.0085, lat: 27.7281 },

  // 四川省
  '成都': { lng: 104.0665, lat: 30.5728 },
  '自贡': { lng: 104.7734, lat: 29.3528 },
  '攀枝花': { lng: 101.7160, lat: 26.5804 },
  '泸州': { lng: 105.4434, lat: 28.8891 },
  '德阳': { lng: 104.3986, lat: 31.1280 },
  '绵阳': { lng: 104.7417, lat: 31.4640 },
  '广元': { lng: 105.8298, lat: 32.4337 },
  '遂宁': { lng: 105.5713, lat: 30.5133 },
  '内江': { lng: 105.0581, lat: 29.5803 },
  '乐山': { lng: 103.7613, lat: 29.5820 },
  '南充': { lng: 106.0823, lat: 30.7953 },
  '眉山': { lng: 103.8315, lat: 30.0483 },
  '宜宾': { lng: 104.6308, lat: 28.7602 },
  '广安': { lng: 106.6334, lat: 30.4564 },
  '达州': { lng: 107.5023, lat: 31.2095 },
  '雅安': { lng: 103.0010, lat: 29.9877 },
  '巴中': { lng: 106.7537, lat: 31.8584 },
  '资阳': { lng: 104.6419, lat: 30.1222 },

  // 安徽省
  '合肥': { lng: 117.2272, lat: 31.8206 },
  '芜湖': { lng: 118.3765, lat: 31.3263 },
  '蚌埠': { lng: 117.3632, lat: 32.9397 },
  '淮南': { lng: 117.0184, lat: 32.6476 },
  '马鞍山': { lng: 118.5079, lat: 31.6894 },
  '淮北': { lng: 116.7947, lat: 33.9718 },
  '铜陵': { lng: 117.8166, lat: 30.9299 },
  '安庆': { lng: 117.0435, lat: 30.5088 },
  '黄山': { lng: 118.3173, lat: 29.7092 },
  '滁州': { lng: 118.3163, lat: 32.3036 },
  '阜阳': { lng: 115.8197, lat: 32.8970 },
  '宿州': { lng: 116.9841, lat: 33.6339 },
  '六安': { lng: 116.5077, lat: 31.7529 },
  '亳州': { lng: 115.7829, lat: 33.8693 },
  '池州': { lng: 117.4892, lat: 30.6560 },
  '宣城': { lng: 118.7577, lat: 30.9457 },

  // 广西壮族自治区
  '南宁': { lng: 108.3200, lat: 22.8240 },
  '柳州': { lng: 109.4117, lat: 24.3146 },
  '桂林': { lng: 110.2849, lat: 25.2736 },
  '梧州': { lng: 111.2976, lat: 23.4748 },
  '北海': { lng: 109.1192, lat: 21.4733 },
  '防城港': { lng: 108.3455, lat: 21.6146 },
  '钦州': { lng: 108.6242, lat: 21.9672 },
  '贵港': { lng: 109.6021, lat: 23.0936 },
  '玉林': { lng: 110.1544, lat: 22.6314 },
  '百色': { lng: 106.6163, lat: 23.8977 },
  '贺州': { lng: 111.5521, lat: 24.4141 },
  '河池': { lng: 108.0621, lat: 24.6959 },
  '来宾': { lng: 109.2298, lat: 23.7338 },
  '崇左': { lng: 107.3539, lat: 22.4041 },

  // 黑龙江省
  '哈尔滨': { lng: 126.5349, lat: 45.8038 },
  '齐齐哈尔': { lng: 123.9579, lat: 47.3481 },
  '鸡西': { lng: 130.9759, lat: 45.3000 },
  '鹤岗': { lng: 130.2775, lat: 47.3321 },
  '双鸭山': { lng: 131.1573, lat: 46.6435 },
  '大庆': { lng: 125.1127, lat: 46.5907 },
  '伊春': { lng: 128.8994, lat: 47.7248 },
  '佳木斯': { lng: 130.3616, lat: 46.8096 },
  '七台河': { lng: 131.0156, lat: 45.7753 },
  '牡丹江': { lng: 129.6186, lat: 44.5830 },
  '黑河': { lng: 127.4990, lat: 50.2496 },
  '绥化': { lng: 126.9929, lat: 46.6374 },

  // 吉林省
  '长春': { lng: 125.3235, lat: 43.8171 },
  '吉林': { lng: 126.5530, lat: 43.8436 },
  '四平': { lng: 124.3708, lat: 43.1703 },
  '辽源': { lng: 125.1453, lat: 42.9027 },
  '通化': { lng: 125.9365, lat: 41.7212 },
  '白山': { lng: 126.4278, lat: 41.9425 },
  '松原': { lng: 124.8236, lat: 45.1182 },
  '白城': { lng: 122.8411, lat: 45.6190 },
  '延边': { lng: 129.5132, lat: 42.9048 },

  // 江西省
  '南昌': { lng: 115.8579, lat: 28.6829 },
  '景德镇': { lng: 117.1784, lat: 29.2686 },
  '萍乡': { lng: 113.8512, lat: 27.6229 },
  '九江': { lng: 115.9928, lat: 29.7120 },
  '新余': { lng: 114.9308, lat: 27.8108 },
  '鹰潭': { lng: 117.0338, lat: 28.2386 },
  '赣州': { lng: 114.9359, lat: 25.8453 },
  '吉安': { lng: 114.9865, lat: 27.1120 },
  '宜春': { lng: 114.3911, lat: 27.8043 },
  '抚州': { lng: 116.3584, lat: 27.9839 },
  '上饶': { lng: 117.9712, lat: 28.4444 },

  // 山西省
  '太原': { lng: 112.5489, lat: 37.8706 },
  '大同': { lng: 113.3014, lat: 40.0768 },
  '阳泉': { lng: 113.5833, lat: 37.8612 },
  '长治': { lng: 113.1136, lat: 36.1911 },
  '晋城': { lng: 112.8513, lat: 35.4976 },
  '朔州': { lng: 112.4333, lat: 39.3313 },
  '晋中': { lng: 112.7365, lat: 37.6965 },
  '运城': { lng: 111.0039, lat: 35.0228 },
  '忻州': { lng: 112.7335, lat: 38.4177 },
  '临汾': { lng: 111.5180, lat: 36.0842 },
  '吕梁': { lng: 111.1343, lat: 37.5244 },

  // 贵州省
  '贵阳': { lng: 106.6302, lat: 26.6477 },
  '六盘水': { lng: 104.8467, lat: 26.5846 },
  '遵义': { lng: 106.9373, lat: 27.7066 },
  '安顺': { lng: 105.9322, lat: 26.2455 },
  '毕节': { lng: 105.2850, lat: 27.3017 },
  '铜仁': { lng: 109.1916, lat: 27.7183 },
  '黔西南': { lng: 104.8980, lat: 25.0881 },
  '黔东南': { lng: 107.9775, lat: 26.5834 },
  '黔南': { lng: 107.5172, lat: 26.2582 },

  // 云南省
  '昆明': { lng: 102.8329, lat: 24.8801 },
  '曲靖': { lng: 103.7978, lat: 25.5016 },
  '玉溪': { lng: 102.5439, lat: 24.3505 },
  '保山': { lng: 99.1671, lat: 25.1118 },
  '昭通': { lng: 103.7172, lat: 27.3370 },
  '丽江': { lng: 100.2330, lat: 26.8721 },
  '普洱': { lng: 100.9723, lat: 22.7773 },
  '临沧': { lng: 100.0865, lat: 23.8866 },
  '楚雄': { lng: 101.5460, lat: 25.0419 },
  '红河': { lng: 103.3841, lat: 23.3668 },
  '文山': { lng: 104.2440, lat: 23.3692 },
  '西双版纳': { lng: 100.7979, lat: 22.0017 },
  '大理': { lng: 100.2257, lat: 25.5894 },
  '德宏': { lng: 98.5784, lat: 24.4367 },
  '怒江': { lng: 98.8543, lat: 25.8509 },
  '迪庆': { lng: 99.7065, lat: 27.8269 },

  // 陕西省
  '西安': { lng: 108.9402, lat: 34.3416 },
  '铜川': { lng: 108.9796, lat: 34.9166 },
  '宝鸡': { lng: 107.1449, lat: 34.3693 },
  '咸阳': { lng: 108.7051, lat: 34.3334 },
  '渭南': { lng: 109.5029, lat: 34.4994 },
  '延安': { lng: 109.4908, lat: 36.5965 },
  '汉中': { lng: 107.0286, lat: 33.0777 },
  '榆林': { lng: 109.7412, lat: 38.2902 },
  '安康': { lng: 109.0293, lat: 32.6903 },
  '商洛': { lng: 109.9398, lat: 33.8683 },

  // 甘肃省
  '兰州': { lng: 103.8236, lat: 36.0594 },
  '嘉峪关': { lng: 98.2773, lat: 39.7865 },
  '金昌': { lng: 102.1879, lat: 38.5142 },
  '白银': { lng: 104.1736, lat: 36.5457 },
  '天水': { lng: 105.7250, lat: 34.5785 },
  '武威': { lng: 102.6347, lat: 37.9298 },
  '张掖': { lng: 100.4555, lat: 38.9329 },
  '平凉': { lng: 106.6847, lat: 35.5428 },
  '酒泉': { lng: 98.5108, lat: 39.7440 },
  '庆阳': { lng: 107.6384, lat: 35.7342 },
  '定西': { lng: 104.6260, lat: 35.5796 },
  '陇南': { lng: 104.9294, lat: 33.3886 },
  '临夏': { lng: 103.2120, lat: 35.5994 },
  '甘南': { lng: 102.9110, lat: 34.9865 },

  // 内蒙古自治区
  '呼和浩特': { lng: 111.7492, lat: 40.8426 },
  '包头': { lng: 109.8404, lat: 40.6575 },
  '乌海': { lng: 106.8256, lat: 39.6737 },
  '赤峰': { lng: 118.9568, lat: 42.2753 },
  '通辽': { lng: 122.2631, lat: 43.6174 },
  '鄂尔多斯': { lng: 109.9903, lat: 39.8172 },
  '呼伦贝尔': { lng: 119.7582, lat: 49.2153 },
  '巴彦淖尔': { lng: 107.4165, lat: 40.7574 },
  '乌兰察布': { lng: 113.1145, lat: 41.0341 },
  '兴安盟': { lng: 122.0703, lat: 46.0762 },
  '锡林郭勒': { lng: 116.0910, lat: 43.9440 },
  '阿拉善': { lng: 105.7284, lat: 38.8515 },

  // 新疆维吾尔自治区
  '乌鲁木齐': { lng: 87.6168, lat: 43.8256 },
  '克拉玛依': { lng: 84.8739, lat: 45.5959 },
  '吐鲁番': { lng: 89.1841, lat: 42.9476 },
  '哈密': { lng: 93.5132, lat: 42.8332 },
  '昌吉': { lng: 87.3040, lat: 44.0146 },
  '博尔塔拉': { lng: 82.0748, lat: 44.9033 },
  '巴音郭楞': { lng: 86.1510, lat: 41.7686 },
  '阿克苏': { lng: 80.2651, lat: 41.1707 },
  '克孜勒苏': { lng: 76.1728, lat: 39.7134 },
  '喀什': { lng: 75.9898, lat: 39.4679 },
  '和田': { lng: 79.9253, lat: 37.1107 },
  '伊犁': { lng: 81.3179, lat: 43.9219 },
  '塔城': { lng: 82.9857, lat: 46.7463 },
  '阿勒泰': { lng: 88.1396, lat: 47.8484 },

  // 青海省
  '西宁': { lng: 101.7782, lat: 36.6171 },
  '海东': { lng: 102.1033, lat: 36.5029 },
  '海北': { lng: 100.9011, lat: 36.9594 },
  '黄南': { lng: 102.0199, lat: 35.5177 },
  '海南': { lng: 100.6203, lat: 36.2804 },
  '果洛': { lng: 100.2421, lat: 34.4736 },
  '玉树': { lng: 97.0085, lat: 33.0040 },
  '海西': { lng: 97.3708, lat: 37.3747 },

  // 宁夏回族自治区
  '银川': { lng: 106.2309, lat: 38.4872 },
  '石嘴山': { lng: 106.3762, lat: 39.0133 },
  '吴忠': { lng: 106.1994, lat: 37.9862 },
  '固原': { lng: 106.2852, lat: 36.0046 },
  '中卫': { lng: 105.1896, lat: 37.5149 },

  // 西藏自治区
  '拉萨': { lng: 91.1322, lat: 29.6604 },
  '日喀则': { lng: 88.8851, lat: 29.2675 },
  '昌都': { lng: 97.1785, lat: 31.1369 },
  '林芝': { lng: 94.3624, lat: 29.6547 },
  '山南': { lng: 91.7665, lat: 29.2360 },
  '那曲': { lng: 92.0602, lat: 31.4760 },
  '阿里': { lng: 80.1055, lat: 32.5032 },

  // 海南省
  '海口': { lng: 110.1999, lat: 20.0174 },
  '三亚': { lng: 109.5119, lat: 18.2528 },
  '三沙': { lng: 112.3488, lat: 16.8310 },
  '儋州': { lng: 109.5808, lat: 19.5211 },

  // 港澳台地区
  '香港': { lng: 114.1694, lat: 22.3193 },
  '澳门': { lng: 113.5491, lat: 22.1987 },
  '台北': { lng: 121.5200, lat: 25.0308 },
  '新北': { lng: 121.4619, lat: 25.0127 },
  '桃园': { lng: 121.2168, lat: 24.9936 },
  '台中': { lng: 120.6700, lat: 24.2330 },
  '台南': { lng: 120.2510, lat: 23.1417 },
  '高雄': { lng: 120.3120, lat: 22.6209 },

  // 计划单列市及重要城市
  '大连': { lng: 121.6147, lat: 38.9140 },
  '青岛': { lng: 120.3826, lat: 36.0671 },
  '宁波': { lng: 121.5498, lat: 29.8683 },
  '厦门': { lng: 118.0894, lat: 24.4798 },
  '深圳': { lng: 114.0859, lat: 22.5470 },
  '雄安新区': { lng: 115.8916, lat: 38.9752 }
}