538 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			HTML
		
	
	
		
		
			
		
	
	
			538 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			HTML
		
	
	
|  | 
 | |||
|  | <!DOCTYPE html> | |||
|  | <html> | |||
|  | 
 | |||
|  | <head> | |||
|  |   <meta charset="utf-8"/> | |||
|  |   <meta http-equiv="pragma" content="no-cache"> | |||
|  |   <meta http-equiv="cache-control" content="no-cache"> | |||
|  |   <meta http-equiv="expires" content="0"> | |||
|  |   <title>hello-jsmap</title> | |||
|  |   <script src="http://192.168.192.201:7024/joysuch/jsmap/jsmap.js" type="text/javascript"></script> | |||
|  |   <link type="text/css" href="http://192.168.192.201:7024/joysuch/jsmap/jsmap.css" rel="stylesheet"/> | |||
|  | <!--  <script src="http://mapdemo.joysuch.com/lib/jsmap/jsmap.js" type="text/javascript"></script>--> | |||
|  | <!--  <link type="text/css" href="http://mapdemo.joysuch.com/lib/jsmap/jsmap.css" rel="stylesheet"/>--> | |||
|  |   <link rel="stylesheet" href="http://192.168.192.201:7024/joysuch/LocalAssets/css/animation/pop.css"> | |||
|  |   <link rel="stylesheet" href="http://192.168.192.201:7024/joysuch/LocalAssets/css/animation/loading.css"> | |||
|  |   <link rel="stylesheet" href="http://192.168.192.201:7024/joysuch/LocalAssets/css/dom.css"> | |||
|  |   <style> | |||
|  |     .jsmap-animation-point, | |||
|  |     .jsmap-animation-point:after, | |||
|  |     .jsmap-animation-point:before, | |||
|  |     .jsmap-animation-point p, | |||
|  |     .jsmap-animation-point p:after, | |||
|  |     .jsmap-animation-point p:before { | |||
|  |       margin: 0; | |||
|  |       padding: 0; | |||
|  |       -webkit-box-sizing: border-box; | |||
|  |       -moz-box-sizing: border-box; | |||
|  |       -o-box-sizing: border-box; | |||
|  |       -ms-box-sizing: border-box; | |||
|  |       box-sizing: border-box; | |||
|  |     } | |||
|  | 
 | |||
|  |     .jsmap-animation-point { | |||
|  |       width: 10px; | |||
|  |       height: 10px; | |||
|  |       border-radius: 50%; | |||
|  |       border: 1px solid hsla(0, 0%, 100%, 0.5); | |||
|  |       cursor: pointer; | |||
|  |       color: #0ff; | |||
|  |       background: currentColor; | |||
|  |       z-index: 3; | |||
|  |       left: 50%; | |||
|  |       top: 50%; | |||
|  |       -webkit-transform: translate(-50%, -50%); | |||
|  |       -moz-transform: translate(-50%, -50%); | |||
|  |       -o-transform: translate(-50%, -50%); | |||
|  |       -ms-transform: translate(-50%, -50%); | |||
|  |       transform: translate(-50%, -50%); | |||
|  |       box-shadow: 0 0 2em currentColor, 0 0 0.5em currentColor; | |||
|  |       position: absolute; | |||
|  |     } | |||
|  | 
 | |||
|  |     .jsmap-animation-point:after, | |||
|  |     .jsmap-animation-point:before, | |||
|  |     .jsmap-animation-point p:after, | |||
|  |     .jsmap-animation-point p:before { | |||
|  |       content: ""; | |||
|  |       position: absolute; | |||
|  |       width: 100%; | |||
|  |       height: 100%; | |||
|  |       left: 50%; | |||
|  |       top: 50%; | |||
|  |       border-radius: 50%; | |||
|  |       -webkit-transform: translate(-50%, -50%); | |||
|  |       -moz-transform: translate(-50%, -50%); | |||
|  |       -o-transform: translate(-50%, -50%); | |||
|  |       -ms-transform: translate(-50%, -50%); | |||
|  |       transform: translate(-50%, -50%); | |||
|  |     } | |||
|  | 
 | |||
