mapView.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. let lastTapTime = 0;
  2. Page({
  3. data: {
  4. latitude: 25.470415, // 默认中心纬度
  5. longitude: 110.273511, // 默认中心经度
  6. scale: 5,
  7. markers: [], // 初始化为空数组,后续动态填充
  8. showOverlay: false, // 是否显示图层
  9. mapContext: null, // 地图上下文对象
  10. excelData: []
  11. },
  12. onLoad() {
  13. // 假设已将 Excel 数据解析为以下数组
  14. const excelData = [
  15. { 土壤编号: "土1", 地点: "广西武鸣", dust_emissions: 5.34, longitude: 106.476143, latitude: 23.891756 },
  16. { 土壤编号: "土2", 地点: "广西河池", dust_emissions: 3.96, longitude: 107.476143, latitude: 24.891756 },
  17. { 土壤编号: "土3", 地点: "海南澄迈老城镇罗驿村委会罗驿洋", dust_emissions: 4.56, longitude: 110.125, latitude: 19.901756 },
  18. { 土壤编号: "土4", 地点: "广东江门新会", dust_emissions: 4.0, longitude: 109.476143, latitude: 22.461756 },
  19. { 土壤编号: "土5", 地点: "广州增城Z6", dust_emissions: 4.77, longitude: 110.476143, latitude: 21.891756 },
  20. { 土壤编号: "土6", 地点: "广州增城Z8", dust_emissions: 4.59, longitude: 111.476143, latitude: 22.891756 },
  21. { 土壤编号: "土7", 地点: "湖南岳阳", dust_emissions: 5.14, longitude: 112.476143, latitude: 23.891756 },
  22. { 土壤编号: "土8", 地点: "广东韶关武江", dust_emissions: 5.07, longitude: 113.476143, latitude: 24.891756 },
  23. { 土壤编号: "土9", 地点: "海南临高头星村", dust_emissions: 4.12, longitude: 109.684993, latitude: 19.83774 },
  24. { 土壤编号: "土10", 地点: "海南临高周礼村", dust_emissions: 5.0, longitude: 109.710703, latitude: 19.89222 },
  25. { 土壤编号: "土11", 地点: "海南澄迈金江", dust_emissions: 4.6, longitude: 110.069537, latitude: 19.81189 },
  26. { 土壤编号: "土12", 地点: "海南临高南贤村", dust_emissions: 4.2, longitude: 109.768714, latitude: 19.874323 },
  27. { 土壤编号: "土13", 地点: "海南澄迈金江北让村", dust_emissions: 4.5, longitude: 110.096765, latitude: 19.814288 },
  28. { 土壤编号: "土14", 地点: "广西扶绥", dust_emissions: 4.71, longitude: 107.7717789, latitude: 22.5166902 },
  29. { 土壤编号: "土15", 地点: "广西江州", dust_emissions: 4.31, longitude: 107.56347787, latitude: 22.6022203 },
  30. { 土壤编号: "土16", 地点: "广西龙州", dust_emissions: 5.15, longitude: 106.7870847, latitude: 22.3496497 },
  31. { 土壤编号: "土17", 地点: "广西大新", dust_emissions: 4.71, longitude: 107.0230641, latitude: 22.5857946 },
  32. { 土壤编号: "土18", 地点: "湖南岳阳荣家湾", dust_emissions: 5.04, longitude: 113.059629, latitude: 29.267061 },
  33. { 土壤编号: "土19", 地点: "湖南长沙", dust_emissions: 5.08, longitude: 113.059629, latitude: 28.440613 },
  34. { 土壤编号: "土20", 地点: "浙江", dust_emissions: 4.8, longitude: 111.45527, latitude: 24.395235 },
  35. { 土壤编号: "土21", 地点: "云南陆良", dust_emissions: 4.67, longitude: 112.45527, latitude: 25.395235 },
  36. { 土壤编号: "土22", 地点: "南昌横龙镇南园组", dust_emissions: 4.8, longitude: 113.45527, latitude: 26.395235 },
  37. { 土壤编号: "土23", 地点: "南昌横龙枫塘南园", dust_emissions: 5.1, longitude: 114.45527, latitude: 27.395235 },
  38. { 土壤编号: "土24", 地点: "南昌横龙镇院塘村", dust_emissions: 4.27, longitude: 114.852, latitude: 27.3947 },
  39. { 土壤编号: "土25", 地点: "江西山庄乡秀水村黄田组", dust_emissions: 4.27, longitude: 114.852, latitude: 27.5247 },
  40. { 土壤编号: "土26", 地点: "贵州双星村", dust_emissions: 4.7, longitude: 106.852, latitude: 27.3147},
  41. { 土壤编号: "土27", 地点: "湖南永州八宝镇唐家州", dust_emissions: 4.57, longitude: 113.952, latitude: 26.08147 },
  42. { 土壤编号: "土28", 地点: "湖南永州金洞", dust_emissions: 5.3, longitude: 112.1564, latitude: 26.1685 },
  43. { 土壤编号: "土29", 地点: "祁阳县中国农业科学院红壤实验室", dust_emissions: 4.75, longitude: 111.4, latitude: 22.24 },
  44. { 土壤编号: "土30", 地点: "福建福州1", dust_emissions: 4.31, longitude: 112.4, latitude: 23.24 },
  45. { 土壤编号: "土31", 地点: "福建福州2", dust_emissions: 4.38, longitude: 113.4, latitude: 24.24 },
  46. { 土壤编号: "土32", 地点: "广东省韶关市南雄市下塅村", dust_emissions: 5.51, longitude: 114.4, latitude: 25.24 },
  47. { 土壤编号: "土33", 地点: "广东省韶关市南雄市河塘西216米", dust_emissions: 6.44, longitude: 114.28, latitude: 25.14 },
  48. { 土壤编号: "土34", 地点: "广东省韶关市南雄市上何屋西南500米", dust_emissions: 5.25, longitude: 114.15, latitude: 24.86 },
  49. { 土壤编号: "土35", 地点: "广东省南雄市雄州街道林屋", dust_emissions: 4.62333333333333, longitude: 114.23, latitude: 25.4 },
  50. { 土壤编号: "土36", 地点: "广东省台山都斛镇", dust_emissions: 3.0, longitude: 112.34, latitude: 27.31 },
  51. { 土壤编号: "土52", 地点: "湖南省长沙市浏阳市永安镇千鹭湖", dust_emissions: 4.72333333333333, longitude: 113.34, latitude: 28.31 },
  52. { 土壤编号: "土53", 地点: "湖南省长沙市浏阳市湖南农大实习基地", dust_emissions: 5.55333333333333, longitude: 113.83, latitude: 28.3 },
  53. { 土壤编号: "土54", 地点: "湖南省邵阳市罗市镇1", dust_emissions: 4.64, longitude: 110.35, latitude: 25.47 },
  54. { 土壤编号: "土55", 地点: "湖南省邵阳市罗市镇2", dust_emissions: 5.01333333333333, longitude: 111.35, latitude: 26.47 },
  55. { 土壤编号: "土56", 地点: "湖南省邵阳市罗市镇3", dust_emissions: 5.18, longitude: 112.35, latitude: 27.47 },
  56. { 土壤编号: "土57", 地点: "长沙县高桥镇的省农科院高桥科研基地1", dust_emissions: 5.1, longitude: 113.35, latitude: 28.47 },
  57. { 土壤编号: "土58", 地点: "长沙县高桥镇的省农科院高桥科研基地2", dust_emissions: 4.92, longitude: 113.35, latitude: 28.47 },
  58. { 土壤编号: "土59", 地点: "湖南省长沙市望城区桐林坳社区", dust_emissions: 3.0, longitude: 112.8, latitude: 28.37 },
  59. { 土壤编号: "土60", 地点: "湖南省益阳市赫山区泥江口镇", dust_emissions: 3.0, longitude: 107.37, latitude: 21.92 },
  60. { 土壤编号: "土70", 地点: "南宁市兴宁区柳杨路26号", dust_emissions: 3.0, longitude: 108.37, latitude: 22.92 },
  61. { 土壤编号: "土71", 地点: "南宁市兴宁区柳杨路广西私享家家具用品", dust_emissions: 3.0, longitude: 108.37, latitude: 23.94 },
  62. { 土壤编号: "土72", 地点: "南宁市兴宁区004乡道", dust_emissions: 6.24666666666667, longitude: 108.39, latitude: 24.92 },
  63. { 土壤编号: "土73", 地点: "南宁市兴宁区G7201南宁绕城高速", dust_emissions: 3.0, longitude: 108.4, latitude: 25.94 },
  64. { 土壤编号: "土74", 地点: "南宁市兴宁区012县道", dust_emissions: 3.0, longitude: 108.41, latitude: 26.92 },
  65. { 土壤编号: "土75", 地点: "南宁市兴宁区那况路168号", dust_emissions: 3.0, longitude: 108.4, latitude: 27.9 },
  66. { 土壤编号: "土76", 地点: "南宁市西乡塘区翊武路", dust_emissions: 5.37, longitude: 108.35, latitude: 28.96 },
  67. { 土壤编号: "土77", 地点: "南宁市西乡塘区坛洛镇", dust_emissions: 3.0, longitude: 107.85, latitude: 29.92 },
  68. { 土壤编号: "土81", 地点: "铜仁职业技术学院", dust_emissions: 4.0, longitude: 108.85, latitude: 27.34 },
  69. { 土壤编号: "土87", 地点: "江西省红壤及种质资源研究所(进贤基地)1", dust_emissions: 4.55, longitude: 116.17, latitude: 28.34 },
  70. { 土壤编号: "土88", 地点: "江西省红壤及种质资源研究所(进贤基地)2", dust_emissions: 4.99333333333333, longitude: 116.17, latitude: 28.34 }
  71. ];
  72. // 保存数据到data和实例变量
  73. this.setData({ excelData });
  74. this.excelData = excelData;
  75. // 动态生成 markers 数据
  76. const markers = excelData.map((item, index) => ({
  77. id: index + 1, // 标记点 ID
  78. latitude: item.latitude, // 纬度
  79. longitude: item.longitude, // 经度
  80. iconPath: "../../assets/taddar/marker.png", // 标记点图标路径
  81. width: 34,
  82. height: 34,
  83. callout: {
  84. content: `${item.地点} - pH值: ${parseFloat(item.dust_emissions).toFixed(2)}`, // 显示地名和污染物排放量
  85. display: "BYCLICK", // 点击时显示气泡
  86. fontSize: 14,
  87. color: "#333",
  88. bgColor: "#fff",
  89. borderColor: "#ccc",
  90. borderRadius: 5,
  91. borderWidth: 1,
  92. padding: 10,
  93. textAlign: "center",
  94. anchorX: 0.5,
  95. anchorY: -5
  96. }
  97. }));
  98. // 更新 markers 数据
  99. this.setData({
  100. markers,
  101. mapContext: wx.createMapContext("map", this)
  102. });
  103. },
  104. // 切换图层显示
  105. toggleOverlay(e) {
  106. const showOverlay = e.detail.value;
  107. this.setData({ showOverlay });
  108. if (showOverlay) {
  109. console.log("准备添加地面覆盖物");
  110. // 添加地面覆盖物
  111. this.data.mapContext.addGroundOverlay({
  112. id: 1, // 覆盖物 ID
  113. src: 'https://soilgd.com/images/farmland_cut.png',// 图片路径
  114. bounds: {
  115. southwest: { latitude: 18.03, longitude: 104.25 }, // 图左下角坐标
  116. northeast: { latitude: 31.26, longitude: 119.86 } // 图片右上角坐标
  117. },
  118. opacity: 0.7, // 图片透明度
  119. zIndex: 999, // 设置较高的 zIndex
  120. success: (res) => {
  121. console.log('添加地面覆盖物成功', res);
  122. },
  123. fail: (err) => {
  124. console.error('添加地面覆盖物失败', err);
  125. }
  126. });
  127. } else {
  128. console.log("准备移除地面覆盖物");
  129. // 移除地面覆盖物
  130. this.data.mapContext.removeGroundOverlay({
  131. id: 1, // 覆盖物 ID
  132. success: (res) => {
  133. console.log('移除地面覆盖物成功', res);
  134. },
  135. fail: (err) => {
  136. console.error('移除地面覆盖物失败', err);
  137. }
  138. });
  139. }
  140. },
  141. onMarkerTap(e) {
  142. const markerId = e.detail.markerId;
  143. // 不处理临时标记点击
  144. if (markerId === 0) return;
  145. const markers = this.data.markers.map(marker => {
  146. if (marker.id === markerId) {
  147. marker.callout.display = "ALWAYS";
  148. } else if (marker.id !== 0) { // 保持临时标记显示
  149. marker.callout.display = "NEVER";
  150. }
  151. return marker;
  152. });
  153. this.setData({ markers });
  154. },
  155. onCalloutTap(e) {
  156. console.log("Callout clicked:", e.detail.markerId);
  157. },
  158. handleMapTap(e) {
  159. const now = Date.now();
  160. if (now - lastTapTime < 1000) return;
  161. lastTapTime = now;
  162. const { latitude, longitude } = e.detail;
  163. wx.qqmapsdk.reverseGeocoder({
  164. location: { latitude, longitude },
  165. success: (res) => {
  166. const address = res.result.address_component;
  167. const locationDesc = res.result.location_description || '';
  168. const isValidLand = (
  169. address.nation === '中国' &&
  170. !['香港', '澳门', '台湾'].includes(address.province) &&
  171. address.city !== '三沙市' && // 排除南海海域行政中心
  172. !locationDesc.includes('海域') && // 排除描述含海域的关键词
  173. address.district !== '' // 排除无区县信息区域
  174. );
  175. if (isValidLand) {
  176. wx.showLoading({ title: '计算中...' });
  177. // 调用克里金插值接口
  178. wx.request({
  179. url: 'https://soilgd.com:5000/kriging_interpolation',
  180. method: 'POST',
  181. header: { 'Content-Type': 'application/json' },
  182. data: {
  183. file_name: 'emissions.xlsx',
  184. emission_column: 'dust_emissions',
  185. points: [[longitude, latitude]] // 注意顺序:经度在前
  186. },
  187. success: (res) => {
  188. wx.hideLoading();
  189. if (res.statusCode === 200 && res.data.interpolated_concentrations) {
  190. const value = res.data.interpolated_concentrations[0];
  191. // 创建临时标记
  192. const tempMarker = {
  193. id: 0,
  194. latitude,
  195. longitude,
  196. iconPath: "../../assets/taddar/marker.png",
  197. width: 40,
  198. height: 40,
  199. callout: {
  200. content: `经度: ${longitude.toFixed(4)}\n纬度: ${latitude.toFixed(4)}\npH值: ${value.toFixed(2)}`,
  201. display: "ALWAYS",
  202. fontSize: 14,
  203. color: "#333",
  204. bgColor: "#fff",
  205. borderColor: "#07c160",
  206. borderRadius: 8,
  207. borderWidth: 2,
  208. padding: 12,
  209. anchorY: -10
  210. }
  211. };
  212. // 更新标记数组
  213. const markers = this.data.markers
  214. .filter(m => m.id !== 0)
  215. .concat(tempMarker);
  216. this.setData({ markers });
  217. }
  218. },
  219. fail: (err) => {
  220. wx.hideLoading();
  221. wx.showToast({ title: '计算失败', icon: 'none' });
  222. }
  223. });
  224. } else {
  225. wx.showToast({ title: '非有效陆地区域', icon: 'none' });
  226. }
  227. },
  228. fail: (err) => console.error('接口错误:', err)
  229. });
  230. },
  231. });