map.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title></title>
  5. <meta charset="utf-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
  7. <meta name="apple-mobile-web-app-capable" content="yes">
  8. <meta name="apple-mobile-web-app-status-bar-style" content="black">
  9. <script src="../js/imageConversion.js"></script>
  10. <script src="../js/mui.js"></script>
  11. <script src="../js/util.js"></script>
  12. <link rel="stylesheet" href="../js/leaflet1.3.1/leaflet.css">
  13. <link rel="stylesheet" href="../js/leaflet1.3.1/leaflet.label.css">
  14. <link rel="stylesheet" href="../js/leaflet1.3.1/leaflet.measure.css">
  15. <!-- 自定义工具类 -->
  16. <script>
  17. var systemConfig = {
  18. assetsUrl: "http://localhost:8848",
  19. mapViewer: {
  20. center: [31.105589678244445, 121.72894516017521],
  21. zoom: 11
  22. },
  23. token: '65463DEE-620A-0ED5-2385-17ECD07CD351', //公共地图资源token
  24. mapService: 'http://121.43.55.7:10011/proxy/', //地图服务
  25. }
  26. //地图全局变量声明
  27. var map2DViewer = {
  28. markers: {},
  29. polygons: {},
  30. polylines: {},
  31. circles: {},
  32. map: null,
  33. layers: {},
  34. groups: {}
  35. }
  36. </script>
  37. <script src="../js/leaflet1.3.1/leaflet.js"></script>
  38. <script type="module" src="../js/leaflet1.3.1/leaflet-side-by-side.js"></script>
  39. <script src="../js/esri-leaflet-v3.0.4/esri-leaflet-debug.js"></script>
  40. <script type="module" src="../js/leaflet1.3.1/leaflet.measure.js"></script>
  41. <script type="module" src="../js/leaflet1.3.1/leaflet.label.js"></script>
  42. <!--标准mui.css-->
  43. <link rel="stylesheet" href="../css/mui.min.css">
  44. <link rel="stylesheet" href="../css/home.css">
  45. <style type="text/css">
  46. html,
  47. body,
  48. #map {
  49. position: relative;
  50. height: 100%;
  51. }
  52. .leaflet-touch .leaflet-control-layers-toggle {
  53. width: 22px !important;
  54. height: 22px !important;
  55. background-size: 20px 20px !important;
  56. }
  57. </style>
  58. </head>
  59. <body>
  60. <header class="mui-bar mui-bar-nav" style="z-index: 999;">
  61. <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
  62. <h1 class="mui-title" id="mapTitle"></h1>
  63. </header>
  64. <div id="map">
  65. <!-- 文件上传 -->
  66. <input id="uploadFileInput" type="file" style="z-index: -1;" value=""
  67. accept="image/png, image/jpeg, image/jpg" />
  68. <!-- 当前任务名称 -->
  69. <span id="taskName"></span>
  70. <!-- 地图底部弹窗 -->
  71. <div id="mapBottomBox">
  72. </div>
  73. <!-- 我的任务列表模式 -->
  74. <div class="changeType toBackPage">
  75. <span class="mui-icon mui-icon-list"></span>
  76. </div>
  77. <!-- 自定义标记添加事件 -->
  78. <div class="changeType" id="addMyMarker">
  79. <span class="mui-icon mui-icon-upload"></span>
  80. </div>
  81. <!-- 切换底图按钮 -->
  82. <div class="changeType2 changeMap">
  83. <span class="mui-icon mui-icon-map"></span>
  84. </div>
  85. </div>
  86. </body>
  87. <script type="text/javascript">
  88. // mui.plusReady(function() {
  89. // if (plus) {
  90. function newPostRequest2(setting, funSuccess, funError) {
  91. var xhr = new XMLHttpRequest();
  92. // 请求成功回调函数
  93. xhr.onload = e => {
  94. console.log('request success');
  95. };
  96. // 请求结束
  97. xhr.onloadend = e => {
  98. console.log('request loadend');
  99. };
  100. // 请求出错
  101. xhr.onerror = e => {
  102. console.log('request error');
  103. funError("request error");
  104. };
  105. // 请求超时
  106. xhr.ontimeout = e => {
  107. console.log('request timeout');
  108. funError("request timeout");
  109. };
  110. xhr.open('POST', "http://117.131.26.69:10081/proxy_dms/content/selectContentList", true);
  111. if (localStorage.getItem("token")) {
  112. xhr.setRequestHeader("token", localStorage.getItem("token"))
  113. }
  114. xhr.onreadystatechange = function() {
  115. if (xhr.readyState == 4 && xhr.status == 200) {
  116. funSuccess(JSON.parse(xhr.responseText));
  117. }
  118. }
  119. xhr.send(setting.data);
  120. }
  121. // 动态获取图片(点击疑点或标记marker时)
  122. function getFileListUrl2(fileList) {
  123. return new Promise((resolve, reject) => {
  124. if (fileList) {
  125. let fileUrlList = [];
  126. let index = 0;
  127. for (let fileName in fileList) {
  128. index++;
  129. }
  130. for (let fileName in fileList) {
  131. let paramData2 = new FormData();
  132. paramData2.append("columnId", 1793);
  133. paramData2.append("states", "0,1,2");
  134. paramData2.append("pageSize", 10);
  135. paramData2.append("page", 0);
  136. let searchParam = [];
  137. let paramItem = {
  138. field: "title",
  139. searchType: "1",
  140. content: {
  141. value: fileList[fileName]
  142. }
  143. };
  144. searchParam.push(paramItem);
  145. if (searchParam.length > 0) {
  146. paramData2.append("search", JSON.stringify(searchParam));
  147. }
  148. newPostRequest2({
  149. data: paramData2
  150. }, function funSuccess(res, textStatus, xhr) {
  151. let resJson2 = res;
  152. if (resJson2.code == 200) {
  153. let fileBase = resJson2.content
  154. .data[0].c_file_base64;
  155. fileUrlList.push(fileBase);
  156. if (fileUrlList.length == index) {
  157. resolve(fileUrlList);
  158. }
  159. }
  160. }, function funerror(res, textStatus, xhr) {});
  161. }
  162. } else {
  163. resolve();
  164. }
  165. });
  166. }
  167. let markers = [];
  168. let geometrys = [];
  169. // 地图默认中心位置
  170. //定义一些常量
  171. let center_ = [31.17361258762417, 121.51803731918336];
  172. const skew = [0.00011, 0.19195];
  173. // const skew = [-0.002,0.198];
  174. function getOneLatLng(data, returnFunc) {
  175. if (typeof data[0] == "object") {
  176. getOneLatLng(data[0], returnFunc);
  177. } else {
  178. if (data[0] < data[1]) {
  179. returnFunc([data[0] + skew[0], data[1] + skew[1]]);
  180. return;
  181. } else {
  182. returnFunc([data[1] + skew[0], data[0] + skew[1]]);
  183. }
  184. }
  185. }
  186. let gotoOrtherPageState = false;
  187. // 得到定位数据
  188. if (localStorage.getItem("geometrys") && localStorage.getItem("mapTitle") !== "自定义标记") {
  189. let geometrysItem = JSON.parse(localStorage.getItem("geometrys"));
  190. let index = 1;
  191. if (geometrysItem != null) {
  192. if (geometrysItem[0]) {
  193. getOneLatLng(geometrysItem[0].coord ? geometrysItem[0].coord : geometrysItem[0].geometry
  194. .coordinates,
  195. function(res) {
  196. center_ = res;
  197. });
  198. }
  199. geometrysItem.forEach(item => {
  200. //创建多个icon
  201. var greenIcon = L.icon({
  202. iconUrl: '../js/leaflet1.3.1/images/marker-icon-2x-sc.png',
  203. iconSize: [25, 41],
  204. iconAnchor: [12, 41],
  205. popupAnchor: [1, -34],
  206. tooltipAnchor: [16, -28],
  207. shadowSize: [41, 41]
  208. }),
  209. redIcon = L.icon({
  210. iconUrl: '../js/leaflet1.3.1/images/marker-icon-2x-er.png',
  211. iconSize: [25, 41],
  212. iconAnchor: [12, 41],
  213. popupAnchor: [1, -34],
  214. tooltipAnchor: [16, -28],
  215. shadowSize: [41, 41]
  216. }),
  217. orangeIcon = L.icon({
  218. iconUrl: '../js/leaflet1.3.1/images/marker-icon-2x-wr.png',
  219. iconSize: [25, 41],
  220. iconAnchor: [12, 41],
  221. popupAnchor: [1, -34],
  222. tooltipAnchor: [16, -28],
  223. shadowSize: [41, 41]
  224. }),
  225. greenIconActive = L.icon({
  226. iconUrl: '../js/leaflet1.3.1/images/marker-icon-2x-sc.png',
  227. iconSize: [25, 41],
  228. iconAnchor: [12, 41],
  229. popupAnchor: [1, -34],
  230. tooltipAnchor: [16, -28],
  231. shadowSize: [41, 41],
  232. className: "my-div-icon"
  233. }),
  234. redIconActive = L.icon({
  235. iconUrl: '../js/leaflet1.3.1/images/marker-icon-2x-er.png',
  236. iconSize: [25, 41],
  237. iconAnchor: [12, 41],
  238. popupAnchor: [1, -34],
  239. tooltipAnchor: [16, -28],
  240. shadowSize: [41, 41],
  241. className: "my-div-icon"
  242. }),
  243. orangeIconActive = L.icon({
  244. iconUrl: '../js/leaflet1.3.1/images/marker-icon-2x-wr.png',
  245. iconSize: [25, 41],
  246. iconAnchor: [12, 41],
  247. popupAnchor: [1, -34],
  248. tooltipAnchor: [16, -28],
  249. shadowSize: [41, 41],
  250. className: "my-div-icon"
  251. });
  252. index++;
  253. // 先将点添加到markers对象中
  254. let centerItem = [];
  255. if (localStorage.getItem("markerId") && item.id == localStorage.getItem(
  256. "markerId")) {
  257. gotoOrtherPageState = true;
  258. getOneLatLng(item.coord ? item.coord : item.geometry.coordinates, function(
  259. res) {
  260. center_ = res;
  261. if (center_[0] && center_[1]) {
  262. markers.push(L.marker(center_, {
  263. icon: localStorage.getItem("mapTitle") ==
  264. "我的标记" || (item
  265. .properties && item.properties.state
  266. ) ?
  267. greenIconActive : orangeIconActive,
  268. data: item
  269. }));
  270. }
  271. });
  272. } else {
  273. getOneLatLng(item.coord ? item.coord : item.geometry.coordinates, function(
  274. res) {
  275. centerItem = res;
  276. if (centerItem[0] && centerItem[1]) {
  277. markers.push(L.marker(centerItem, {
  278. icon: localStorage.getItem("mapTitle") ==
  279. "我的标记" || (item
  280. .properties && item.properties.state
  281. ) ? greenIcon : orangeIcon,
  282. data: item
  283. }));
  284. }
  285. });
  286. }
  287. })
  288. }
  289. };
  290. // 如果得到当前手机定位
  291. if (gotoOrtherPageState == false && localStorage.getItem("user_latitude") && localStorage.getItem(
  292. "user_longitude")) {
  293. center_ = [parseFloat(localStorage.getItem("user_latitude")), parseFloat(localStorage.getItem(
  294. "user_longitude"))];
  295. }
  296. // 地图初始化
  297. var map = L.map("map", {
  298. center: center_,
  299. zoom: 12,
  300. minZoom: 9,
  301. maxZoom: 18,
  302. zoomControl: true,
  303. attributionControl: false,
  304. doubleClickZoom: false,
  305. maxBounds: [
  306. [31.95, 120.86],
  307. [30.7, 122.12]
  308. ]
  309. })
  310. // 初始化地图底图
  311. // var layer = L.esri
  312. // .tiledMapLayer({
  313. // // url: "http://121.43.55.7:10011/proxy/?servertype=Street_Purplish_Blue&token=65463DEE-620A-0ED5-2385-17ECD07CD351"
  314. // url: "http://t0.tianditu.gov.cn/vec_c/wmts?tk=7e55f62d7d46488299e8caa8d6f0dcf4"
  315. // })
  316. // .addTo(map);
  317. var initMapLayer = "layer";
  318. var layer = L.tileLayer(
  319. "http://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}", {
  320. attribution: '&copy; 高德地图',
  321. maxZoom: 19,
  322. minZoom: 3,
  323. subdomains: "1234",
  324. zoom: 3
  325. });
  326. var other = L.tileLayer(
  327. "http://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}", {
  328. attribution: '&copy; 高德地图',
  329. maxZoom: 19,
  330. minZoom: 3,
  331. subdomains: "123",
  332. zoom: 3
  333. });
  334. layer.addTo(map);
  335. function changeMap() {
  336. if (initMapLayer == "layer") {
  337. initMapLayer = "other";
  338. map.removeControl(layer);
  339. other.addTo(map);
  340. console.log("切换为other")
  341. } else {
  342. initMapLayer = "layer";
  343. map.removeControl(other);
  344. layer.addTo(map);
  345. console.log("切换为layer")
  346. }
  347. }
  348. if (localStorage.getItem("user_latitude") != null && localStorage.getItem("user_longitude") != null) {
  349. let myIcon = L.icon({
  350. iconUrl: '../js/leaflet1.3.1/images/myMarker00000000.png',
  351. iconSize: [10, 10],
  352. iconAnchor: [12, 0],
  353. popupAnchor: [1, -34],
  354. tooltipAnchor: [16, -28],
  355. shadowSize: [41, 41],
  356. className: "my-div-icon2"
  357. })
  358. let localAddr = [parseFloat(localStorage.getItem("user_latitude")), parseFloat(localStorage
  359. .getItem(
  360. "user_longitude"))];
  361. L.marker(localAddr, {
  362. icon: myIcon
  363. }).addTo(map);
  364. }
  365. // 批量将markers中的点添加到地图中,并添加监听事件打开底部弹窗。
  366. markers.forEach(item => {
  367. item.on('click', function(item) {
  368. // 请求疑点数据和图片
  369. let markerData = item.target.options.data;
  370. let state = markerData.properties && markerData.properties.state ? markerData
  371. .properties
  372. .state : 0;
  373. let desc = markerData.properties && markerData.properties.desc ? markerData
  374. .properties.desc :
  375. '';
  376. localStorage.setItem("markerDataPropertiesFileList", JSON.stringify(markerData
  377. .properties &&
  378. markerData.properties.fileList ? markerData.properties.fileList : {}));
  379. // 我的标记和标记疑点
  380. if (markerData.properties && markerData.properties.title) {
  381. let mapBottomBoxInnerHtml = `<div></div><span class="title">${markerData.properties && markerData.properties.title ? markerData.properties.title : '自定义标记' }</span>
  382. <div class="arrowdown" data-state="1"><span class="mui-icon mui-icon-arrowdown"></span></div>
  383. <p>位置:${markerData.properties.localAddr ? markerData.properties.localAddr : '未知'}</p>
  384. <div id="mapImageList">`;
  385. if (markerData.properties && markerData.properties.fileList) {
  386. getFileListUrl2(markerData.properties.fileList).then(res => {
  387. if (res) {
  388. for (let fileBase in res) {
  389. mapBottomBoxInnerHtml +=
  390. `<div><img src="${res[fileBase]}"/></div>`;
  391. }
  392. }
  393. mapBottomBoxInnerHtml += `
  394. </div>
  395. <input id="myMarkerId" value="${markerData.id}" />
  396. <div>
  397. <p>描述:</p>
  398. <span>${desc}</span>
  399. </div>`;
  400. document.getElementById('mapBottomBox').innerHTML =
  401. mapBottomBoxInnerHtml;
  402. document.getElementById('mapBottomBox').style.bottom =
  403. "0";
  404. })
  405. } else {
  406. mapBottomBoxInnerHtml += `
  407. </div>
  408. <input id="myMarkerId" value="${markerData.id}" />
  409. <div>
  410. <p>描述:</p>
  411. <span>${desc}</span>
  412. </div>`;
  413. document.getElementById('mapBottomBox').innerHTML =
  414. mapBottomBoxInnerHtml;
  415. document.getElementById('mapBottomBox').style.bottom = "0";
  416. }
  417. } else {
  418. // 我的任务疑点
  419. let statusMap = {
  420. 0: {
  421. class: "mapWarning",
  422. title: "未核实"
  423. },
  424. 1: {
  425. class: "mapSuccessTag",
  426. title: "已核实"
  427. }
  428. }
  429. let markerDataPropertiesStr = JSON.stringify(markerData.properties);
  430. let mapBottomBoxInnerHtml = `<div class="${state ? statusMap[state].class : 'mapWarning'}">${state ? statusMap[state].title : '未核实'}</div>
  431. <span class="title">${markerData.dataTitle}</span>
  432. <p class="relevantLawsAndRegulations knowledgeRetrieval" data-search-str="${markerData.dataTitle}">相关法律法规</p>
  433. <p class="detailedInformation" data-marker-data='${markerDataPropertiesStr}'>详细信息</p>
  434. <div class="arrowdown" data-state="${state}"><span class="mui-icon mui-icon-arrowdown"></span></div>
  435. <p>疑点图斑:</p>
  436. <div><img class="patternSpot" src="http://47.103.92.60:2102/apps/patternSpot.png"/></div>
  437. <p>位置:${markerData.properties && markerData.properties['镇域名称'] ? markerData.properties['镇域名称'] : '未知'}</p>
  438. <div id="mapImageList">
  439. `;
  440. if (markerData.properties && markerData.properties.fileList) {
  441. getFileListUrl2(markerData.properties.fileList).then(res => {
  442. if (res) {
  443. for (let fileBase in res) {
  444. mapBottomBoxInnerHtml +=
  445. `<div><img src="${res[fileBase]}"/></div>`;
  446. }
  447. }
  448. mapBottomBoxInnerHtml += `
  449. ${state == 0 ? `<div id="uploadImage">
  450. <div><span class="mui-icon mui-icon-plus"></span></div>
  451. <div><span>上传照片</span></div>
  452. </div>` : ``}
  453. </div>
  454. <input id="myMarkerId" value="${markerData.id}" />
  455. <div>
  456. <p>描述:</p>
  457. ${state == 1 ? `<span>${desc}</span>` : `<textarea name="" id="mapTextArea" placeholder="请添加描述" cols="30" rows="3" >${desc}</textarea>`}
  458. </div>
  459. ${state == 0 ? `
  460. <div class="displayFlex3">
  461. <div class="paperplaneMyMarker2 openMyPhoneMap" data-lat="${item.latlng.lat}" data-lng="${item.latlng.lng}">导航到这</div>
  462. <div class="paperplane"><span class="mui-icon mui-icon-paperplane"></span>提交</div>
  463. </div>
  464. ` : ``}`;
  465. document.getElementById('mapBottomBox').innerHTML =
  466. mapBottomBoxInnerHtml;
  467. document.getElementById('mapBottomBox').style.bottom =
  468. "0";
  469. })
  470. } else {
  471. mapBottomBoxInnerHtml += `
  472. ${state == 0 ? `<div id="uploadImage">
  473. <div><span class="mui-icon mui-icon-plus"></span></div>
  474. <div><span>上传照片</span></div>
  475. </div>` : ``}
  476. </div>
  477. <input id="myMarkerId" value="${markerData.id}" />
  478. <div>
  479. <p>描述:</p>
  480. ${state == 1 ? `<span>${desc}</span>` : `<textarea name="" id="mapTextArea" placeholder="请添加描述" cols="30" rows="3" >${desc}</textarea>`}
  481. </div>
  482. ${state == 0 ? `
  483. <div class="displayFlex3">
  484. <div class="paperplaneMyMarker2 openMyPhoneMap" data-lat="${item.latlng.lat}" data-lng="${item.latlng.lng}">导航到这</div>
  485. <div class="paperplane"><span class="mui-icon mui-icon-paperplane"></span>提交</div>
  486. </div>
  487. ` : ``}`;
  488. document.getElementById('mapBottomBox').innerHTML =
  489. mapBottomBoxInnerHtml;
  490. document.getElementById('mapBottomBox').style.bottom = "0";
  491. }
  492. }
  493. })
  494. if (item.options.data.name || item.options.data.properties.title || item.options.data
  495. .properties.desc) {
  496. item.addTo(map)
  497. .bindPopup(item.options.data.name || item.options.data.properties.title || item
  498. .options.data
  499. .properties.desc, {
  500. autoClose: false,
  501. closeOnClick: ""
  502. })
  503. .openPopup();
  504. } else {
  505. item.addTo(map);
  506. }
  507. });
  508. if (center_) {
  509. map.panTo(center_);
  510. }
  511. // 自定义标记页面事件
  512. if (localStorage.getItem("mapTitle") === "自定义标记") {
  513. localStorage.setItem('showMyMarkerBottomBox', 'false');
  514. document.getElementById('addMyMarker').style.display = "flex";
  515. let markerItem = "";
  516. // 地图的点击事件
  517. map.on('click', function(e) {
  518. if (!localStorage.getItem("showMyMarkerBottomBox") || localStorage.getItem(
  519. "showMyMarkerBottomBox") ==
  520. "false") {
  521. document.getElementById('taskName').innerHTML =
  522. `<p>lat:${e.latlng.lat}</p><p>lng:${e.latlng.lng}</p>`;
  523. document.getElementById('taskName').style.display = "block";
  524. localStorage.setItem("latlngLat", e.latlng.lat - skew[0]);
  525. localStorage.setItem("latlngLng", e.latlng.lng - skew[1]);
  526. if (markerItem) {
  527. markerItem.setLatLng([e.latlng.lat, e.latlng.lng]);
  528. } else {
  529. markerItem = L.marker([e.latlng.lat, e.latlng.lng]);
  530. markerItem.addTo(map);
  531. }
  532. }
  533. })
  534. }
  535. let myDivIconDoms = document.getElementsByClassName("my-div-icon");
  536. if (myDivIconDoms[0]) {
  537. myDivIconDoms[0].click();
  538. }
  539. // puls加载完成
  540. // }
  541. // })
  542. </script>
  543. </html>