|  |     .jsmap-animation-point:after, | |||
|  |     .jsmap-animation-point:before { | |||
|  |       border: 1px solid; | |||
|  |       -webkit-animation: jsmap-mapAni 1s ease infinite; | |||
|  |       -moz-animation: jsmap-mapAni 1s ease infinite; | |||
|  |       -o-animation: jsmap-mapAni 1s ease infinite; | |||
|  |       -ms-animation: jsmap-mapAni 1s ease infinite; | |||
|  |       animation: jsmap-mapAni 1s ease infinite; | |||
|  |     } | |||
|  | 
 | |||
|  |     .jsmap-animation-point p:before { | |||
|  |       border: 1px solid; | |||
|  |     } | |||
|  | 
 | |||
|  |     .jsmap-animation-point p { | |||
|  |       position: absolute; | |||
|  |       left: 50%; | |||
|  |       top: 50%; | |||
|  |       width: 0; | |||
|  |       height: 0; | |||
|  |       border-radius: 50%; | |||
|  |       -webkit-transform: translate(-50%, -50%); | |||
|  |       -moz-transform: translate(-50%, -50%); | |||
|  |       -o-transform: translate(-50%, -50%); | |||
|  |       -ms-transform: translate(-50%, -50%); | |||
|  |       transform: translate(-50%, -50%); | |||
|  |       -webkit-animation: jsmap-mapAni 2s ease infinite; | |||
|  |       -moz-animation: jsmap-mapAni 2s ease infinite; | |||
|  |       -o-animation: jsmap-mapAni 2s ease infinite; | |||
|  |       -ms-animation: jsmap-mapAni 2s ease infinite; | |||
|  |       animation: jsmap-mapAni 2s ease infinite; | |||
|  |     } | |||
|  | 
 | |||
|  |     @-webkit-keyframes jsmap-mapAni { | |||
|  |       0% { | |||
|  |         width: 0; | |||
|  |         height: 0; | |||
|  |         opacity: 1; | |||
|  |         filter: alpha(opacity=1); | |||
|  |       } | |||
|  | 
 | |||
|  |       25% { | |||
|  |         width: 12px; | |||
|  |         height: 12px; | |||
|  |         opacity: 0.7; | |||
|  |         filter: alpha(opacity=70); | |||
|  |       } | |||
|  | 
 | |||
|  |       50% { | |||
|  |         width: 20px; | |||
|  |         height: 20px; | |||
|  |         opacity: 0.5; | |||
|  |         filter: alpha(opacity=50); | |||
|  |       } | |||
|  | 
 | |||
|  |       75% { | |||
|  |         width: 30px; | |||
|  |         height: 30px; | |||
|  |         opacity: 0.2; | |||
|  |         filter: alpha(opacity=20); | |||
|  |       } | |||
|  | 
 | |||
|  |       to { | |||
|  |         width: 40px; | |||
|  |         height: 40px; | |||
|  |         opacity: 0; | |||
|  |         filter: alpha(opacity=0); | |||
|  |       } | |||
|  |     } | |||
|  | 
 | |||
|  |     @-moz-keyframes jsmap-mapAni { | |||
|  |       0% { | |||
|  |         width: 0; | |||
|  |         height: 0; | |||
|  |         opacity: 1; | |||
|  |         filter: alpha(opacity=1); | |||
|  |       } | |||
|  | 
 | |||
|  |       25% { | |||
|  |         width: 12px; | |||
|  |         height: 12px; | |||
|  |         opacity: 0.7; | |||
|  |         filter: alpha(opacity=70); | |||
|  |       } | |||
|  | 
 | |||
|  |       50% { | |||
|  |         width: 20px; | |||
|  |         height: 20px; | |||
|  |         opacity: 0.5; | |||
|  |         filter: alpha(opacity=50); | |||
|  |       } | |||
|  | 
 | |||
|  |       75% { | |||
|  |         width: 30px; | |||
|  |         height: 30px; | |||
|  |         opacity: 0.2; | |||
|  |         filter: alpha(opacity=20); | |||
|  |       } | |||
|  | 
 | |||
|  |       to { | |||
|  |         width: 40px; | |||
|  |         height: 40px; | |||
|  |         opacity: 0; | |||
|  |         filter: alpha(opacity=0); | |||
|  |       } | |||
|  |     } | |||
|  | 
 | |||
