503 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			503 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ConstructionRiskMap.aspx.cs" Inherits="FineUIPro.Web.ProjectData.ConstructionRiskMap" %>
 | ||
| 
 | ||
| <!DOCTYPE html>
 | ||
| <style>
 | ||
|     body,
 | ||
|     html {
 | ||
|         overflow: hidden;
 | ||
|         width: 100%;
 | ||
|         height: 100%;
 | ||
|         margin: 0;
 | ||
|         font-family: "微软雅黑";
 | ||
|     }
 | ||
| 
 | ||
|     .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 #FFC125);
 | ||
|         padding: 15px;
 | ||
|         border-radius: 10px;
 | ||
|         border: 1px solid #cccccc;
 | ||
|         bottom: 12px;
 | ||
|         left: -50px;
 | ||
|         min-width: 360px;
 | ||
|     }
 | ||
| 
 | ||
|         .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: 2px;
 | ||
|         right: 8px;
 | ||
|         color: red;
 | ||
|     }
 | ||
| 
 | ||
|         .ol-popup-closer:after {
 | ||
|             content: "✖";
 | ||
|         }
 | ||
| </style>
 | ||
| <html xmlns="http://www.w3.org/1999/xhtml">
 | ||
| <head runat="server">
 | ||
|     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 | ||
|     <title></title>
 | ||
|     <link href="../res/css/common.css" rel="stylesheet" type="text/css" />
 | ||
|     <link type="text/css" href="../../res/ol/ol.css" rel="stylesheet" />
 | ||
|     <script type="text/javascript" src="../../res/ol/ol.js" charset="utf-8"></script>
 | ||
|     <script type="text/javascript" src="../../res/ol/bd09.js" charset="utf-8"></script>
 | ||
| </head>
 | ||
| <body>
 | ||
|     <form id="form1" runat="server">
 | ||
|         <f:PageManager ID="PageManager1" AutoSizePanelID="RegionPanel1" runat="server" />
 | ||
|         <f:RegionPanel ID="RegionPanel1" ShowBorder="false" runat="server" Margin="5px">
 | ||
|             <Regions>
 | ||
|                 <f:Region ID="Region2" ShowBorder="false" ShowHeader="false" Position="Center" Layout="VBox"
 | ||
|                     BoxConfigAlign="Stretch" BoxConfigPosition="Left" runat="server" BodyPadding="0 5 0 0">
 | ||
|                     <Toolbars>
 | ||
|                         <f:Toolbar runat="server">
 | ||
|                             <Items>
 | ||
|                                 <f:DropDownList ID="drpRiskLevel" runat="server" EnableEdit="true" Label="风险等级" LabelWidth="140px"
 | ||
|                                     OnSelectedIndexChanged="drpRiskLevel_SelectedIndexChanged"
 | ||
|                                     AutoPostBack="true">
 | ||
|                                     <f:ListItem Value="" Text="- 请选择 -" />
 | ||
|                                     <f:ListItem Value="低风险" Text="低风险" />
 | ||
|                                     <f:ListItem Value="一般风险" Text="一般风险" />
 | ||
|                                     <f:ListItem Value="较大风险" Text="较大风险" />
 | ||
|                                     <f:ListItem Value="重大风险" Text="重大风险" />
 | ||
|                                 </f:DropDownList>
 | ||
|                             </Items>
 | ||
| 
 | ||
|                         </f:Toolbar>
 | ||
| 
 | ||
|                     </Toolbars>
 | ||
|                     <Items>
 | ||
|                         <f:ContentPanel ID="ContentPanel1" CssClass="bodyregion" ShowBorder="false" ShowHeader="false" runat="server">
 | ||
|                             <div id="map" style="width: 100%; height: 700px"></div>
 | ||
|                             <div id="popup" class="ol-popup">
 | ||
|                                 <a href="#" id="popup-closer" class="ol-popup-closer"></a>
 | ||
|                                 <div id="popup-content" class="popup-content"></div>
 | ||
|                             </div>
 | ||
| 
 | ||
| 
 | ||
|                         </f:ContentPanel>
 | ||
| 
 | ||
|                     </Items>
 | ||
|                 </f:Region>
 | ||
|             </Regions>
 | ||
|         </f:RegionPanel>
 | ||
|     </form>
 | ||
| </body>
 | ||
| </html>
 | ||
| 
 | ||
| 
 | ||
| <%--<script src="https://api.map.baidu.com/api?v=2.0"></script>--%>
 | ||
| <script type="text/javascript">
 | ||
| 
 | ||
|     // 
 | ||
