adress.js 7.8 KB

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