|  |     @-o-keyframes jsmap-mapAni { | |||
|  |       0% { | |||
|  |         width: 0; | |||
|  |         height: 0; | |||
|  |         opacity: 1; | |||
|  |         filter: alpha(opacity=1); | |||
|  |       } | |||
|  | 
 | |||
|  |       25% { | |||
|  |         width: 12px; | |||
|  |         height: 12px; | |||
|  |         opacity: 0.7; | |||
|  |         filter: alpha(opacity=70); | |||
|  |       } | |||
|  | 
 | |||
|  |       50% { | |||
|  |         width: 20px; | |||
|  |         height: 20px; | |||
|  |         opacity: 0.5; | |||
|  |         filter: alpha(opacity=50); | |||
|  |       } | |||
|  | 
 | |||
|  |       75% { | |||
|  |         width: 30px; | |||
|  |         height: 30px; | |||
|  |         opacity: 0.2; | |||
|  |         filter: alpha(opacity=20); | |||
|  |       } | |||
|  | 
 | |||
|  |       to { | |||
|  |         width: 40px; | |||
|  |         height: 40px; | |||
|  |         opacity: 0; | |||
|  |         filter: alpha(opacity=0); | |||
|  |       } | |||
|  |     } | |||
|  | 
 | |||
|  |     @-ms-keyframes jsmap-mapAni { | |||
|  |       0% { | |||
|  |         width: 0; | |||
|  |         height: 0; | |||
|  |         opacity: 1; | |||
|  |         filter: alpha(opacity=1); | |||
|  |       } | |||
|  | 
 | |||
|  |       25% { | |||
|  |         width: 12px; | |||
|  |         height: 12px; | |||
|  |         opacity: 0.7; | |||
|  |         filter: alpha(opacity=70); | |||
|  |       } | |||
|  | 
 | |||
|  |       50% { | |||
|  |         width: 20px; | |||
|  |         height: 20px; | |||
|  |         opacity: 0.5; | |||
|  |         filter: alpha(opacity=50); | |||
|  |       } | |||
|  | 
 | |||
|  |       75% { | |||
|  |         width: 30px; | |||
|  |         height: 30px; | |||
|  |         opacity: 0.2; | |||
|  |         filter: alpha(opacity=20); | |||
|  |       } | |||
|  | 
 | |||
|  |       to { | |||
|  |         width: 40px; | |||
|  |         height: 40px; | |||
|  |         opacity: 0; | |||
|  |         filter: alpha(opacity=0); | |||
|  |       } | |||
|  |     } | |||
|  | 
 | |||
|  |     @keyframes jsmap-mapAni { | |||
|  |       0% { | |||
|  |         width: 0; | |||
|  |         height: 0; | |||
|  |         opacity: 1; | |||
|  |         filter: alpha(opacity=1); | |||
|  |       } | |||
|  | 
 | |||
|  |       25% { | |||
|  |         width: 12px; | |||
|  |         height: 12px; | |||
|  |         opacity: 0.7; | |||
|  |         filter: alpha(opacity=70); | |||
|  |       } | |||
|  | 
 | |||
|  |       50% { | |||
|  |         width: 20px; | |||
|  |         height: 20px; | |||
|  |         opacity: 0.5; | |||
|  |         filter: alpha(opacity=50); | |||
|  |       } | |||
|  | 
 | |||
|  |       75% { | |||
|  |         width: 30px; | |||
|  |         height: 30px; | |||
|  |         opacity: 0.2; | |||
|  |         filter: alpha(opacity=20); | |||
|  |       } | |||
|  | 
 | |||
|  |       to { | |||
|  |         width: 40px; | |||
|  |         height: 40px; | |||
|  |         opacity: 0; | |||
|  |         filter: alpha(opacity=0); | |||
|  |       } | |||
|  |     } | |||
|  |   </style> | |||
|  | </head> | |||
|  | 
 | |||