|     /*定义百度投影,这是实现无偏移加载百度地图离线瓦片核心所在。
 | ||
|     网上很多相关资料在用OpenLayers加载百度地图离线瓦片时都认为投影就是EPSG:3857(也就是Web墨卡托投影)。
 | ||
|     事实上这是错误的,因此无法做到无偏移加载。
 | ||
|     百度地图有自己独特的投影体系,必须在OpenLayers中自定义百度投影,才能实现无偏移加载。
 | ||
|     百度投影实现的核心文件为bd09.js,在迈高图官网可以找到查看这个文件。*/
 | ||
|     var projBD09 = new ol.proj.Projection({
 | ||
|         code: 'BD:09',
 | ||
|         extent: [-20037726.37, -11708041.66, 20037726.37, 12474104.17],
 | ||
|         units: 'm',
 | ||
|         axisOrientation: 'neu',
 | ||
|         global: false
 | ||
|     });
 | ||
| 
 | ||
|     ol.proj.addProjection(projBD09);
 | ||
|     ol.proj.addCoordinateTransforms("EPSG:4326", "BD:09",
 | ||
|         function (coordinate) {
 | ||
|             return lngLatToMercator(coordinate);
 | ||
|         },
 | ||
|         function (coordinate) {
 | ||
|             return mercatorToLngLat(coordinate);
 | ||
|         }
 | ||
|     );
 | ||
| 
 | ||
|     /*定义百度地图分辨率与瓦片网格*/
 | ||
|     var resolutions = [];
 | ||
|     for (var i = 0; i <= 18; i++) {
 | ||
|         resolutions[i] = Math.pow(2, 18 - i);
 | ||
|     }
 | ||
| 
 | ||
|     var tilegrid = new ol.tilegrid.TileGrid({
 | ||
|         origin: [0, 0],
 | ||
|         resolutions: resolutions
 | ||
|     });
 | ||
| 
 | ||
|     /*加载百度地图离线瓦片不能用ol.source.XYZ,ol.source.XYZ针对谷歌地图(注意:是谷歌地图)而设计,
 | ||
|     而百度地图与谷歌地图使用了不同的投影、分辨率和瓦片网格。因此这里使用ol.source.TileImage来自行指定
 | ||
|     投影、分辨率、瓦片网格。*/
 | ||
|     var source = new ol.source.TileImage({
 | ||
|         projection: "BD:09",
 | ||
|         tileGrid: tilegrid,
 | ||
|         tileUrlFunction: function (tileCoord, pixelRatio, proj) {
 | ||
|             //openlayer5的版本
 | ||
|             var z = tileCoord[0];
 | ||
|             var x = tileCoord[1];
 | ||
|             var y = tileCoord[2];
 | ||
|             // return "http://192.168.1.13:8080/mapImg/2/V1/"+z+"/"+x+"/"+y+".png";
 | ||
|             var projectCode = '<%=ProjectCode%>'
 | ||
|             return '../../File/Map/' + projectCode + '/tiles/' + z + '/tile-' + x + '_' + y + '.png';
 | ||
|             //return '../../File/Map/SD1-PC-2023-001/tiles/' + z + '/tile-' + x + '_' + y + '.png';
 | ||
|             //          return "/tile/?qt=vtile&x=" + x + "&y=" + y + "&z=" + z + "&styles=pl&scaler=1&udt=20210506&from=jsapi3_0";
 | ||
| 
 | ||
|             //openlayers6的版本
 | ||
|             //let z = tileCoord[0];
 | ||
|             // let x = tileCoord[1];
 | ||
|             //let y = -tileCoord[2]-1;
 | ||
|             // if(x<0)  x = "M"+(-x);
 | ||
|             // if(y<0) y = "M"+(-y);
 | ||
|         }
 | ||
|     });
 | ||
| 
 | ||
|     var mapLayer = new ol.layer.Tile({
 | ||
|         source: source
 | ||
|     });
 | ||
| 
 | ||
|     var riskLevel = '';
 | ||
|     var coordinate = '<%=Coordinate%>'
 | ||
|     var markers = [];
 | ||
