<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <link rel="stylesheet" href="lib/OpenLayers/ol.css" type="text/css"> <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <script src="lib/OpenLayers/ol.js"></script> <script src="olStyle/Light.js"></script> <title>Document</title> <style> html, body { width: 100%; height: 100%; margin: 0; } .map { width: 100%; height: 100%; background: #f6f6f4; } input[type=range] { -webkit-appearance: none; width: 300px; border-radius: 10px; /*這個屬性設置使填充進度條時的圖形為圓角*/ } input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; } input[type=range]::-webkit-slider-runnable-track { height: 15px; border-radius: 10px; /*將軌道設為圓角的*/ box-shadow: 0 1px 1px #65bdd3, inset 0 .125em .125em #127f9b; /*軌道內置陰影效果*/ } input[type=range]:focus { outline: none; } input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; height: 25px; width: 25px; margin-top: -5px; /*使滑塊超出軌道部分的偏移量相等*/ background: #08c1e6; border-radius: 50%; /*外觀設置為圓形*/ border: solid 0.125em rgba(49, 155, 187, 0.5); /*設置邊框*/ box-shadow: 0 .125em .125em #08c1e6; /*添加底部陰影*/ } /** 下面是彈框樣式 */ .ol-popup { position: absolute; background-color: white; -webkit-filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); border-radius: 10px; border: 1px solid #cccccc; bottom: 12px; left: -50px; min-width: 280px; } .ol-popup:after, .ol-popup:before { top: 100%; border: solid transparent; content: " "; height: 0; width: 0; position: absolute; pointer-events: none; } .ol-popup:after { border-top-color: white; border-width: 10px; left: 48px; margin-left: -10px; } .ol-popup:before { border-top-color: #cccccc; border-width: 11px; left: 48px; margin-left: -11px; } .ol-popup-closer { text-decoration: none; position: absolute; top: 0px; right: 8px; } .ol-popup-closer:after { content: "✖"; } .popup-top { background-color: #eeeeee; height: 30px; line-height: 30px; border-top-left-radius: 5px; border-top-right-radius: 5px; } .popup-title { padding-left: 10px; } .popup-content { padding: 10px; } .popup-content ul { list-style: none; padding: 0px; margin: 0px; font-size: 12px; } </style> </head> <body> <input type="button" id="tempstop" value="暫停" /> <input type="button" id="start" value="開始" /> <input type="button" id="stop" value="停止" /> <input type="button" id="next" value="前進" /> <input type="button" id="prev" value="后退" /> <input type="range" id="sudu" value="800" max="2000" min="100" step="100" /> <div id="map" class="map" data-id="11"></div> <div id="popup" class="ol-popup"> <div class="popup-top"> <span class="popup-title">當前坐標信息</span> <a href="#" id="popup-closer" class="ol-popup-closer"></a> </div> <div class="popup-content"> <ul id="popup-content"> </ul> </div> </div> </body> </html> <script type="text/javascript"> var points = [ [120.27194738388057, 36.3357839481728,new Date()] , [120.27194738388057, 36.33528166973691,new Date()] , [120.2717328071594, 36.33459124591144,new Date()] , [120.27145385742186, 36.333882530121315,new Date()] , [120.270938873291, 36.33315652189482,new Date()] , [120.27091741561887, 36.332741657013344,new Date()] , [120.2705955505371, 36.33213664176766,new Date()] , [120.27070283889768, 36.33139333089085,new Date()] , [120.27057409286496, 36.33087473770719,new Date()] , [120.27108907699584, 36.33006226811251,new Date()] , [120.27177572250363, 36.32987211443067,new Date()] , [120.27271986007688, 36.329664673521194,new Date()] , [120.27357816696164, 36.32918064258463,new Date()] , [120.27342796325681, 36.32826443293632,new Date()] , [120.27364253997803, 36.32753837235599,new Date()] , [120.27447938919066, 36.327088902892015,new Date()] , [120.2756381034851, 36.326795017609925,new Date()] , [120.27731180191037, 36.32632825635429,new Date()] , [120.27881383895873, 36.32601708063062,new Date()] , [120.28033733367917, 36.32572319130615,new Date()] , [120.28138875961302, 36.32570590366433,new Date()] , [120.2832770347595, 36.32555031471519,new Date()] , [120.28469324111937, 36.32555031471519,new Date()] , [120.28591632843013, 36.32548116397142,new Date()] , [120.2876543998718, 36.325412013166286,new Date()] , [120.2888774871826, 36.325412013166286,new Date()] , [120.29087305068967, 36.3253774377407,new Date()] , [120.29175281524657, 36.32485880451607,new Date()] , [120.29284715652466, 36.3245649108233,new Date()] ] var map; var container = document.getElementById('popup'); var content = document.getElementById('popup-content'); var closer = document.getElementById('popup-closer'); var overlay = new ol.Overlay({ element: container, autoPan: true, autoPanAnimation: { duration: 50 } }); closer.onclick = function () { overlay.setPosition(undefined); closer.blur(); return false; }; //軌跡 var layer = new ol.layer.Vector({ source: new ol.source.Vector(), style: new ol.style.Style({ fill: new ol.style.Fill({ color: 'rgba(255, 0, 0, 0.5)' }), stroke: new ol.style.Stroke({ color: 'red', width: 2 }) }) }); //樣式 var style = new ol.style.Style({ image: new ol.style.Circle({ radius: 5, snapToPixel: false, fill: new ol.style.Fill({ color: 'rgba(30,144,255,1)' }), stroke: new ol.style.Stroke({ color: 'rgb(30,144,255)', width: 2 }) }) }); //地圖初始化 function InitMap() { map = new ol.Map({ layers: [new ol.layer.Vector({ source: new ol.source.Vector(), style: function (feature, resolution) { switch (feature.get('layer')) { case 'poi': poiStyle.getText().setText(feature.get('name')); return poiStyle; case 'boundary': return boundaryStyle; case 'lawn': return lawnStyle; case 'road': roadStyle.getText().setText(feature.get('name')); return (resolution < 2) ? roadStyle : null; case 'building': return buildingStyle(feature, resolution); case 'other': otherStyle.getText().setText(feature.get('name')); return otherStyle; default: return null; } } }), layer], overlays: [overlay], target: 'map', view: new ol.View({ center: ol.proj.fromLonLat([120.277, 36.330]), minZoom: 1, zoom: 16 }) }); } var pointStyle = new ol.style.Style({ //把點的樣式換成ICON圖標 fill: new ol.style.Fill({ //填充顏色 color: 'rgba(37,241,239,0.2)' }), //圖形樣式,主要適用於點樣式 image: new ol.style.Circle({ //半徑大小 radius: 5, //填充 fill: new ol.style.Fill({ //填充顏色 color: 'rgba(255,0,0,0.3)' }) }) }); /*顯示並編輯區域**********************************************************************************/ function AddPolygon() { layer.getSource().clear(); for (var i = 0; i < points.length; i++) { if (i == 0) { AddPoint(style, points[i], i); } else { AddPoint(pointStyle, points[i], i); } } } function AddPoint(style, lnglat, id) { var newFeature = new ol.Feature({ geometry: new ol.geom.Point(ol.proj.fromLonLat(lnglat)) }); //設置點的樣式 newFeature.setStyle(style); newFeature.setId("PlayPoints" + id) //將當前要素添加到矢量數據源中 layer.getSource().addFeature(newFeature); } InitMap(); map.on('click', function (evt) { // var coordinate = evt.coordinate; // var hdms = JSON.stringify(coordinate); var pixel = map.getEventPixel(evt.originalEvent); var feature = map.forEachFeatureAtPixel(pixel, function (feature) { return feature; });//查詢方式有很多 var html = '' if (feature) { var id = feature.getId(); if (id == undefined) { return false; } id = id.replace('PlayPoints', ''); html += "<li>上傳時間:" + points[id][2] + "</li>" content.innerHTML = html; overlay.setPosition(ol.proj.fromLonLat(points[id])); } }); layer.getSource().clear(); AddPolygon(); //動畫 var index = 0; var playInterval var trackPlay = {}; trackPlay.start = function () { if (index == 0) { layer.getSource().clear(); } var speed = 2000 / $("#sudu").val() * 50 $("#sudu").attr("disabled", "disabled") playInterval = setInterval(() => { if (index == 0) { AddPoint(style, points[index], index); } else { AddPoint(pointStyle, points[index], index); } index = index + 1; if (index >= points.length) { trackPlay.stop(); } }, speed) } trackPlay.stop = function () { index = 0; // if (trackPlay.stop) { clearInterval(playInterval); $("#sudu").removeAttr("disabled") // } } trackPlay.pause = function () { // if (trackPlay.stop) { clearInterval(playInterval); $("#sudu").removeAttr("disabled") // } } trackPlay.next = function () { if (index >= points.length) { return false; } AddPoint(pointStyle, points[index], index); index = index + 1; } trackPlay.prev = function () { if (index == 0) { return false; } index = index - 1; var feature = this.getLastFeature(); layer.getSource().removeFeature(feature); } trackPlay.getLastFeature = function () { return layer.getSource().getFeatureById("PlayPoints" + index); } $("#tempstop").click(function () { trackPlay.pause(); }) $("#start").click(function () { trackPlay.start(); }) $("#stop").click(function () { trackPlay.stop(); AddPolygon(); }) $("#next").click(function () { trackPlay.next(); }) $("#prev").click(function () { trackPlay.prev(); }) </script>