mapindex.js 13 KB

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