|     var createLabelStyle1 = function (feature) {
 | ||
|         return new ol.style.Style({
 | ||
|             /**{olx.style.IconOptions}类型*/
 | ||
|             image: new ol.style.Icon({
 | ||
|                 anchor: [0.5, 60],
 | ||
|                 anchorOrigin: 'top-right',
 | ||
|                 anchorXUnits: 'fraction',
 | ||
|                 anchorYUnits: 'pixels',
 | ||
|                 offsetOrigin: 'top-right',
 | ||
|                 // offset:[0,10],
 | ||
|                 //图标缩放比例
 | ||
|                 // scale:0.5,
 | ||
| 
 | ||
|                 //图标的url
 | ||
|                 src: '../../File/Image/wei1.png',
 | ||
|             }),
 | ||
|             text: new ol.style.Text({
 | ||
|                 textAlign: 'center',            //位置
 | ||
|                 textBaseline: 'middle',         //基准线
 | ||
|                 font: 'normal 20px 微软雅黑',    //文字样式
 | ||
|                 text: feature.get('name'),      //文本内容
 | ||
|                 fill: new ol.style.Fill({       //文本填充样式(即文字颜色)
 | ||
|                     color: '#000'
 | ||
|                 }),
 | ||
|                 stroke: new ol.style.Stroke({
 | ||
|                     color: '#F00',
 | ||
|                     width: 2
 | ||
|                 })
 | ||
|             })
 | ||
|         })
 | ||
|     }
 | ||
|     var createLabelStyle2 = function (feature) {
 | ||
|         return new ol.style.Style({
 | ||
|             /**{olx.style.IconOptions}类型*/
 | ||
|             image: new ol.style.Icon({
 | ||
|                 anchor: [0.5, 60],
 | ||
|                 anchorOrigin: 'top-right',
 | ||
|                 anchorXUnits: 'fraction',
 | ||
|                 anchorYUnits: 'pixels',
 | ||
|                 offsetOrigin: 'top-right',
 | ||
|                 // offset:[0,10],
 | ||
|                 //图标缩放比例
 | ||
|                 // scale:0.5,
 | ||
| 
 | ||
|                 //图标的url
 | ||
|                 src: '../../File/Image/wei2.png',
 | ||
|             }),
 | ||
|             text: new ol.style.Text({
 | ||
|                 textAlign: 'center',            //位置
 | ||
|                 textBaseline: 'middle',         //基准线
 | ||
|                 font: 'normal 20px 微软雅黑',    //文字样式
 | ||
|                 text: feature.get('name'),      //文本内容
 | ||
|                 fill: new ol.style.Fill({       //文本填充样式(即文字颜色)
 | ||
|                     color: '#000'
 | ||
|                 }),
 | ||
|                 stroke: new ol.style.Stroke({
 | ||
|                     color: '#F00',
 | ||
|                     width: 2
 | ||
|                 })
 | ||
|             })
 | ||
|         })
 | ||
|     }
 | ||
| 
 | ||
|     var createLabelStyle3 = function (feature) {
 | ||
|         return new ol.style.Style({
 | ||
|             /**{olx.style.IconOptions}类型*/
 | ||
|             image: new ol.style.Icon({
 | ||
|                 anchor: [0.5, 60],
 | ||
|                 anchorOrigin: 'top-right',
 | ||
|                 anchorXUnits: 'fraction',
 | ||
|                 anchorYUnits: 'pixels',
 | ||
|                 offsetOrigin: 'top-right',
 | ||
|                 // offset:[0,10],
 | ||
|                 //图标缩放比例
 | ||
|                 // scale:0.5,
 | ||
| 
 | ||
|                 //图标的url
 | ||
|                 src: '../../File/Image/wei3.png',
 | ||
|             }),
 | ||
|             text: new ol.style.Text({
 | ||
|                 textAlign: 'center',            //位置
 | ||
|                 textBaseline: 'middle',         //基准线
 | ||
|                 font: 'normal 20px 微软雅黑',    //文字样式
 | ||
|                 text: feature.get('name'),      //文本内容
 | ||
|                 fill: new ol.style.Fill({       //文本填充样式(即文字颜色)
 | ||
|                     color: '#000'
 | ||
|                 }),
 | ||
|                 stroke: new ol.style.Stroke({
 | ||
|                     color: '#F00',
 | ||
|                     width: 2
 | ||
|                 })
 | ||
|             })
 | ||
|         })
 | ||
|     }
 | ||
| 
 | ||
|     var createLabelStyle4 = function (feature) {
 | ||
|         return new ol.style.Style({
 | ||
|             /**{olx.style.IconOptions}类型*/
 | ||
|             image: new ol.style.Icon({
 | ||
|                 anchor: [0.5, 60],
 | ||
|                 anchorOrigin: 'top-right',
 | ||
|                 anchorXUnits: 'fraction',
 | ||
|                 anchorYUnits: 'pixels',
 | ||
|                 offsetOrigin: 'top-right',
 | ||
|                 // offset:[0,10],
 | ||
|                 //图标缩放比例
 | ||
|                 // scale:0.5,
 | ||
| 
 | ||
|                 //图标的url
 | ||
|                 src: '../../File/Image/wei4.png',
 | ||
|             }),
 | ||
|             text: new ol.style.Text({
 | ||
|                 textAlign: 'center',            //位置
 | ||
|                 textBaseline: 'middle',         //基准线
 | ||
|                 font: 'normal 20px 微软雅黑',    //文字样式
 | ||
|                 text: feature.get('name'),      //文本内容
 | ||
|                 fill: new ol.style.Fill({       //文本填充样式(即文字颜色)
 | ||
|                     color: '#000'
 | ||
|                 }),
 | ||
|                 stroke: new ol.style.Stroke({
 | ||
|                     color: '#F00',
 | ||
|                     width: 2
 | ||
|                 })
 | ||
|             })
 | ||
|         })
 | ||
|     }
 | ||
