mapindex.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. function showInputView(){
  2. const box = document.getElementById("search-box");
  3. box.style.display = "block"; //设置样式为不显示(隐藏)
  4. // const citys = document.getElementById("citys");
  5. // citys.style.display = "block"; //设置样式为不显示(隐藏)
  6. }
  7. function hidInputView(){
  8. const box = document.getElementById("search-box");
  9. box.style.display = "none"; //设置样式为不显示(隐藏)
  10. // const citys = document.getElementById("citys");
  11. // citys.style.display = "none"; //设置样式为不显示(隐藏)
  12. }
  13. document.addEventListener('UniAppJSBridgeReady', function() {
  14. var lats = getQueryVariable('lat') * 1;
  15. var lngs = getQueryVariable('lng') * 1;
  16. var latn = getQueryVariable('nlat') * 1;
  17. var lngn = getQueryVariable('nlng') * 1;
  18. var sstate = getQueryVariable('sstate') * 1;
  19. var lg = getQueryVariable('lg') * 1;
  20. var zoom = 15; //地图缩放比例
  21. var coords = "";
  22. var startAddr="";
  23. var endcoords = "";
  24. var endAddr="";
  25. var mpcenter = "";
  26. var searchmarker = "";
  27. var showinput=false;
  28. var map; //地图
  29. var drawRouteMarker = []; //路线marker
  30. var directionsRendererArr = []; //地图路线
  31. /**
  32. * 初始化
  33. *
  34. */
  35. function initMap() {
  36. if (lats && lngs) {
  37. coords = {
  38. lat: lats,
  39. lng: lngs
  40. };
  41. mpcenter = {
  42. lat: lats,
  43. lng: lngs
  44. };
  45. } else {
  46. navigator.geolocation.getCurrentPosition(function(position) {
  47. coords = {
  48. lat: position.coords.latitude,
  49. lng: position.coords.longitude
  50. };
  51. mpcenter = {
  52. lat: position.coords.latitude-0.001,
  53. lng: position.coords.longitude
  54. };
  55. lats = position.coords.latitude;
  56. lngs = position.coords.longitude
  57. });
  58. }
  59. map = new google.maps.Map(document.getElementById('map'), {
  60. zoom: zoom,
  61. center: mpcenter,
  62. mapId: MAPID,
  63. animation: 'BOUNCE'
  64. });
  65. if(latn!=0 && lngn!=0){
  66. endcoords ={
  67. lat: latn,
  68. lng: lngn
  69. };
  70. drawRoute();
  71. }
  72. else{
  73. searchmarker = new google.maps.Marker({
  74. map: map,
  75. position: coords,
  76. title: '',
  77. });
  78. getAddress(coords,'',0);
  79. }
  80. if(sstate==0){
  81. const box = document.getElementById("search-box");
  82. box.style.display = "none"; //设置样式为不显示(隐藏)
  83. const posl = document.getElementById("pos");
  84. posl.style.display = "none"; //设置样式为不显示(隐藏)
  85. }
  86. else if(sstate==1){
  87. const box = document.getElementById("search-box");
  88. if(lg==1){
  89. box.placeholder='Vui lòng nhập điểm đến...';
  90. }
  91. if(lg==2){
  92. box.placeholder='请输入目的地...';
  93. }
  94. if(lg==3){
  95. box.placeholder='請輸入目的地...';
  96. }
  97. Repositioning();
  98. ListeningInputBox();
  99. }
  100. else if(sstate==2){
  101. const box = document.getElementById("search-box");
  102. box.style.display = "none"; //设置样式为不显示(隐藏)
  103. const posl = document.getElementById("pos");
  104. posl.style.display = "none"; //设置样式为不显示(隐藏)
  105. }
  106. setTimeout(() => {
  107. LoadAnimation(false)
  108. }, 500)
  109. }
  110. /**
  111. * 监听输入框 输入事件
  112. *
  113. * */
  114. function ListeningInputBox() {
  115. // 创建 Autocomplete 实例
  116. const input = document.getElementById("search-box");
  117. const autocomplete = new google.maps.places.Autocomplete(input);
  118. // 设置 Autocomplete 参数
  119. autocomplete.setFields(["geometry", "name"]);
  120. // 添加事件监听器,当用户选择某个地点时,在地图上标记出所选位置
  121. LoadAnimation(true)
  122. autocomplete.addListener("place_changed", function() {
  123. const place = autocomplete.getPlace();
  124. var latlng = JSON.parse(JSON.stringify(place.geometry.location));
  125. var placename = document.getElementById("search-box").value;
  126. getAddress(latlng,placename,1);
  127. if (!place.geometry) {
  128. console.log("返回的地理信息无效!");
  129. return;
  130. }
  131. // 将地图中心点指向用户所选位置,并设置标记
  132. map.setCenter(place.geometry.location);
  133. if (searchmarker) { //去除marker标记点
  134. searchmarker.setMap(null)
  135. searchmarker = ""
  136. }
  137. searchmarker = new google.maps.Marker({
  138. map: map,
  139. position: place.geometry.location,
  140. title: place.name,
  141. });
  142. //以搜索地址为目的地规划路径
  143. // endcoords = place.geometry.location;
  144. // drawRoute();
  145. setTimeout(() => {
  146. LoadAnimation(false)
  147. }, 1000)
  148. });
  149. }
  150. /**
  151. * 根据经度纬度获取相对应的地址信息
  152. * 提取 国家 省/州 市 区/县 路 门牌号
  153. *
  154. * */
  155. function getAddress(latlng,name,mark) {
  156. // 根据经纬度发起 Reverse Geocoding API 请求,获取地址信息
  157. var geocoder = new google.maps.Geocoder();
  158. var cityInfo = {
  159. country: "", //国家
  160. province: "", //省
  161. city: "", //市
  162. district: "", //区
  163. street: "", //街道
  164. door: "", //门牌号
  165. address: "", //详细地址
  166. name:name//地址名称
  167. }
  168. geocoder.geocode({
  169. location: latlng,
  170. }, function(results, status) {
  171. if (status === 'OK') {
  172. if (results[0]) {
  173. console.log(results[0])
  174. for (var i = 0; i < results.length; i++) {
  175. var components = results[i].address_components;
  176. for (var j = 0; j < components.length; j++) {
  177. var component = components[j];
  178. if (component.types.includes("country")) {
  179. console.log("国家: ====>" + component.long_name);
  180. cityInfo.country = component.long_name || '';
  181. } else if (component.types.includes("administrative_area_level_1")) {
  182. console.log("省/州: ====>" + component.long_name);
  183. cityInfo.province = component.long_name || '';
  184. } else if (component.types.includes("locality")) {
  185. console.log("城市: ====> " + component.long_name);
  186. cityInfo.city = component.long_name || '';
  187. } else if (component.types.includes("sublocality_level_1")) {
  188. console.log("区/县: ====>" + component.long_name);
  189. cityInfo.district = component.long_name || '';
  190. } else if (component.types.includes("route")) {
  191. console.log("路/街道名: ====> " + component.long_name);
  192. cityInfo.street = component.long_name || '';
  193. } else if (component.types.includes("street_number")) {
  194. console.log("门牌号: ====> " + component.long_name);
  195. cityInfo.door = component.long_name || '';
  196. }
  197. }
  198. }
  199. cityInfo.address = results[0].formatted_address;
  200. returngeocode(latlng,cityInfo,mark);
  201. // console.log("cityInfo==========", cityInfo)
  202. // addInfo(cityInfo)
  203. } else {
  204. //alert('找不到地址信息');
  205. returngeocode(latlng,cityInfo,mark);
  206. }
  207. } else {
  208. //alert('获取地址信息失败:' + status);
  209. returngeocode(latlng,cityInfo,mark);
  210. }
  211. });
  212. }
  213. function returngeocode(location,cityInfo,type){
  214. uni.postMessage({
  215. data: {
  216. position:location,
  217. cityInfo:cityInfo,
  218. type:type
  219. }
  220. });
  221. }
  222. function addInfo(cityInfo) {
  223. // 获取子节点并设置新的文本内容
  224. const child1 = document.getElementById('country');
  225. child1.textContent = cityInfo.country;
  226. const child2 = document.getElementById('province');
  227. child2.textContent = cityInfo.province;
  228. const child3 = document.getElementById('city');
  229. child3.textContent = cityInfo.city;
  230. const child4 = document.getElementById('district');
  231. child4.textContent = cityInfo.district;
  232. const child5 = document.getElementById('street');
  233. child5.textContent = cityInfo.street;
  234. const child6 = document.getElementById('door');
  235. child6.textContent = cityInfo.door;
  236. const child7 = document.getElementById('address');
  237. child7.textContent = cityInfo.address;
  238. }
  239. /**
  240. * 画路线图
  241. * 经度纬度加了随机函数 故 起始点和终点 各不一致
  242. * 需要用到此功能自行调整
  243. *
  244. * */
  245. function drawRoute() {
  246. LoadAnimation(true)
  247. clearDrawRoute()
  248. const directionsService = new google.maps.DirectionsService();
  249. var TravelMode = [{
  250. id: 1,
  251. name: "DRIVING",
  252. color: "#ea4335"
  253. },
  254. {
  255. id: 2,
  256. name: "WALKING",
  257. color: "#7825fa"
  258. },
  259. {
  260. id: 3,
  261. name: "BICYCLING",
  262. color: "#fa6200"
  263. },
  264. {
  265. id: 4,
  266. name: "TRANSIT",
  267. color: "#ff00ff"
  268. }
  269. ];
  270. startDrawRoute(directionsService, TravelMode[0]);
  271. }
  272. /**
  273. * 清除路线
  274. *
  275. * */
  276. function clearDrawRoute() {
  277. if (directionsRendererArr) { //清空线
  278. for (var i = 0; i < directionsRendererArr.length; i++) {
  279. directionsRendererArr[i].setMap(null);
  280. }
  281. // 清空数组
  282. directionsRendererArr = [];
  283. }
  284. if (drawRouteMarker) { //清空标记点
  285. for (var i = 0; i < drawRouteMarker.length; i++) {
  286. drawRouteMarker[i].setMap(null);
  287. }
  288. // 清空数组
  289. drawRouteMarker = [];
  290. }
  291. }
  292. /**
  293. *
  294. * 开始绘制以下路线图
  295. * DRIVING:驾车模式。这是默认的出行方式,计算出行路线时考虑当时的实时交通情况。
  296. *可用 WALKING:步行模式。计算步行路线时会考虑人行道、人行横道等规则,因此得到的路线可能与驾车路线不同。
  297. *可用 BICYCLING:骑行模式。计算骑行路线时,避开了折返点和拥堵路段,提供了适合骑自行车的路线。
  298. * TRANSIT:公共交通模式。在城市间导航中被广泛使用,提供了乘坐公共交通工具(如公交车、地铁、火车和轻轨)的路线方案。
  299. * FLIGHTS:飞行模式。在 Google Maps 平台上无法使用,此模式只适用于各大航空公司网站等其他服务商范畴内。
  300. *
  301. * */
  302. function startDrawRoute(directionsService, travelMode) {
  303. // 随机数字而已 动态数字 方便查询效果
  304. // let min = 5000;
  305. // let max = 10000;
  306. // let randomNum = (Math.floor(Math.random() * (max - min + 1)) + min) / 500000;
  307. // 起点坐标
  308. /**
  309. * lat 和lng数据为随机数据 运行时 调整为自己所在位置坐标
  310. *
  311. * */
  312. const origin = {
  313. lat: coords.lat,
  314. lng: coords.lng
  315. };
  316. // 终点坐标
  317. const destination = {
  318. lat: endcoords.lat,
  319. lng: endcoords.lng
  320. };
  321. var directionsRenderer = new google.maps.DirectionsRenderer({
  322. map: map,
  323. suppressMarkers: true, // 关闭默认图标
  324. polylineOptions: {
  325. strokeColor: travelMode.color, //设置路线颜色
  326. strokeWeight: 5 //设置路线宽度
  327. },
  328. // draggable: true //允许用户拖动路线
  329. });
  330. const request = {
  331. origin: origin,
  332. destination: endcoords,
  333. travelMode: travelMode.name, //绘制路线的模式
  334. };
  335. directionsService.route(request,
  336. (result, status) => {
  337. if (status === "OK") {
  338. directionsRenderer.setDirections(result);
  339. directionsRenderer.setMap(map);
  340. // 获取起点和终点的信息并添加标记
  341. var startMarker = new google.maps.Marker({
  342. position: result.routes[0].legs[0].start_location,
  343. map: map,
  344. icon: {
  345. url: "https://maps.gstatic.com/mapfiles/ms2/micons/pink.png",
  346. scaledSize: new google.maps.Size(50, 50),
  347. },
  348. });
  349. drawRouteMarker.push(startMarker)
  350. var endMarker = new google.maps.Marker({
  351. position: result.routes[0].legs[0].end_location,
  352. map: map,
  353. icon: {
  354. url: "https://maps.gstatic.com/mapfiles/ms2/micons/orange.png",
  355. scaledSize: new google.maps.Size(50, 50),
  356. },
  357. });
  358. drawRouteMarker.push(endMarker)
  359. directionsRendererArr.push(directionsRenderer)
  360. //显示路线的总距离
  361. // console.log('距离===', directionsRenderer.directions.routes[0].legs[0].distance.text)
  362. // console.log('时间===', directionsRenderer.directions.routes[0].legs[0].duration.text)
  363. // for (var k = 0; k < directionsRenderer.directions.routes[0].legs[0].steps.length; k++) {
  364. // console.log(directionsRenderer.directions.routes[0].legs[0].steps[k].instructions)
  365. // }
  366. if (searchmarker) { //去除marker标记点
  367. searchmarker.setMap(null)
  368. searchmarker = ""
  369. }
  370. uni.postMessage({
  371. data: {
  372. distance:directionsRenderer.directions.routes[0].legs[0].distance.text,
  373. duration:directionsRenderer.directions.routes[0].legs[0].duration.text,
  374. type:2
  375. }
  376. });
  377. } else {
  378. // console.log(travelMode, "绘制失败===", result)
  379. uni.postMessage({
  380. data: {
  381. drawRoute:result
  382. }
  383. });
  384. }
  385. }
  386. );
  387. LoadAnimation(false)
  388. }
  389. /**
  390. * 重新定位
  391. *
  392. *
  393. * */
  394. function Repositioning() {
  395. LoadAnimation(true)
  396. var element = document.getElementById('pos');
  397. element.addEventListener("click", function() {
  398. if (navigator.geolocation) {
  399. navigator.geolocation.getCurrentPosition(function(position) {
  400. // lats = position.coords.latitude;
  401. // lngs = position.coords.longitude;
  402. var pos = {
  403. lat: position.coords.latitude,
  404. lng: position.coords.longitude
  405. };
  406. LoadAnimation(false)
  407. map.setCenter(pos); // 将地图中心置于当前位置
  408. // 将地图中心点指向用户所选位置,并设置标记
  409. if (searchmarker) { //去除marker标记点
  410. searchmarker.setMap(null)
  411. searchmarker = ""
  412. }
  413. searchmarker = new google.maps.Marker({
  414. map: map,
  415. position: pos,
  416. title:'location',
  417. });
  418. getAddress(pos,'',0);
  419. }, function() {
  420. console.log("无法获取地理位置信息");
  421. });
  422. } else {
  423. console.log("浏览器不支持Geolocation API");
  424. }
  425. });
  426. }
  427. LoadAnimation(true)
  428. window.initMap = initMap;
  429. });