xinjiang/SGGL/FineUIPro.Web/HSSE/Hazard/ConstructionRiskMap.aspx

503 lines
18 KiB
Plaintext
Raw Normal View History

2024-11-19 09:45:27 +08:00
<%@ 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.XYZol.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>