|     var vectorLayer = new ol.layer.Vector()
 | ||
| 
 | ||
|     function setRiskLevel(Level) {
 | ||
|         riskLevel = Level;
 | ||
|     }
 | ||
| 
 | ||
|     function drawMap(locs) {
 | ||
|         var coord = locs.split(",");
 | ||
|         for (var i = 0; i < coord.length; i++) {
 | ||
|             var loc = coord[i].split(";")
 | ||
|             var txt = loc[1] + ":" + loc[2];
 | ||
|             //实例化Vector要素,通过矢量图层添加到地图容器中
 | ||
|             var iconFeature = new ol.Feature({
 | ||
|                 geometry: new ol.geom.Point([Number(loc[3]), Number(loc[4])]),
 | ||
|                 name: txt,
 | ||
|                 ftype: 'Marker',
 | ||
|                 workAreaId: loc[0]
 | ||
|             })
 | ||
| 
 | ||
|             switch (loc[5]) {
 | ||
|                 case "1": iconFeature.setStyle(createLabelStyle4(iconFeature)); break;
 | ||
|                 case "2": iconFeature.setStyle(createLabelStyle3(iconFeature)); break;
 | ||
|                 case "3": iconFeature.setStyle(createLabelStyle2(iconFeature)); break;
 | ||
|                 case "4": iconFeature.setStyle(createLabelStyle1(iconFeature)); break;
 | ||
| 
 | ||
|             }
 | ||
| 
 | ||
|             //矢量标注的数据源
 | ||
|             markers.push(iconFeature);
 | ||
|         }
 | ||
|         var vectorSource = new ol.source.Vector({
 | ||
|             features: markers,
 | ||
|         })
 | ||
|         //矢量标注图层      
 | ||
| 
 | ||
|         vectorLayer.setSource(vectorSource)
 | ||
|     }
 | ||
| 
 | ||
|     function clearOverlays() {
 | ||
| 
 | ||
|         markers.forEach((marker) => {
 | ||
|             vectorLayer.getSource().removeFeature(marker);
 | ||
|         });
 | ||
| 
 | ||
|         markers.length = 0;
 | ||
|     }
 | ||
| 
 | ||