|  | <body> | |||
|  | <div id='mapContainer'></div> | |||
|  | <!--<button id="addMarker" onclick="add()">添加DOM标注</button>--> | |||
|  | <!--<button id="removeMarker" onclick="remove()">移除DOM标注</button>--> | |||
|  | <select name="markerArea" id="markerArea" style="display: none;" onclick="changeMarker()"></select> | |||
|  | <div id="setProperty" style="display: none;" onclick="property()"> | |||
|  |   <form oninput="handleInput()"> | |||
|  |     <p>图标ID:<input type="text" class="ID" readonly/></p> | |||
|  |     <p>楼层:<input type="text" class="floor" readonly/></p> | |||
|  |     <p>坐标位置:<input type="text" class="position" readonly/></p> | |||
|  |     <div id="gradient">偏移: | |||
|  |       <p>x:<input type="number" id="x轴"/></p> | |||
|  |       <p>y:<input type="number" id="y轴"/></p> | |||
|  |     </div> | |||
|  |     <p>是否显示: | |||
|  |       <label for="show"> | |||
|  |         显示:<input type="radio" id="show" name="toggle"/> | |||
|  |       </label> | |||
|  |       <label for="hide"> | |||
|  |         隐藏:<input type="radio" id="hide" name="toggle"/> | |||
|  |       </label> | |||
|  |     </p> | |||
|  |     <p>深度检测: | |||
|  |       <label for="on"> | |||
|  |         开:<input type="radio" id="on" name="depth"/> | |||
|  |       </label> | |||
|  |       <label for="off"> | |||
|  |         关:<input type="radio" id="off" name="depth"/> | |||
|  |       </label> | |||
|  |     </p> | |||
|  |     <div id="close">x</div> | |||
|  |     <p><span id="changeImg">更换内容</span></p> | |||
|  |   </form> | |||
|  | </div> | |||
|  | <script type="text/javascript"> | |||
|  | 
 | |||
|  |   //定义全局map变量 | |||
|  |   var map = null; | |||
|  |   //定义地图ID变量 | |||
|  |   var mapID = '100930'; | |||
|  |   //定义循环的起始变量 | |||
|  |   var i = 0; | |||
|  |   //创建循环的终止变量 | |||
|  |   var max = 0; | |||
|  |   //创建存储标注的数组 | |||
|  |   var markerArr = []; | |||
|  |   //获取各个属性标签 | |||
|  |   var propertyInput = document.querySelectorAll('#setProperty>form input'); | |||
|  |   //记录当前所选的Marker | |||
|  |   var currentMarker = null; | |||
|  |   //创建文档碎片 | |||
|  |   var fragment = document.createDocumentFragment(); | |||
|  | 
 | |||
|  |   //定义点标注全局变量 | |||
|  |   var domMarker = null; | |||
|  | 
 | |||
|  |   window.onload = function () { | |||
|  |     //加载地图 | |||
|  |     openMap(); | |||
|  |   }; | |||
|  | 
 | |||
|  |   window.addEventListener('unload', function (e) { | |||
|  |     //销毁地图 | |||
|  |     map.destroy(); | |||
|  |     map = null; | |||
|  |   }); | |||
|  | 
 | |||
