天地圖加載大量圖標會出現卡頓狀況,使用openlayers加載優化javascript
百度地圖是使用mapv.jscss
- 在頁面添加html代碼
@* openlayers提示框層 *@ <div id="popup2" class="ol-popup"> <a href="#" id="popup-closer2" class="ol-popup-closer"></a> <div id="popup-content2"></div> </div>
-
js源碼
htmlvar getGisMap2 = (function () { //建立windowinfo overlay var container_pop = document.getElementById('popup2'); var content = document.getElementById('popup-content2'); var closer = document.getElementById('popup-closer2'); var overlay2 = new ol.Overlay(({ element: container_pop, autoPan: true, autoPanAnimation: { duration: 250 } })); //關閉windowinfo closer.onclick = function () { overlay2.setPosition(undefined); closer.blur(); return false; }; //定義polygon fill 及stroke 樣式 var fill = new ol.style.Fill(); var stroke = new ol.style.Stroke({ color: 'yellow', width: 1 }); var map, labelList; var views = new ol.View({ projection: 'EPSG:4326', center: [], zoom: 12, maxZoom: 18 }); var vec_c = getTdtLayer("vec_c"); var cva_c = getTdtLayer("cva_c"); //初始化地圖 天地圖 map = new ol.Map({ layers: [ vec_c, cva_c ], target: 'mapDiv2', overlays: [overlay2], view: views }); //解決地圖文字被壓扁問題 function getTdtLayer(lyr) { var url = "http://t0.tianditu.com/DataServer?T="+lyr+"&X={x}&Y={y}&L={z}"; var projection = ol.proj.get("EPSG:4326"); var projectionExtent = [-180, -90, 180, 90]; var maxResolution = (ol.extent.getWidth(projectionExtent) / (256 * 2)); var resolutions = new Array(18); //地圖最大放大級別 var z; for (z = 0; z < 18; ++z) { resolutions[z] = maxResolution / Math.pow(2, z); } var tileOrigin = ol.extent.getTopLeft(projectionExtent); var layer = new ol.layer.Tile({ extent: [-180, -90, 180, 90], source: new ol.source.TileImage({ tileUrlFunction: function (tileCoord) { var z = tileCoord[0] + 1; var x = tileCoord[1]; var y = -tileCoord[2] - 1; var n = Math.pow(2, z + 1); x = x % n; if (x * n < 0) { x = x + n; } return url.replace('{z}', z.toString()) .replace('{y}', y.toString()) .replace('{x}', x.toString()); }, projection: projection, tileGrid: new ol.tilegrid.TileGrid({ origin: tileOrigin, resolutions: resolutions, tileSize: 256 }) }) }); return layer; } //換熱站圖層 var layer_station = new ol.layer.Vector({ source: new ol.source.Vector() }); //換熱站名字圖層 var layer_name = new ol.layer.Vector({ source: new ol.source.Vector() }); //熱源圖層 var layer_source = new ol.layer.Vector({ source: new ol.source.Vector() }); //監聽地圖放大縮小級別 map.on("moveend", function (e) { var zoom = map.getView().getZoom(); //獲取當前地圖的縮放級別 if (zoom < 9) { $("#mapDiv").load('ParentMap2?r=' + Math.random()) //地圖縮小到必定級別返回上一層頁面地圖 } else if (zoom >= 9 && zoom < 13) { layer_station.setVisible(false); //隱藏換熱站圖標 } else if (zoom >= 13 && zoom < 15) { layer_station.setVisible(true); //顯示換熱站圖標 layer_name.setVisible(false); //隱藏換熱站名字 } else if (zoom >= 15) { layer_name.setVisible(true); //隱藏換熱站名字 } }); // 監聽地圖點擊事件 map.on('click', function (e) { map.forEachFeatureAtPixel(e.pixel, function (feature, layer) { if (feature.type == 'heatStation') { //換熱站圖標點擊事件 //點擊換熱站 var item = feature.item; layui.layer.open({ type: 2, title: '運行圖', shadeClose: false, shade: [0.1, '#000'], closeBtn: 1, area: ['1000px', '500px'], content: '/Html/components/operation.html?orgid=' + item.ObjectId }) } else if (feature.type == 'heatSource') { //熱源圖標點擊事件 //點擊熱源 var item = feature.item; var coordinate = e.coordinate; var hdms = ol.coordinate.toStringHDMS(ol.proj.transform( coordinate, 'EPSG:3857', 'EPSG:4326')); $.post('/Map/HeatingRunMap/GetHeatSourceRuningData', { heatSourceId: item.ObjectId }, function (res) { if (res.IsSuccess) { var str = '名稱 :' + item.ObjectName + '<br>' + '所屬 :' + item.OrgShortName + '<br>'; if (res.Data.length) { res.Data.forEach(function (param) { str += '<span style="color:#4f95e9">' + param.Key + ' :' + param.Value + '</span><br>' }) } else { str += '<span style="color:#4f95e9">無即時數據<span>' } content.innerHTML = str; } }) overlay2.setPosition(coordinate); } else { console.log(feature.getId()); } }) }); //初始化接口加載 $.ajax({ url: '/Map/HeatingRunMap/GetCityHeatSourceCount', type: 'POST', dataType: 'json', data: { cityId: $('#city_id').val() }, success: function (data) { var temp = []; if (data.Message) { //OpenLayer3調用天地圖,拖拽後,地圖消失的問題,座標點必定要用parseFloat()轉換下 temp.push(parseFloat(data.Data[0].MapX)); temp.push(parseFloat(data.Data[0].MapY)) views.setCenter(temp); showHeatStation($('#city_id').val());//顯示換熱站及label getMap($('#city_id').val(), '200');//顯示熱源 drawLine() //顯示管線 } } }); //繪製一次管線 function drawLine() { $.ajax({ url: '/Map/HeatingRunMap/GetLineByCityId', type: 'POST', dataType: 'json', // async: false, data: { cityId: $('#city_id').val(), eleId: 1, }, success: function (data) { var points = []; var out_points = []; $.each(data.Data, function (i, val) { points = []; val.Points.forEach(function (item) { var res = item.split(","); var temp = []; temp.push(parseFloat(res[0])); //字符串轉換 temp.push(parseFloat(res[1])); points.push(temp); //由[["22","22"],["11","33"],...]轉換成[[22,22],[11,33],...]形式的數組,線纔不會亂畫 }) out_points.push({ "geometry": { "type": 'LineString', "ObjectId": val.ObjectId, "coordinates": points }, "type": "Feature", "id": val.ObjectId }) }); //組裝geojson數據 var geojsonObject = { 'type': 'FeatureCollection', 'crs': { 'type': 'name', 'properties': { 'name': 'EPSG:4326' } }, 'features': out_points }; //建立features var source = new ol.source.Vector({ features: (new ol.format.GeoJSON()).readFeatures(geojsonObject) }); //一次管線 var layer_line = new ol.layer.Vector({ source: source, style: new ol.style.Style({ stroke: new ol.style.Stroke({ width: 2, color: '#ff0000' }) }) }); map.addLayer(layer_line) } }); } //顯示熱源 function getMap(cityId, energyType) { $.ajax({ url: '/Map/HeatingRunMap/GetPointByCityId', type: 'POST', dataType: 'json', data: { cityId: cityId, eleId: -1, energyType: energyType || "-1,1" }, success: function (data) { if (data.Message) { var styles = [ new ol.style.Style({ image: new ol.style.Icon({ src: '/Content/img/gis/Map_icon_other20.png' }) }), new ol.style.Style({ image: new ol.style.Icon({ src: '/Content/img/gis/Map_icon_gas20.png' }) }), new ol.style.Style({ image: new ol.style.Icon({ src: '/Content/img/gis/Map_icon_coal20.png' }) }), new ol.style.Style({ image: new ol.style.Icon({ src: '/Content/img/gis/Map_icon_electric20.png' }) }) ]; $.each(data.Data, function (i, item) { var feature; if (item.energyType == 0) { feature = new ol.Feature({ geometry: new ol.geom.Point([item.MapX, item.MapY]) }); feature.setStyle(styles[1]); } else if (item.energyType == 1) { feature = new ol.Feature({ geometry: new ol.geom.Point([item.MapX, item.MapY]) }); feature.setStyle(styles[2]); } else if (item.energyType == 3) { feature = new ol.Feature({ geometry: new ol.geom.Point([item.MapX, item.MapY]) }); feature.setStyle(styles[3]); } else { feature = new ol.Feature({ geometry: new ol.geom.Point([item.MapX, item.MapY]) }); feature.setStyle(styles[0]); } feature.item = item; feature.type = 'heatSource'; layer_source.getSource().addFeature(feature); }) map.addLayer(layer_source) var allFeatrues = layer_source.getSource().getFeatures(); //點擊熱源按鈕 $("#energyType li").click(function () { var temp = []; if ($(this).hasClass('active')) { $(this).removeClass('active') } else { $(this).addClass('active') } var str = ""; if ($('#energyType li.active').length != 0) { $('#energyType li.active').each(function (i, item) { str += $(item).attr('data-type') + "," }); str = str.substr(0, str.length - 1); str.split(',').forEach(function (val) { //過濾 allFeatrues.forEach(function (ff) { if (val == 0 || val == 1 || val == 3) { if (ff.item.energyType == val) { temp.push(ff); } } else if (val == -1) { if (ff.item.energyType == 2 || ff.item.energyType == 4 || ff.item.energyType == 5 || ff.item.energyType == 6) { temp.push(ff); } } }) }) layer_source.getSource().clear(); layer_source.getSource().addFeatures(temp); } else { str = -200 layer_source.getSource().clear(); } }) } } }); } //換熱站圖標 function showHeatStation(cityId) { var styles = [ new ol.style.Style({ image: new ol.style.Icon({ src: '/Content/img/gis/hotsiteOnLine.png' //正常 }) }), new ol.style.Style({ image: new ol.style.Icon({ src: '/Content/img/gis/hotsiteOver.png' //異常 }) }), new ol.style.Style({ image: new ol.style.Icon({ src: '/Content/img/gis/hotsiteLow.png' //無即便數據 }) }) ]; $.ajax({ url: '/Map/HeatingRunMap/GetPointByCityId', type: 'POST', dataType: 'json', data: { cityId: cityId, eleId: -2 }, success: function (data) { labelList = data.Data; var feature; $.each(data.Data, function (i, item) { //換熱站的狀態類型(0:正常,1:無即時數據,2:異常) if (item.HeatStationStatusType == 0) { feature = new ol.Feature({ geometry: new ol.geom.Point([item.MapX, item.MapY]) }); feature.setStyle(styles[0]); } else if (item.HeatStationStatusType == 2) { feature = new ol.Feature({ geometry: new ol.geom.Point([item.MapX, item.MapY]) }); feature.setStyle(styles[1]); } else if (item.HeatStationStatusType == 1) { feature = new ol.Feature({ geometry: new ol.geom.Point([item.MapX, item.MapY]) }); feature.setStyle(styles[2]); } feature.item = item; feature.type = 'heatStation'; layer_station.getSource().addFeature(feature); }) map.addLayer(layer_station); showHeatStationLabel(labelList); layer_name.setVisible(false); //初始化隱藏 //點擊異常換熱站按鈕 var allFeatrues2 = layer_station.getSource().getFeatures(); var allLabelName = layer_name.getSource().getFeatures(); $(".hrz_fault").click(function () { var temp = []; var tempLabel = []; if ($(this).hasClass('active')) { //顯示所有換熱站 $(this).removeClass('active') layer_station.getSource().clear(); //清除該圖層的覆蓋物 layer_station.getSource().addFeatures(allFeatrues2); //添加換熱站圖標 layer_name.getSource().clear();//清除該圖層的覆蓋物 layer_name.getSource().addFeatures(allLabelName);//添加換熱站名字 } else { $(this).addClass('active') //只顯示異常換熱站 allFeatrues2.forEach(function (ff) { if (ff.item.HeatStationStatusType == 2) { temp.push(ff); } }) layer_station.getSource().clear();//清除該圖層的覆蓋物 layer_station.getSource().addFeatures(temp);//添加異常換熱站圖標 allLabelName.forEach(function (ff) { if (ff.item.HeatStationStatusType == 2) { tempLabel.push(ff); } }) layer_name.getSource().clear();//清除該圖層的覆蓋物 layer_name.getSource().addFeatures(tempLabel);//添加異常換熱站名字 } }) } }); } //換熱站名字 function showHeatStationLabel(labelList) { var feature; labelList.forEach(function (item) { feature = new ol.Feature({ geometry: new ol.geom.Point([item.MapX, item.MapY]) }); feature.setStyle(new ol.style.Style({ text: new ol.style.Text({ // font: '10px sans-serif' 默認這個字體,能夠修改爲其餘的,格式和css的字體設置同樣 text: item.ObjectName, offsetY: 12, fill: new ol.style.Fill({ color: '#0aa7f9', }) }) })); feature.item = item; layer_name.getSource().addFeature(feature); }) map.addLayer(layer_name); }; return { showHeatStation: showHeatStation, getMap: getMap, showHeatStationLabel: showHeatStationLabel, } }());
效果如圖:
java