|     function getRisk(workAreaId) {
 | ||
|         $.ajax({
 | ||
|             url: "ConstructionRiskMap.aspx/getRisk",
 | ||
|             type: "POST",
 | ||
|             contentType: "application/json; charset=utf-8",
 | ||
|             dataType: "json",
 | ||
|             data: JSON.stringify({
 | ||
|                 WorkAreaId: workAreaId,
 | ||
|                 RiskLevel: riskLevel,
 | ||
|             }),
 | ||
|             success: function (data) {
 | ||
|                 if (data.d != undefined && data.d != '') {
 | ||
|                     clearOverlays();
 | ||
|                     var risk = data.d
 | ||
|                     var coord = risk.split(",");
 | ||
|                     var markers1 = [];
 | ||
|                     for (var i = 0; i < coord.length; i++) {
 | ||
|                         var loc = coord[i].split(";")
 | ||
|                         var txt = "<ul class='popover-area'>" +
 | ||
|                             "<li><p class='text-gray3'>施工单位:</p><p>" + loc[1] + "</p></li>" +
 | ||
|                             "<li><p class='text-gray3'>日期:</p><p>" + loc[2] + "</p></li>" +
 | ||
|                             "<li><p class='text-gray3'>风险等级:</p><p>" + loc[3] + "</p></li>" +
 | ||
|                             "<li><p class='text-gray3'>施工内容:</p><p>" + loc[4] + "</p></li>" +
 | ||
|                             "</ul>";
 | ||
| 
 | ||
|                         //实例化Vector要素,通过矢量图层添加到地图容器中
 | ||
|                         var iconFeature = new ol.Feature({
 | ||
|                             // geometry: new ol.geom.Point(ol.proj.transform([116.403, 39.924], 'EPSG:4326', 'EPSG:3857')),
 | ||
|                             geometry: new ol.geom.Point([loc[5], loc[6]]),
 | ||
|                             name: loc[4],
 | ||
|                             ftype: 'MarkerRisk',
 | ||
|                             data: loc
 | ||
|                         })
 | ||
|                         switch (loc[3]) {
 | ||
|                             case "低风险": iconFeature.setStyle(createLabelStyle4(iconFeature)); break;
 | ||
|                             case "一般风险": iconFeature.setStyle(createLabelStyle3(iconFeature)); break;
 | ||
|                             case "较大风险": iconFeature.setStyle(createLabelStyle2(iconFeature)); break;
 | ||
|                             case "重大风险": iconFeature.setStyle(createLabelStyle1(iconFeature)); break;
 | ||
| 
 | ||
|                         }
 | ||
| 
 | ||
| 
 | ||
|                         //矢量标注的数据源
 | ||
|                         markers.push(iconFeature);
 | ||
| 
 | ||
|                     }
 | ||
| 
 | ||
|                     var vectorSource = new ol.source.Vector({
 | ||
|                         features: markers,
 | ||
|                     })
 | ||
|                     //矢量标注图层
 | ||
|                     vectorLayer.setSource(vectorSource);
 | ||
| 
 | ||
|                 }
 | ||
|             }
 | ||
|         })
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|     // 获取popup的dom对象
 | ||
|     var container = document.getElementById('popup');
 | ||
|     var closer = document.getElementById('popup-closer');
 | ||
| 
 | ||
|     // 创建popup
 | ||
|     var popup = new ol.Overlay({
 | ||
|         element: container,
 | ||
|         autoPan: true,
 | ||
|         positioning: 'bottom-center',
 | ||
|         stopEvent: false,
 | ||
|         autoPanAnimation: {
 | ||
|             duration: 250
 | ||
|         }
 | ||
|     });
 | ||
| 
 | ||
| 
 | ||
|     // 关闭popup
 | ||
|     closer.onclick = function () {
 | ||
|         popup.setPosition(undefined);
 | ||
|         closer.blur();
 | ||
|         return false;
 | ||
|     };
 | ||
| 
 | ||
|     //});
 | ||
|     var map;
 | ||
|     F.ready(function () {
 | ||
| 
 | ||
|         map = new ol.Map({
 | ||
|             layers: [
 | ||
|                 mapLayer
 | ||
|             ],
 | ||
|             view: new ol.View({
 | ||
|                 center: ol.proj.transform([5, 5], 'EPSG:4326', 'BD:09'),
 | ||
|                 projection: 'BD:09',
 | ||
|                 zoom: 5
 | ||
|             }),
 | ||
|             target: 'map'
 | ||
|         });
 | ||
|         map.on('click', (evt) => {
 | ||
| 
 | ||
|             debugger
 | ||
|             var coordinate = evt.coordinate;
 | ||
|             const Feature = map.forEachFeatureAtPixel(evt.pixel, (feature) => {
 | ||
|                 return feature
 | ||
|             })
 | ||
|             if (Feature && Feature.get('ftype') === 'Marker') {
 | ||
|                 getRisk(Feature.get('workAreaId'));
 | ||
|             } else if (Feature && Feature.get('ftype') === 'MarkerRisk') {
 | ||
| 
 | ||
|                 var data = Feature.get('data');
 | ||
|                 // 弹出popup
 | ||
|                 var loc = data;
 | ||
|                 var txt = "<ul class='popover-area'>" +
 | ||
|                     "<li><p class='text-gray3'>施工单位:</p><p>" + loc[1] + "</p></li>" +
 | ||
|                     "<li><p class='text-gray3'>日期:</p><p>" + loc[2] + "</p></li>" +
 | ||
|                     "<li><p class='text-gray3'>风险等级:</p><p>" + loc[3] + "</p></li>" +
 | ||
|                     "<li><p class='text-gray3'>施工内容:</p><p>" + loc[4] + "</p></li>" +
 | ||
|                     "</ul>";
 | ||
|                 var content = document.getElementById('popup-content');
 | ||
| 
 | ||
|                 content.innerHTML = txt;
 | ||
|                 popup.setPosition(coordinate);
 | ||
| 
 | ||
|             }
 | ||
|         });
 | ||
| 
 | ||
|         map.addLayer(vectorLayer)
 | ||
|         if (coordinate != '') {
 | ||
|             drawMap(coordinate)
 | ||
|         }
 | ||
|         map.addOverlay(popup);
 | ||
| 
 | ||
| 
 | ||
|     });
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| </script>
 |