|  |   //打开地图 | |||
|  |   function openMap() { | |||
|  |     //初始化参数 | |||
|  |     var mapOptions = { | |||
|  |       //必要,地图容器 | |||
|  |       container: 'mapContainer', | |||
|  |       //必要,地图类型 | |||
|  |       mapType: jsmap.JSMapType.MAP_3D, | |||
|  |       //必要,地图路径 | |||
|  |       // mapServerURL: 'http://mapdemo.joysuch.com', | |||
|  |       mapServerURL: 'http://192.168.192.201:7024/joysuch/jsmap/data/map', | |||
|  |       openingAnimation: false, | |||
|  |       enableLighting: true, | |||
|  |       enableShadows: true, | |||
|  |       viewOptions: { | |||
|  |         center: { | |||
|  |           x: 119.65057611465456, | |||
|  |           y: 39.93527621050255, | |||
|  |           z: 0.016594102424956802 | |||
|  |         }, | |||
|  |         distance: 370.01629618875734, | |||
|  |         rotate: 0, | |||
|  |         tilt: 90 | |||
|  |       }, | |||
|  |       imageryProvider: jsmap.JSImageryProviderType.IMAGE_TDT, | |||
|  |     }; | |||
|  |     //初始化地图对象 | |||
|  |     map = new jsmap.JSMap(mapOptions); | |||
|  | 
 | |||
|  |     //打开map服务器的地图数据和主题 | |||
|  |     map.openMapById(mapID); | |||
|  | 
 | |||
|  |     //地图加载完成事件 | |||
|  |     map.on("loadComplete", e => { | |||
|  |       var compassControl = new jsmap.JSCompassControl({ | |||
|  |         position: jsmap.JSControlPosition.LEFT_TOP, | |||
|  |         offset: { | |||
|  |           x: 10, | |||
|  |           y: 20 | |||
|  |         } | |||
|  |       }); | |||
|  | 
 | |||
|  |       var zoomControl = new jsmap.JSZoomControl({ | |||
|  |         position: jsmap.JSControlPosition.LEFT_TOP, | |||
|  |         offset: { | |||
|  |           x: 40, | |||
|  |           y: 10 | |||
|  |         } | |||
|  |       }); | |||
|  | 
 | |||
|  |       if (document.documentElement.clientWidth >= 600) { | |||
|  |         map.addControl(compassControl); | |||
|  |         map.addControl(zoomControl); | |||
|  |       } | |||
|  |     }); | |||
|  | 
 | |||
|  |     map.on('mapClickNode', event => { | |||
|  |       addPointMarker(event); | |||
|  |     }); | |||
|  |   } | |||
|  | 
 | |||
|  |   //添加标注 | |||
|  |   function addPointMarker(event) { | |||
|  |     remove() | |||
|  |     setProperty.style.display = "none"; | |||
|  |       // //标注的X轴坐标取值范围 | |||
|  |       // var x = Math.random() * (105.20001908346316 - 105.19474256905414) + 105.19474256905414; | |||
|  |       // //标注的Y轴坐标取值范围 | |||
|  |       // var y = Math.random() * (37.65154533433473 - 37.649024581292366) + 37.649024581292366; | |||
|  |     // console.info(event) | |||
|  |       var x = event.eventInfo.coord.x; | |||
|  |       var y = event.eventInfo.coord.y; | |||
|  |       var z = event.eventInfo.coord.z; | |||
|  | 
 | |||
|  |       domMarker = new jsmap.JSDomMarker({ | |||
|  |         id: i, | |||
|  |         position: { | |||
|  |           x, | |||
|  |           y, | |||
|  |           z: 1 | |||
|  |         }, //坐标 | |||
|  |         floorId: 1, //楼层id,默认为1(地面) | |||
|  |         pointerEvents: 'none', | |||
|  |         content: '<div>' + | |||
|  |                     '<div class="wrapper">' + | |||
|  |                       '<div class="row cf">' + | |||
|  |                         '<div class="span">' + | |||
|  |                           '<div class="location_indicator"></div>' + | |||
|  |                         '</div>' + | |||
|  |                       '</div>' + | |||
|  |                     '</div>' + | |||
|  |                   '</div>', | |||
|  |         offset: jsmap.JSControlPosition.LEFT_BOTTOM, | |||
|  |         marginOffset: { | |||
|  |           x: 0, | |||
|  |           y: 0 | |||
|  |         }, | |||
|  |         properties: { | |||
|  |           type: 0, | |||
|  |         },//属性设置 | |||
|  |         callback: (node) => { | |||
|  |           // console.log(node); | |||
|  |         } //回调事件 | |||
|  |       }); | |||
|  |       map.addMarker(domMarker); | |||
|  |     //   //创建option标签 | |||
|  |     //   var option = document.createElement('option'); | |||
|  |     //   option.value = i; | |||
|  |     //   option.innerText = `第${i}个DOM标注`; | |||
|  |     //   fragment.appendChild(option); | |||
|  |     //   markerArr.push(domMarker); | |||
|  |     // markerArea.appendChild(fragment); | |||
|  |     // markerArea.style.display = 'block'; | |||
|  | 
 | |||
|  |     i -= 1; | |||
|  |     window.parent.postMessage({'LONGITUDE': x, 'LATITUDE': y}, '*'); | |||
|  |   } | |||
|  | 
 | |||
