adress.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. import config from '@/config'
  2. const mapKey = config.mapKey;
  3. const appName = config.appName;
  4. // const QQMapWX = require('./qqmap-wx-jssdk.js')
  5. import QQMapWX from './qqmap-wx-jssdk.js'
  6. import addressData from './address.js';
  7. /**
  8. * 腾讯位置服务地图选点
  9. */
  10. const chooseLocationInit = (data) => {
  11. // const key = mapKey; //使用在腾讯位置服务申请的key
  12. // const referer = appName; //调用插件的app的名称
  13. // wx.navigateTo({
  14. // url: `plugin://chooseLocation/index?key=${key}&referer=${referer}`,
  15. // });
  16. return new Promise((resolve, reject) => {
  17. wx.chooseLocation({
  18. ...data,
  19. success: function(res){
  20. console.log('111',res);
  21. const result = splitAddress(res.address);
  22. const handlecityData = getCityCode([result.province,result.city,result.district].join(' '))
  23. resolve({...res,cityCode:handlecityData})
  24. },
  25. fail: function(res){
  26. console.log('fail',res);
  27. reject();
  28. }
  29. })
  30. })
  31. }
  32. /**
  33. * 腾讯位置服务城市选择器
  34. * @param {*} city 城市名称
  35. */
  36. const citySelectorNavigateTo = (city) => {
  37. const key = mapKey; // 使用在腾讯位置服务申请的key
  38. const referer = appName; // 调用插件的app的名称
  39. const hotCitys = '重庆'; // 用户自定义的的热门城市
  40. // wx.navigateTo({
  41. // url: `plugin://citySelector/index?key=${key}&referer=${referer}&hotCitys=${hotCitys}`,
  42. // })
  43. // wx.choosePoi({
  44. // success: function(res){
  45. // // address: "重庆市永川区文昌西路南"
  46. // // errMsg: "choosePoi:ok"
  47. // // latitude: 0
  48. // // longitude: 0
  49. // // name: "中国人民大学文化科技园"
  50. // // type: 2
  51. // console.log('111',res);
  52. // },
  53. // fail: function(res){
  54. // console.log('fail',res);
  55. // }
  56. // })
  57. // return new Promise((resolve, reject) => {
  58. // wx.chooseLocation({
  59. // success: function(res){
  60. // console.log('111',res);
  61. // resolve(res)
  62. // },
  63. // fail: function(res){
  64. // console.log('fail',res);
  65. // reject();
  66. // }
  67. // })
  68. // })
  69. }
  70. function locateTheCurrentAddress(){
  71. return new Promise((resolve, reject) => {
  72. wx.getFuzzyLocation({
  73. type: 'gcj02',
  74. success: function (res) {
  75. const { latitude, longitude } =res;
  76. const qqmapsdk = new QQMapWX({ key: mapKey });
  77. qqmapsdk.reverseGeocoder({
  78. location: [latitude,longitude].join(','), // GCJ-02经纬度(纬度在前,经度在后)
  79. success: (res) => {
  80. console.log(res.result);
  81. const {address_component,formatted_addresses} = res.result;
  82. const {province,city,district} = address_component;
  83. const handlecityData = getCityCode([province,city,district].join(' '))
  84. resolve({
  85. name:formatted_addresses.standard_address,
  86. cityCode:handlecityData,
  87. latitude,
  88. longitude
  89. })
  90. },
  91. fail: (err) => { console.error(err);reject(); }
  92. });
  93. console.log('111', res,);
  94. },
  95. fail: function (res) {
  96. console.log('fail', res);
  97. reject();
  98. }
  99. })
  100. })
  101. }
  102. function splitAddress(address) {
  103. // 处理直辖市(如北京市朝阳区)
  104. const directCityRegex = /^(北京|天津|上海|重庆)(市)?(.+?区)/;
  105. const directMatch = address.match(directCityRegex);
  106. if (directMatch) {
  107. return {
  108. province: directMatch[1],
  109. city: directMatch[1] + '市',
  110. district: directMatch[3],
  111. detail: address.replace(directCityRegex, '')
  112. }
  113. }
  114. // 常规拆分逻辑
  115. const provinceRegex = /(.+?(省|自治区|行政区|特别行政区))/;
  116. const cityRegex = /(.+?(市|自治州|州|盟))/;
  117. const province = address.match(provinceRegex)?.[1] || '';
  118. const city = address.replace(province, '').match(cityRegex)?.[1] || '';
  119. const remaining = address.replace(province + city, '');
  120. const district = remaining.match(/(.+?( 区|县|市|旗))/)?.[1] || '';
  121. const detail = remaining.replace(district, '').trim();
  122. return { province, city, district, detail };
  123. }
  124. function normalizeAddress(str) {
  125. return str.replace(/(市|区|省)/g, '').trim();
  126. }
  127. /**
  128. * 根据地址字符串返回 name 数组、code 数组、index 路径
  129. * @param {string} address 例如:"重庆 重庆市 永川区"
  130. * @returns {Object|null} 包含 data/name、code、index 的对象
  131. */
  132. const getCityCode = (address) => {
  133. //address:重庆市永川区人民大道191号
  134. const names = address.split(/\s+/)
  135. const result = {
  136. data: [],
  137. code: [],
  138. index: []
  139. }
  140. // 查找省份
  141. const provinceIndex = addressData.findIndex(p => p.name.includes(names[0]))
  142. if (provinceIndex === -1) return null
  143. const province = addressData[provinceIndex]
  144. result.data.push(province.name)
  145. result.code.push(province.code)
  146. result.index.push(provinceIndex)
  147. if (names.length < 2) return result
  148. // 查找城市
  149. const cityIndex = province.children.findIndex(c => c.name.includes(names[1]))
  150. if (cityIndex === -1) return result
  151. const city = province.children[cityIndex]
  152. result.data.push(city.name)
  153. result.code.push(city.code)
  154. result.index.push(cityIndex)
  155. if (names.length < 3) return result
  156. // 查找区县
  157. const districtIndex = city.children.findIndex(d => d.name.includes(names[2]))
  158. if (districtIndex === -1) return result
  159. const district = city.children[districtIndex]
  160. result.data.push(district.name)
  161. result.code.push(district.code)
  162. result.index.push(districtIndex)
  163. return result
  164. }
  165. export {
  166. chooseLocationInit,
  167. citySelectorNavigateTo,
  168. splitAddress,
  169. getCityCode,
  170. locateTheCurrentAddress
  171. }