adress.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import config from '@/config'
  2. const mapKey = config.mapKey;
  3. const appName = config.appName;
  4. import addressData from './address'
  5. /**
  6. * 腾讯位置服务地图选点
  7. */
  8. const chooseLocationInit = () => {
  9. const key = mapKey; //使用在腾讯位置服务申请的key
  10. const referer = appName; //调用插件的app的名称
  11. wx.navigateTo({
  12. url: `plugin://chooseLocation/index?key=${key}&referer=${referer}`,
  13. });
  14. }
  15. /**
  16. * 腾讯位置服务城市选择器
  17. * @param {*} city 城市名称
  18. */
  19. const citySelectorNavigateTo = (city) => {
  20. const key = mapKey; // 使用在腾讯位置服务申请的key
  21. const referer = appName; // 调用插件的app的名称
  22. const hotCitys = '重庆'; // 用户自定义的的热门城市
  23. wx.navigateTo({
  24. url: `plugin://citySelector/index?key=${key}&referer=${referer}&hotCitys=${hotCitys}`,
  25. })
  26. }
  27. function splitAddress(address) {
  28. // 处理直辖市(如北京市朝阳区)
  29. const directCityRegex = /^(北京|天津|上海|重庆)(市)?(.+?区)/;
  30. const directMatch = address.match(directCityRegex);
  31. if (directMatch) {
  32. return {
  33. province: directMatch[1],
  34. city: directMatch[1] + '市',
  35. district: directMatch[3],
  36. detail: address.replace(directCityRegex, '')
  37. }
  38. }
  39. // 常规拆分逻辑
  40. const provinceRegex = /(.+?(省|自治区|行政区|特别行政区))/;
  41. const cityRegex = /(.+?(市|自治州|州|盟))/;
  42. const province = address.match(provinceRegex)?.[1] || '';
  43. const city = address.replace(province, '').match(cityRegex)?.[1] || '';
  44. const remaining = address.replace(province + city, '');
  45. const district = remaining.match(/(.+?( 区|县|市|旗))/)?.[1] || '';
  46. const detail = remaining.replace(district, '').trim();
  47. return { province, city, district, detail };
  48. }
  49. function normalizeAddress(str) {
  50. return str.replace(/(市|区|省)/g, '').trim();
  51. }
  52. /**
  53. * 根据地址字符串返回 name 数组、code 数组、index 路径
  54. * @param {string} address 例如:"重庆 重庆市 永川区"
  55. * @returns {Object|null} 包含 data/name、code、index 的对象
  56. */
  57. const getCityCode = (address) => {
  58. // //address:重庆市永川区人民大道191号
  59. // const names = normalizeAddress(address).split(/\s+/);
  60. // let result = [];
  61. // // 查找省份
  62. // let province = addressData.find(p => p.name.includes(names[0]));
  63. // if (!province) return [];
  64. // result.push(province.code);
  65. // if (names.length < 2) return result;
  66. // // 查找城市
  67. // let city = province.children?.find(c => c.name.includes(names[1]));
  68. // if (!city) return result;
  69. // result.push(city.code);
  70. // if (names.length < 3) return result;
  71. // // 查找区县
  72. // let district = city.children?.find(d => d.name.includes(names[2]));
  73. // if (!district) return result;
  74. // result.push(district.code);
  75. // return result;
  76. const names = address.split(/\s+/)
  77. const result = {
  78. data: [],
  79. code: [],
  80. index: []
  81. }
  82. // 查找省份
  83. const provinceIndex = addressData.findIndex(p => p.name.includes(names[0]))
  84. if (provinceIndex === -1) return null
  85. const province = addressData[provinceIndex]
  86. result.data.push(province.name)
  87. result.code.push(province.code)
  88. result.index.push(provinceIndex)
  89. if (names.length < 2) return result
  90. // 查找城市
  91. const cityIndex = province.children.findIndex(c => c.name.includes(names[1]))
  92. if (cityIndex === -1) return result
  93. const city = province.children[cityIndex]
  94. result.data.push(city.name)
  95. result.code.push(city.code)
  96. result.index.push(cityIndex)
  97. if (names.length < 3) return result
  98. // 查找区县
  99. const districtIndex = city.children.findIndex(d => d.name.includes(names[2]))
  100. if (districtIndex === -1) return result
  101. const district = city.children[districtIndex]
  102. result.data.push(district.name)
  103. result.code.push(district.code)
  104. result.index.push(districtIndex)
  105. return result
  106. }
  107. export {
  108. chooseLocationInit,
  109. citySelectorNavigateTo,
  110. splitAddress,
  111. getCityCode
  112. }