|  |   //移除全部标注 | |||
|  |   function remove() { | |||
|  |     setProperty.style.display = "none"; | |||
|  |     markerArea.style.display = 'none'; | |||
|  |     markerArea.innerHTML = ''; | |||
|  |     map.removeAllDomMarker(); | |||
|  |     markerArr = []; | |||
|  |     i = 0; | |||
|  |     max = 0; | |||
|  |   } | |||
|  | 
 | |||
|  |   //选择标注 | |||
|  |   function changeMarker(e) { | |||
|  |     e = e || window.event; | |||
|  |     currentMarker = markerArr.find(item => item._id === e.target.value); | |||
|  |     if (currentMarker !== undefined) { | |||
|  |       map.flyToMarker(currentMarker); | |||
|  |       setProperty.style.display = "block"; | |||
|  |       propertyInput.forEach(item => { | |||
|  |         if (item.className === 'ID') item.value = currentMarker._id; | |||
|  |         if (item.className === 'floor') item.value = currentMarker.floorId; | |||
|  |         if (item.className === 'position') item.value = 'x:' + currentMarker.position.x + ';' + 'y:' + currentMarker.position.y; | |||
|  |         if (item.id === "show" && currentMarker.show === true) item.checked = true; | |||
|  |         if (item.id === "x轴") item.value = currentMarker.marginOffset.x; | |||
|  |         if (item.id === "y轴") item.value = currentMarker.marginOffset.y; | |||
|  |         if (item.id === "on" && currentMarker.depthTest === true) item.checked = true; | |||
|  |         if (item.id === "off" && currentMarker.depthTest === false) item.checked = true; | |||
|  |       }) | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   //设置属性事件 | |||
|  |   function property(e) { | |||
|  |     e = e || window.event; | |||
|  | 
 | |||
|  |     let {id} = e.target; | |||
|  |     //设置显隐 | |||
|  |     if (id === 'show') currentMarker.show = true; | |||
|  |     if (id === 'hide') currentMarker.show = false; | |||
|  |     //是否开启深度检测 | |||
|  |     if (id === 'on') currentMarker.depthTest = true; | |||
|  |     if (id === 'off') currentMarker.depthTest = false; | |||
|  |     if (id === "changeImg") currentMarker.content = 'DOMMarker'; | |||
|  |     ; | |||
|  |     if (id === 'close') setProperty.style.display = "none"; | |||
|  |   } | |||
|  | 
 | |||
|  |   //实时修改属性 | |||
|  |   function handleInput(e) { | |||
|  |     e = e || window.event; | |||
|  |     let {id, className, value} = e.target; | |||
|  |     //修改偏移 | |||
|  |     currentMarker.marginOffset = { | |||
|  |       x: id === 'x轴' ? Number(value) : currentMarker.marginOffset.x, | |||
|  |       y: id === 'y轴' ? Number(value) : currentMarker.marginOffset.y, | |||
|  |     } | |||
|  |   } | |||
|  | </script> | |||
|  | </body> | |||
|  | 
 | |||
|  | </html> |