+
+
+
+
+
+
+
+
+
+
+
+
+ 推荐方案
+ 躲避拥堵
+
+
+ 约{{ routes.time / 60 | number:'0.0-0' }}分钟
+ {{ routes.distance / 1000 | number:'0.1-1' }}公里
+
+
+ 途径
+ {{item.road? item.road + '>' : null}}
+
+
+
+
←
+
↑
+
→
+
↓
+
↖
+
↙
+
↗
+
↘
+
{{item.instruction}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{item.name}}
+
+
+
+
+
+
+
+
+
+
图层
+
+ 卫星图层
+ 路网图层
+ clear
+
+
+
+
+
+
2D
+
+
+
+
3D
+
+
+
+
+
+
+
diff --git a/src/app/gis-management/gis-labeling/gis-labeling.component.scss b/src/app/gis-management/gis-labeling/gis-labeling.component.scss
index feb03fd..c234832 100644
--- a/src/app/gis-management/gis-labeling/gis-labeling.component.scss
+++ b/src/app/gis-management/gis-labeling/gis-labeling.component.scss
@@ -1,84 +1,366 @@
-.mapbox{
- width: 100%;
- height: 100%;
+.content {
+ width: 100%;
+ height: 100%;
+ min-width: 1024px;
+ min-height: 768px;
+ box-sizing: border-box;
+ padding: 1px;
+ position: relative;
+ #map { width: 100%; height: 100%; }
}
+//左侧工作区
+.leftDiv {
+ width: 400px;
+ height: 100%;
+ background-color: #fff;
+ overflow: hidden;
+ position: absolute;
+ left: 0px;
+ top: 0px;
+ z-index: 10;
+ box-sizing: border-box;
+ padding: 3px;
+}
+//左侧工作区 显隐图标
+.publicButton {
+ display: block;
+ width: 30px;
+ height: 30px;
+ color: #fff;
+ position: absolute;
+ top: 50%;
+ margin-top: -15px;
+ z-index: 11;
+ cursor:pointer;
+}
+.leftHide {
+ left: 400px;
+}
+.leftShow {
+ left: 0px;;
+}
+.leftDivShow {
+ margin-left: 0px;
+ transition: margin-left 0.5s;
+}
+.leftDivHide {
+ margin-left: -500px;
+ transition: margin-left 0.5s;
+}
+//文本溢出
+.overflowText {
+ overflow: hidden;
+ text-overflow:ellipsis;
+ white-space: nowrap;
+}
+.mat-icon, label, button, p, span {cursor:pointer;}
+//左上搜索
+.searchInput {
+ width: 340px;
+ max-height: 500px;
+ overflow: hidden;
+ position: absolute;
+ left: 30px;
+ top: 15px;
+ z-index: 5;
+ display: flex;
+ flex-direction: column;
+ .clearIcon {
+ position: absolute;
+ color: rgb(73, 71, 71);
+ top: 0px;
+ right: 40px;
+ width: 36px;
+ height: 36px;
+ display: inline-block;
+ font-size: 24px;
+ text-align: center;
+ }
+ .searchDataDiv {
+ background-color: #fff;
+ flex: 1;
+ overflow-y: auto;
+ border-right: 1px solid rgb(228, 225, 225);
+ box-shadow: inset 0px 0px 3px #bdb8b8;
+ }
+ input {
+ width: 300px;
+ height: 36px;
+ outline: none;
+ border-radius: 8px 0 0 8px;
+ box-sizing: border-box;
+ padding-left: 5px;
+ border: 1px solid rgb(228, 225, 225);
+ }
+ button {
+ width: 40px;
+ height: 36px;
+ border-radius: 0px 8px 8px 0;
+ float: right;
+ border: none;
+ outline: none;
+ background-color: #0080FF;
+ .mat-icon {
+ font-size: 26px;
+ vertical-align: bottom;
+ color: #fff;
+ }
+ }
+ .searchCompany {
+ width: 100%;
+ height: 26px;
+ margin: 3px 0;
+ box-sizing: border-box;
+ display: flex;
+ align-items: center;
+ justify-self: center;
+ p { flex: 1; font-size: 14px; padding-left: 10px; }
+ :last-child { color: #999; font-size: 10px; }
+ }
+}
+.searchCompany:hover { background-color: rgb(228, 228, 228);cursor:pointer; }
+//左侧导航路线
+.routeGIS {
+ width: 340px;
+ max-height: 700px;
+ overflow: hidden;
+ position: absolute;
+ border-radius: 10px;
+ background-color: #0080FF;
+ left: 30px;
+ top: 15px;
+ z-index: 6;
+ display: flex;
+ flex-direction: column;
+ .routeHeader {
+ width: 100%;
+ height: 130px;
+ min-height: 130px;
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ .routeLeft {
+ width: 26px;
+ text-align: center;
+ margin: 0 5px;
+ box-sizing: border-box;
+ .mat-icon { font-size: 24px; color: #fff; }
+ }
+ .routeContent {
+ flex: 1;
+ //起点终点 input
+ .routeEveryRow {
+ position: relative;
+ height: 30px;
+ margin: 3px 0;
+ label { position: absolute; color: #fff; }
+ .routeText {
+ font-size: 14px;
+ top: 5.5px;
+ left: 5px;
+ }
+ .routeClear {
+ top: 0px;
+ right: 18px;
+ font-size: 20px;
+ }
+ input {
+ width: 80%;
+ padding-left: 25px;
+ height: 30px;
+ border-radius: 5px;
+ border: none;
+ outline: none;
+ color: #fff;
+ background-color: #0874DE;
+ }
+ }
+ }
+ }
+ //导航内容区
+ .routeCenter::-webkit-scrollbar {
+ display: none; /* Chrome Safari */
+ }
+ .routeCenter {
+ width: 100%;
+ overflow-y: auto;
+ scrollbar-width: none; /* Firefox */
+ box-sizing: border-box;
+ background-color: #fff;
+ border-radius: 0 0 10px 10px;
+ border: 1px solid rgb(201, 197, 197);
+ >div {
+ width: 100%;
+ height: 30px;
+ line-height: 30px;
+ box-sizing: border-box;
+ margin: 5px 0;
+ font-size: 12px;
+ overflow: hidden;
+ text-overflow:ellipsis;
+ white-space: nowrap;
+ } //div
+ >div:not(:first-child){ padding: 0 10px; box-sizing: border-box; }
+ .routeTypeExplain label { margin: 0 10px; }
+ .routeCenterTB {
+ p { display: inline-block; margin-right: 10px; width: 30px; height: 30px; border-radius: 50%; color: #fff; text-align: center; font-size: 14px; }
+ .orientation { color: #0080FF; }
+ }
+ }
+}
+.routeGISPublicIcon { position: absolute; color: #fff; font-size: 14px; } //导航 定位部分公共样式
+//选择路线 方案 button
+.routeType { margin: 0 10px; outline: none; border: none; background-color: transparent; font-size: 14px; font-weight: 550; color: rgb(122, 116, 116); }
+.selectRouteType { color: #0080FF; }
+//右上角div
+.rightTopBox{
+ width: 480px;
+ position: absolute;
+ right: 30px;
+ top: 15px;
+ .topbox{
+ width: 100%;
+ height: 40px;
+ display: flex;
+ justify-content: space-around;
+ background: #FFFFFF;
+ border-radius: 6px;
+ align-items: center;
+ .titleItem{
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ color: #0080FF;
+ height: 100%;
+ img{
+ margin-right: 5px;
+ }
+ span{
+ font-size: 15px;
+ }
+ }
+ .selectedItem{
+ border-bottom: 2px solid #0080FF;
+ }
+ }
+ .contantbox{
+ width: 100%;
+ background: #fff;
+ margin-top: 3px;
+ border-radius: 6px;
+ .keyUnitBox,.waterBox,.coverageBox{
+ box-sizing: border-box;
+ padding:8px 15px;
+ // cursor: default;
+ font-size: 14px;
+ color: #333333;
+ }
+ .inputList{
+ .inputItem{
+ margin-top: 8px;
+ display: flex;
+ flex-wrap: wrap;
+ mat-checkbox{
+ margin-right: 15px;
+ }
+ }
+ .btnbox{
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ button{
+ cursor: pointer;
+ }
+ .submit{
+ width: 68px;
+ height: 30px;
+ text-align: center;
+ border: 0;
+ background: #0080FF;
+ opacity: 1;
+ border-radius: 4px;
+ color: #fff;
+ }
+ .cancel{
+ width: 96px;
+ height: 30px;
+ background: #EEF1F5;
+ opacity: 1;
+ border-radius: 4px;
+ border: 0;
+ color: #333333;
+ }
+ }
+ }
+ .coverageBox{
+
+ .topbox{
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+ .contantbox{
+ display: flex;
+ align-items: center;
+ div{
+ width: 140px;
+ height: 100px;
+ position: relative;
+ margin-right: 16px;
+ border: 2px solid #fff;
+ box-sizing: border-box;
+ img{
+ width: 100%;
+ height: 100%;
+ cursor: pointer;
+ }
+ span{
+ position: absolute;
+ right: 2px;
+ bottom: 2px;
+ display: inline-block;
+ background-color: #0080FF;
+ color: #fff;
+ padding: 0 2px;
+ }
+ }
+ .selectedPattern{
+ border: 4px solid #0080FF;
+ }
+ }
+ }
+ }
+}
-
-
-
-
-
-// .content-window-card {
-// position: relative;
-// box-shadow: none;
-// bottom: 0;
-// left: 0;
-// width: auto;
-// padding: 0;
-// }
-
-// .content-window-card p {
-// height: 20px;
-// }
-
-// .custom-info {
-// border: solid 1px silver;
-// }
-// div.info-top {
-// position: relative;
-// background: none repeat scroll 0 0 #F9F9F9;
-// border-bottom: 1px solid #CCC;
-// border-radius: 5px 5px 0 0;
-// }
-
-// div.info-top div {
-// display: inline-block;
-// color: #333333;
-// font-size: 14px;
-// font-weight: bold;
-// line-height: 31px;
-// padding: 0 10px;
-// }
-
-// div.info-top img {
-// position: absolute;
-// top: 10px;
-// right: 10px;
-// transition-duration: 0.25s;
-// }
-
-// div.info-top img:hover {
-// box-shadow: 0px 0px 5px #000;
-// }
-
-// div.info-middle {
-// font-size: 12px;
-// padding: 10px 6px;
-// line-height: 20px;
-// }
-
-// div.info-bottom {
-// height: 0px;
-// width: 100%;
-// clear: both;
-// text-align: center;
-// }
-
-// div.info-bottom img {
-// position: relative;
-// z-index: 104;
-// }
-
-// span {
-// margin-left: 5px;
-// font-size: 11px;
-// }
-
-// .info-middle img {
-// float: left;
-// margin-right: 6px;
-// }
+//测距离
+.distanceBox{
+ box-sizing: border-box;
+ padding:8px 15px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ div{
+ display: flex;
+ align-items: center;
+ span{
+ cursor: default;
+ }
+ }
+ .clearbutton{
+ border: none;
+ border-radius: 4px;
+ background-color:#FF3636;
+ text-align: center;
+ padding: 8px 20px;
+ margin-left: 20px;
+ margin-top: 5px;
+ font-size: 14px;
+ color: #FFFFFF;
+ outline-color: #FFFFFF;
+ }
+}
diff --git a/src/app/gis-management/gis-labeling/gis-labeling.component.ts b/src/app/gis-management/gis-labeling/gis-labeling.component.ts
index e6420cc..9c0b704 100644
--- a/src/app/gis-management/gis-labeling/gis-labeling.component.ts
+++ b/src/app/gis-management/gis-labeling/gis-labeling.component.ts
@@ -1,5 +1,11 @@
-import { Component, OnInit ,Renderer2,ElementRef } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Component, OnInit ,Renderer2,ElementRef, Inject, NgZone, ViewChild } from '@angular/core';
+import { FormBuilder,FormGroup, FormControl } from '@angular/forms';
+import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';
declare var AMap: any;
+declare var QRCode: any;
+
@Component({
selector: 'app-gis-labeling',
templateUrl: './gis-labeling.component.html',
@@ -7,68 +13,1236 @@ declare var AMap: any;
})
export class GisLabelingComponent implements OnInit {
- constructor(private elementRef: ElementRef,public renderer2: Renderer2) { }
- map:any //地图
+ constructor(private elementRef: ElementRef,public renderer2: Renderer2,private http:HttpClient,public snackBar: MatSnackBar,public dialog: MatDialog,public _ngZone:NgZone,private fb: FormBuilder) { }
+
+ //右上角div
+ selectedTitle:number
+ titleList = [ {name:'重点单位',iconImg:'/assets/images/uniticon.png'},
+ {name:'水源',iconImg:'/assets/images/watericon.png'},
+ {name:'测量工具',iconImg:'/assets/images/distanceicon.png'},
+ /* {name:'测面积',iconImg:'/assets/images/areaicon.png'}, */
+ {name:'图层选择',iconImg:'/assets/images/coverageicon.png'}]
+ keyUnitList:any = []
+ waterList = [
+ {id:'0',name:'消火栓',selected:false},
+ {id:'1',name:'消防水池',selected:false},
+ {id:'2',name:'天然水源',selected:false},
+ // {id:'0',name:'单位地上消火栓',selected:false},
+ // {id:'0',name:'单位地下消火栓',selected:false},
+ // {id:'0',name:'市政地上消火栓',selected:false},
+ // {id:'0',name:'消防水池',selected:false},
+ // {id:'0',name:'方形储水池',selected:false},
+ // {id:'0',name:'蓄水池',selected:false},
+ // {id:'0',name:'原型水塔',selected:false},
+ // {id:'0',name:'水库',selected:false},
+ // {id:'0',name:'消防水箱',selected:false},
+ // {id:'0',name:'码头',selected:false},
+ // {id:'0',name:'海洋',selected:false},
+ // {id:'0',name:'河流',selected:false},
+ // {id:'0',name:'湖泊',selected:false},
+ // {id:'0',name:'沟渠',selected:false}
+ ]
+
+ keyUnitForm : FormGroup//gis右上角重点单位表单
+ watertForm : FormGroup//gis右上角水源表单
+ selectedUnitList:any = []//选择提交的单位
+ selectedWaterList:any = []//选择提交的水源
+ unitAreaDefault:any = '0'//默认单位范围
+ waterAreaDefault:any = '0'//默认水源范围
+ //获得单位循环出来的checkbox列表(formControl实例)
+ get units():any{
+ return this.keyUnitForm.get('units')
+ }
+ get waters():any{
+ return this.watertForm.get('waters')
+ }
+ async getAllBuildingType(){
+ let result = await new Promise((result,reject)=>{
+ this.http.get('/api/BuildingTypes/Simple').subscribe((data:any) => {
+ data.forEach(item => {
+ item.selected = false
+ })
+ this.keyUnitList = data
+ result('获取单位类型')
+ })
+ })
+ }
ngOnInit(): void {
-
- setTimeout(() => {
- this.map = new AMap.Map('map');
- //给地图增加点击事件
- this.map.on('click', (ev)=>{
- // 触发事件的对象
- var target = ev.target;
-
- // 触发事件的地理坐标,AMap.LngLat 类型
- var lnglat = ev.lnglat;
-
- // 触发事件的像素坐标,AMap.Pixel 类型
- var pixel = ev.pixel;
-
- // 触发事件类型
- var type = ev.type;
+ window.setTimeout(()=>{
+ this.mapInit()
+ },0)
+ let buildingType = this.getAllBuildingType()//获取建筑类型
+ Promise.all([buildingType]).then(()=>{
+ this.keyUnitForm = this.fb.group({
+ units:this.buildUnits(),
+ allSelectedUnit:new FormControl(),
+ areaUnit:new FormControl()
+ })
+ this.watertForm = this.fb.group({
+ waters:this.waterUnits(),
+ allSelectedWater:new FormControl(),
+ areaWater:new FormControl()
+ })
+ //将选中的push到数组
+ this.units.valueChanges.subscribe(values => {
+ let selects:string[] = []
+ values.forEach((selected:boolean,i:number) => {
+ selected === true && selects.push(this.keyUnitList[i].id)
+ });
+ this.selectedUnitList = selects
+ })
+ this.waters.valueChanges.subscribe(values => {
+ let selects:string[] = []
+ values.forEach((selected:boolean,i:number) => {
+ selected === true && selects.push(this.waterList[i].id)
+ });
+ this.selectedWaterList = selects
+ })
+ this.unitSelected()
+ })
+ }
- let marker = new AMap.Marker({
- position:[lnglat.lng, lnglat.lat]//位置
+ //构造重点单位checkbox控制器
+ buildUnits() {
+ const arr = this.keyUnitList.map(item => {
+ return this.fb.control(item.selected);
+ });
+ return this.fb.array(arr);
+ }
+ //构造水源checkbox控制器
+ waterUnits() {
+ const arr = this.waterList.map(item => {
+ return this.fb.control(item.selected);
+ });
+ return this.fb.array(arr);
+ }
+ //初始化获取勾选项
+ unitSelected(){
+ this.keyUnitList.forEach(item => {
+ if(item.selected){
+ this.selectedUnitList.push(item.name)
+ }
+ })
+ this.waterList.forEach(item => {
+ if(item.selected){
+ this.selectedWaterList.push(item.name)
+ }
+ })
+ }
+ //地图范围圆圈---重点单位
+ circle = new AMap.Circle({
+ center: null,
+ radius: 0, //半径
+ strokeOpacity: 1,
+ fillOpacity: 0.4,
+ strokeStyle: 'dashed',
+ strokeDasharray: [10, 10],
+ // 线样式还支持 'dashed'
+ fillColor: '#1791fc',
+ zIndex: 50,
+ })
+ //地图范围圆圈---水源
+ circleofwater = new AMap.Circle({
+ center: null,
+ radius: 0, //半径
+ strokeOpacity: 1,
+ fillOpacity: 0.4,
+ strokeStyle: 'dashed',
+ strokeDasharray: [10, 10],
+ // 线样式还支持 'dashed'
+ fillColor: '#ee2200',
+ zIndex: 50,
+ })
+ //重点单位提交
+ ketUnitSubmit(value){
+ if(this.markers.length == 0){
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('请先选择一个单位','确定',config);
+ }else if(!this.mapPattern){
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('请切换2D模式使用此功能','确定',config);
+ }else{
+ console.log('提交',this.selectedUnit)
+ this.circle.setRadius(Number(this.unitAreaDefault))
+ this.circle.setCenter(this.markers[0]._position)
+ this.circle.setMap(this.map)
+ let Distance
+ let lnglat = new AMap.LngLat(this.selectedUnit.location.x, this.selectedUnit.location.y) // lng, lat 替换成传入的坐标
+ if(this.unitAreaDefault == '0'){
+ this.circle.setRadius(this.Calculationofdistance(this.map.getBounds())/2)
+ Distance = Math.abs(lnglat.offset(0, this.Calculationofdistance(this.map.getBounds())/2).lat - this.selectedUnit.location.y)
+ }else{
+ Distance = Math.abs(lnglat.offset(0, this.unitAreaDefault).lat - this.selectedUnit.location.y)
+ }
+
+ let paramsdata:any = {
+ Lon : this.selectedUnit.location.x,
+ Lat : this.selectedUnit.location.y,
+ Distance : Distance,
+ BuildingTypeIdList : this.selectedUnitList.length != 0 ? this.selectedUnitList : ['123']
+ }
+ console.log(666,paramsdata)
+ this.http.get("/api/Companies",{params:paramsdata}).subscribe((data:any) => {
+ data.items.forEach((i,index) => {
+ if(i.id == this.selectedUnit.id){
+ data.items.splice(index,1)
+ }
})
- // marker.content = '我是第' + (i + 1) + '个Marker';
- marker.setMap(this.map)
-
- AMap.event.addListener(marker, 'click', () => {
- infoWindow.open(this.map, marker.getPosition());
- console.log(222,marker)
- setTimeout(() => {
- this.renderer2.listen(this.elementRef.nativeElement.querySelector('#lnglat2container'),'click',(event)=>{
- console.log(111)
- })
- }, 0);
-
+ this.createUnitMarker(data.items)
+ })
+ }
+ }
+ //创建单位markers
+ unitMarkerList:any = []
+ unitlabelsLayer:any
+ createUnitMarker(list){
+ this.unitlabelsLayer ? this.map.remove(this.unitlabelsLayer) : null
+ this.unitMarkerList ? this.map.remove(this.unitMarkerList) : null
+
+ let markerArr = []
+ list.forEach((item) => {
+ let image
+ if(item.buildingTypes[0].name.indexOf('高层') != -1){
+ image = '/assets/images/Highbuilding.png'
+ }else if(item.buildingTypes[0].name.indexOf('化工') != -1){
+ image = '/assets/images/Chemicalindustry.png'
+ }else if(item.buildingTypes[0].name.indexOf('餐饮') != -1){
+ image = '/assets/images/餐饮.png'
+ }else if(item.buildingTypes[0].name.indexOf('厂房') != -1){
+ image = '/assets/images/厂房.png'
+ }else if(item.buildingTypes[0].name.indexOf('储罐') != -1){
+ image = '/assets/images/储罐类.png'
+ }else if(item.buildingTypes[0].name.indexOf('地下') != -1){
+ image = '/assets/images/地下.png'
+ }else if(item.buildingTypes[0].name.indexOf('古建筑') != -1){
+ image = '/assets/images/古建筑.png'
+ }else if(item.buildingTypes[0].name.indexOf('轨道' || '地铁' || '交通') != -1){
+ image = '/assets/images/轨道交通.png'
+ }else if(item.buildingTypes[0].name.indexOf('商场' || '超市') != -1){
+ image = '/assets/images/商场超市.png'
+ }else if(item.buildingTypes[0].name.indexOf('隧道') != -1){
+ image = '/assets/images/隧道.png'
+ }else if(item.buildingTypes[0].name.indexOf('危化品') != -1){
+ image = '/assets/images/危化品.png'
+ }else if(item.buildingTypes[0].name.indexOf('学校' || '教育') != -1){
+ image = '/assets/images/学校.png'
+ }else if(item.buildingTypes[0].name.indexOf('医院' || '医疗') != -1){
+ image = '/assets/images/医院.png'
+ }else if(item.buildingTypes[0].name.indexOf('影' || '剧') != -1){
+ image = '/assets/images/影剧院.png'
+ }else if(item.buildingTypes[0].name.indexOf('娱乐') != -1){
+ image = '/assets/images/娱乐.png'
+ }else if(item.buildingTypes[0].name.indexOf('展览' || '景点' || '景区') != -1){
+ image = '/assets/images/展览建筑.png'
+ }else{
+ image = '/assets/images/其他.png'
+ }
+ var icon = {
+ // 图标类型,现阶段只支持 image 类型
+ type: 'image',
+ // 图片 url
+ image: image,
+ // 图片尺寸
+ size: [32, 32],
+ // 图片相对 position 的锚点,默认为 bottom-center
+ anchor: 'center',
+ };
+ var text = {
+ // 要展示的文字内容
+ content: item.name,
+ // 文字方向,有 icon 时为围绕文字的方向,没有 icon 时,则为相对 position 的位置
+ direction: 'bottom',
+ // 在 direction 基础上的偏移量
+ offset: [-3, -3],
+ // 文字样式
+ style: {
+ // 字体大小
+ fontSize: 12,
+ // 字体颜色
+ fillColor: '#22886f',
+ // 描边颜色
+ strokeColor: '#fff',
+ // 描边宽度
+ strokeWidth: 2,
+ }
+ };
+ var labelMarker = new AMap.LabelMarker({
+ name: item.name, // 此属性非绘制文字内容,仅最为标识使用
+ position: [item.location.x,item.location.y],
+ zIndex: 16,
+ // 将第一步创建的 icon 对象传给 icon 属性
+ icon: icon,
+ // 将第二步创建的 text 对象传给 text 属性
+ text: text,
+ });
+ labelMarker.on('click', (e)=>{
+ console.log(item)
+ let markerContent =
+ ``
+ // 创建一个自定义内容的 infowindow 实例
+ this.infoWindow = new AMap.InfoWindow({
+ position: [item.location.x,item.location.y],
+ offset: new AMap.Pixel(0, -30),
+ content: markerContent,
});
+ this.infoWindow.open(this.map);
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#baseInformation'),'click',(event)=>{ this.baseInformation(item) })//基本信息点击事件
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#route'),'click',(event)=>{ this.route(item) })//导航点击事件
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#fullViewNavigation'),'click',(event)=>{ this.fullViewNavigation(item) })//全景漫游点击事件
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#threeeScene'),'click',(event)=>{ this.threeeScene(item) })//三维场景点击事件
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#seePlan'),'click',(event)=>{ this.seePlan(item) })//查看预案点击事件
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#share'),'click',(event)=>{ this.share(item) })//分享点击事件
+ });
+ markerArr.push(labelMarker)
+ })
+ this.unitlabelsLayer = new AMap.LabelsLayer({
+ zooms: [3, 20],
+ zIndex: 1000,
+ // 该层内标注是否避让
+ collision: false,
+ // 设置 allowCollision:true,可以让标注避让用户的标注
+ // allowCollision: true,
+ });
+ this.unitlabelsLayer.add(markerArr);
+ this.map.add(this.unitlabelsLayer);//增加图层
+ this.unitMarkerList = markerArr
+ this.map.add(this.unitMarkerList);//将markers添加到图层上
+ }
+ //取消单位markers
+ clearUnitMarker(){
+ this.map.remove(this.unitlabelsLayer)
+ this.map.remove(this.unitMarkerList);
+ }
+
+ //水源提交
+ waterSubmit(value){
+ if(this.markers.length == 0){
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('请先选择一个单位','确定',config);
+ }else if(!this.mapPattern){
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('请切换2D模式使用此功能','确定',config);
+ }else{
+ this.createwaterMarker()
+ this.circleofwater.setRadius(Number(this.waterAreaDefault))
+ this.circleofwater.setCenter(this.markers[0]._position)
+ this.circleofwater.setMap(this.map)
+ if(this.waterAreaDefault == '0'){
+ this.circleofwater.setRadius(this.Calculationofdistance(this.map.getBounds())/2)
+ }
+ }
+ }
+ waterIconList = []; //展示的水源图标
+ //循环渲染出所有水源markers
+ createwaterMarker(){
+ this.waterIconList.forEach((element,index) => { this.map.remove(element) }); //先删除所有标点
+ this.waterIconList = []
+ let waterType = this.selectedWaterList //筛选出展示的 水源类型
+ if (waterType.length) {
+ let x = JSON.parse( JSON.stringify(this.markers[0]._position[0]) ) //中心标注的 坐标
+ let y = JSON.parse( JSON.stringify(this.markers[0]._position[1]) ) //中心标注的 坐标
+ let positonList = [0.015, -0.035, 0.045, 0.061, -0.013, 0.029]
+ // 创建一个 Icon
+ let startIcon = new AMap.Icon({
+ image: '../../../assets/images/fireHydrant.png',
+ imageSize: new AMap.Size(32, 32),
});
+ positonList.forEach((item,index)=>{
+ let marker = new AMap.Marker({
+ map: this.map,
+ position: index%2==0? JSON.parse( JSON.stringify([x+item,y-item]) ) : JSON.parse( JSON.stringify([x-item,y+item]) ),
+ icon: startIcon,
+ });
+ this.waterIconList.push(marker)
+ })
+ positonList.forEach((item,index)=>{
+ let marker = new AMap.Marker({
+ map: this.map,
+ position: index%2==0? JSON.parse( JSON.stringify([x+item,y+item]) ) : JSON.parse( JSON.stringify([x-item,y-item]) ),
+ icon: startIcon,
+ });
+ this.waterIconList.push(marker)
+ })
+ } else {
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('请选择水源类型','确定',config);
+ }
+ }
+
+ //计算两地距离
+ Calculationofdistance(bounds){
+ let p1 = [bounds.northEast.lng, bounds.northEast.lat];
+ let p2 = [bounds.northEast.lng, bounds.southWest.lat];
+ // 返回 p1 到 p2 间的地面距离,单位:米
+ let dis = AMap.GeometryUtil.distance(p1, p2);
+ return dis
+ }
+
+ //全选重点单位
+ selectedAllUnit(event){
+ if(event.checked){
+ this.units.controls.forEach(item => {item.setValue(true)})
+ }else{
+ this.keyUnitForm.reset()
+ this.keyUnitForm.controls.areaUnit.setValue('0')
+ }
+ }
+
+ //全选水源
+ selectedAllWater(event){
+ if(event.checked){
+ this.waters.controls.forEach(item => {item.setValue(true)})
+ }else{
+ this.watertForm.reset()
+ this.watertForm.controls.areaWater.setValue('0')
+ }
+ }
+
+ //取消显示单位
+ resetUnit(){
+ this.keyUnitForm.reset()
+ this.keyUnitForm.controls.areaUnit.setValue('0')
+ this.map.remove(this.circle)
+ this.clearUnitMarker()//取消显示单位markers
+ console.log('取消')
+ }
+
+ //取消显示水源
+ resetWater(){
+ this.waterIconList.forEach((element,index) => { this.map.remove(element) }); //先删除所有标点
+ this.waterIconList = []
+ this.watertForm.reset()
+ this.watertForm.controls.areaWater.setValue('0')
+ this.map.remove(this.circleofwater)
+ console.log('取消')
+ }
+
+ //右上角点击每一个title
+ clickTitle(index){
+ this.selectedTitle = index
+ }
+ closertdiv(){
+ this.selectedTitle = null
+ }
+
+ //卫星图层
+ satelliteLayer = new AMap.TileLayer.Satellite();
+ satelliteModel:boolean = false
+ satelliteChange(e){
+ e.checked ? this.map.add(this.satelliteLayer) : this.map.remove(this.satelliteLayer);
+ }
- var infoWindowContent =
- '
' +
- '
故宫博物院 ' +
- '
' +
- '
' +
- '
';
- var infoWindow = new AMap.InfoWindow({
- content: infoWindowContent,
- offset: new AMap.Pixel(0, -45)
+ //路网图层
+ roadNetLayer = new AMap.TileLayer.RoadNet();
+ loadModel:boolean = false
+ loadChange(e){
+ e.checked ? this.map.add(this.roadNetLayer) : this.map.remove(this.roadNetLayer);
+ }
+ // floorLayer = new AMap.Buildings({
+ // zooms: [16, 18],
+ // zIndex: 10,
+ // heightFactor: 2 //2倍于默认高度,3D下有效
+ // })
+ //楼层图层
+ // floorChange(e){
+ // e.checked ? this.map.add(this.floorLayer) : this.map.remove(this.floorLayer);
+ // }
+
+ @ViewChild( 'appLeft',{static: false} ) appLeft:any //子组件
+ leftDivState:boolean = false; //左侧工作区显示隐藏
+ showLeftDiv:boolean = false//左侧工作区消失
+
+ //左侧工作区显示隐藏
+ toggleLeft (e) {
+ this.leftDivState = e
+ }
+
+ //左侧工作区关闭
+ closeDiv(){
+ this.leftDivState = false
+ this.showLeftDiv = false
+ }
+
+ map:any //地图
+ markers:any = []; //markers标注
+
+ //地图2D 3D切换
+ mapPattern:boolean = true//默认是2D
+ mapPatternChange(type){
+ if(type == '2D'){
+ this.mapPattern = true
+ var layer = new AMap.createDefaultLayer({
+ zooms:[3,20], //可见级别
+ visible:true, //是否可见
+ opacity:1, //透明度
+ zIndex:0, //叠加层级
+ resizeEnable: true //是否监控地图容器尺寸变化,
+ })
+ this.map = new AMap.Map('map',{
+ layers:[layer], //当只想显示标准图层时layers属性可缺省,
});
+ }else{
+ this.mapPattern = false
+ this.map = new AMap.Map('map',{
+ viewMode: '3D',
+ pitch: 60,
+ rotation: -35,
+ features: ['bg', 'road', 'point','building'],
+ mapStyle: 'amap://styles/light',
+ });
+ }
+ this.satelliteModel = false
+ this.loadModel = false
+ }
+
+ //地图初始化
+ mapInit () {
+ let that = this
+ var layer = new AMap.createDefaultLayer({
+ zooms:[3,20], //可见级别
+ visible:true, //是否可见
+ opacity:1, //透明度
+ zIndex:0, //叠加层级
+ resizeEnable: true //是否监控地图容器尺寸变化,
+ })
+ that.map = new AMap.Map('map',{
+ layers:[layer], //当只想显示标准图层时layers属性可缺省,
+ });
+
+ AMap.plugin(["AMap.RangingTool", "AMap.MouseTool"],function () {
+ that.mouseTool=new AMap.MouseTool(that.map);
+ /* that.measureDistance = new AMap.RangingTool(that.map, rulerOptions); //测距离
+ that.measureArea = new AMap.MouseTool(that.map); //侧面积 */
+ /* that.measureDistance.on('addnode',function(e){ //监听测距离 标点事件
+ that.distanceList.push(e.marker)
+ })
+ that.measureDistance.on('end',function(e){ //监听测距离 连线事件
+ that.distanceList.push(e.polyline)
+ }) */
+ /* that.mouseTool.on("rightclick",function(e){
+ if(this.mouseTool.eventsList[1]==undefined){
+ alert("000")
+ }
+ }) */
+ });
+
+ }
+
+ searchText:string; //搜索单位名称
+ allCompany = []; //搜索到 匹配的单位
+
+ measureDistance; //测距离
+ distanceList = []; //测距离 点和线
+ measureArea; //测面积
+ mouseTool;//二合一测距和侧面积
+ checkRadio=false //判断测距和侧面积是否选中
+
+ //测距离 开始
+ startDistance(){
+ this.measureArea.close(false)
+ this.measureDistance.turnOn()
+ }
+
+ //侧面积 开始
+ startArea(){
+ this.measureDistance.turnOff()
+ this.measureArea.measureArea({
+ strokeColor:'#80d8ff',
+ fillColor:'#80d8ff',
+ fillOpacity:0.3
+ //同 Polygon 的 Option 设置
+ });
+ }
+
+ //清空距离测量
+ clearDistance(){
+ this.distanceList.forEach(item=>{
+ if (item.className == 'AMap.Marker') {
+ let parent = item.dom.parentNode
+ let children = item.dom.nextElementSibling
+ parent && children? parent.removeChild(item.dom.nextElementSibling) : null
+ this.map.remove(item)
+ } else {
+ this.map.remove(item)
+ }
+ })
+ this.distanceList = [] //清空数组
+ }
+
+ //清空面积测量
+ clearArea(){
+ this.measureArea.close(true)
+ }
+ //合并测距和侧面积
+ measure(type){
+ switch(type){
+ case 'rule':{
+ this.mouseTool.rule({
+ startMarkerOptions : {//可缺省
+ icon: new AMap.Icon({
+ size: new AMap.Size(19, 31),//图标大小
+ imageSize:new AMap.Size(19, 31),
+ image: "https://webapi.amap.com/theme/v1.3/markers/b/start.png"
+ })
+ },
+ endMarkerOptions : {//可缺省
+ icon: new AMap.Icon({
+ size: new AMap.Size(19, 31),//图标大小
+ imageSize:new AMap.Size(19, 31),
+ image: "https://webapi.amap.com/theme/v1.3/markers/b/end.png"
+ }),
+ offset: new AMap.Pixel(-9, -31)
+ },
+ midMarkerOptions : {//可缺省
+ icon: new AMap.Icon({
+ size: new AMap.Size(19, 31),//图标大小
+ imageSize:new AMap.Size(19, 31),
+ image: "https://webapi.amap.com/theme/v1.3/markers/b/mid.png"
+ }),
+ offset: new AMap.Pixel(-9, -31)
+ },
+ lineOptions : {//可缺省
+ strokeStyle: "solid",
+ strokeColor: "#FF33FF",
+ strokeOpacity: 1,
+ strokeWeight: 2
+ }
+ //同 RangingTool 的 自定义 设置,缺省为默认样式
+ });
+ break;
+ }
+ case 'measureArea':{
+ this.mouseTool.measureArea({
+ strokeColor:'#80d8ff',
+ fillColor:'#80d8ff',
+ fillOpacity:0.3
+ //同 Polygon 的 Option 设置
+ });
+ break;
+ }
+ }
+ }
+ //合并清空
+ clearnAll(){
+ this.mouseTool.close(true)
+ this.checkRadio=false
+ }
+
+ //搜索
+ search () {
+ this.allCompany = []
+ let paramsdata:any = {Name: this.searchText || ''}
+ this.http.get("/api/Companies",{params:paramsdata}).subscribe((data:any)=>{
+ this.allCompany = data.items
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open(`搜索目标结果为${data.items.length}个`,'确定',config);
+ })
+ }
+
+ //清除
+ clear () {
+ this.allCompany = []
+ this.searchText = ''
+ }
+
+ selectedUnit:any//当前打开的单位
+
+ //选择 单位 地图跳转
+ //弹窗实例
+ infoWindow:any
+ selectCompany (e) {
+ if (e.location && e.location.x && e.location.y) {
+ this.selectedUnit = e
+ this.markers.forEach((element,index) => { this.map.remove(element);}); //先删除所有标点
+ this.markers = []
+
+ let marker = new AMap.Marker({
+ map: this.map,
+ position: [e.location.x,e.location.y], // 基点位置,
+ });
+ this.markers.push(marker)
+
+ let markerContent = ``
+ // 创建一个自定义内容的 infowindow 实例
+ this.infoWindow = new AMap.InfoWindow({
+ position: [e.location.x,e.location.y],
+ offset: new AMap.Pixel(0, -30),
+ content: markerContent,
+ });
+ this.infoWindow.open(this.map);
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#baseInformation'),'click',(event)=>{ this.baseInformation(e) })//基本信息点击事件
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#route'),'click',(event)=>{ this.route(e) })//导航点击事件
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#fullViewNavigation'),'click',(event)=>{ this.fullViewNavigation(e) })//全景漫游点击事件
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#threeeScene'),'click',(event)=>{ this.threeeScene(e) })//三维场景点击事件
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#seePlan'),'click',(event)=>{ this.seePlan(e) })//查看预案点击事件
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#share'),'click',(event)=>{ this.share(e) })//分享点击事件
+ marker.on('click', (ev) => { //marker点击事件
+ this.infoWindow = new AMap.InfoWindow({
+ position: [e.location.x,e.location.y],
+ offset: new AMap.Pixel(0, -30),
+ content: markerContent,
+ });
+ this.infoWindow.open(this.map);
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#baseInformation'),'click',(event)=>{ this.baseInformation(e) })//基本信息点击事件
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#route'),'click',(event)=>{ this.route(e) })//导航点击事件
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#fullViewNavigation'),'click',(event)=>{ this.fullViewNavigation(e) })//全景漫游点击事件
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#threeeScene'),'click',(event)=>{ this.threeeScene(e) })//三维场景点击事件
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#seePlan'),'click',(event)=>{ this.seePlan(e) })//查看预案点击事件
+ this.renderer2.listen(this.elementRef.nativeElement.querySelector('#share'),'click',(event)=>{ this.share(e) })//分享点击事件
+ })
+
+ this.map.setZoomAndCenter(13,marker._position); //设置地图中心点
+ this.allCompany = []
+ } else {
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('请完善单位地理位置','确定',config);
+ }
+ }
+
+ //基本信息
+ baseInformation (e) {
+ this.leftDivState = true
+ this.showLeftDiv = true
+ this.appLeft.selectBaseInfo(e) //调用子组件方法
+ }
+
+ //导航
+ route (e) {
+ this.leftDivState = false
+ this.showLeftDiv = false
+ this.isShowRouteGIS = true
+ }
+
+ //全景漫游
+ fullViewNavigation (e) {
+ console.log(e,'全景漫游')
+ }
- // var xxx = this.el.nativeElement.querySelector('#lnglat2container')
- let yyy = document.getElementById('lnglat2container');
+ //三维场景
+ threeeScene (e) {
+ window.open('http://121.37.20.190:8088/%5B%E7%BD%91%E9%A1%B5%E7%89%88%5D%E8%B4%B5%E6%B8%AF%E6%B2%B9%E5%BA%93%E4%B8%89%E7%BB%B4%E7%81%AD%E7%81%AB%E9%A2%84%E6%A1%88/')
+ }
+
+ //查看预案
+ seePlan (e) {
+ let data = e
+ let dialogRef = this.dialog.open(LookPlanDialog,{//调用open方法打开对话框并且携带参数过去
+ width: '1400px',
+ height:'800px',
+ id:'lookPlanDialog',
+ data
+ });
+ dialogRef.afterClosed().subscribe((data)=>{
+
+ });
+ }
+
+ //分享
+ share (e) {
+ let data = {
+ url:'https://www.baidu.com/',
+ buildingType:e.buildingTypes[0].name,
+ address:e.address
+ }
+ let dialogRef = this.dialog.open(ShareUrlDialog,{//调用open方法打开对话框并且携带参数过去
+ width: '540px',
+ height:'596px',
+ id:'shareDialog',
+ data});
+ dialogRef.afterClosed().subscribe((data)=>{
+
+ });
+ }
- }, 0);
+ //导航路线
+ isShowRouteGIS:boolean = false; //导航路线 显隐
+ routeStart:any; //起点
+ routeStartList:any = [] //起点 搜索结果
+ routeEnd:any; //终点
+ routeEndList:any = [] //终点 搜索结果
+ timeout:any; //延时器
+ routeGIS:any; //查询结果 规划路线
+ selectType:boolean = true; //路线选择 推荐方案/躲避用拥堵
+
+ //关闭导航路线
+ closeRouteGIS () {
+ this.isShowRouteGIS = false
+ }
+
+ //输入框 输入事件
+ routeChange (e) {
+ let that = this
+ window.clearTimeout(this.timeout)
+ this.timeout = window.setTimeout(()=>{
+
+ that.map.getCity( function(info){ //获取当前 city
+ AMap.plugin(['AMap.AutoComplete'], () =>{
+ var autoOptions = {city: info.city}
+ let keywords
+ e == 0 ? keywords = that.routeStart : keywords = that.routeEnd
+ var autoComplete = new AMap.Autocomplete(autoOptions);
+ autoComplete.search(keywords, function(status, result) {
+ if (result && result.tips && result.tips.length) { //搜索到数据时
+
+ that._ngZone.run(()=>{ e == 0 ? that.routeStartList = result.tips : that.routeEndList = result.tips });
+
+ }
+ })
+ })
+ }); //获取当前 city
+
+ },500)
+ }
+
+ //清空导航输入框
+ deleteSearchGIS (e) {
+ if (e==0) {
+ this.routeStart = null
+ this.routeStartList = []
+ } else {
+ this.routeEnd = null
+ this.routeEndList = []
+ }
+ }
+
+ //清除路线
+ clearGISRoute () {
+ this.routeStart = null
+ this.routeStartList = []
+ this.routeEnd = null
+ this.routeEndList = []
+ this.routeGIS? this.routeGIS.clear() : null
+ this.routes = { distance: 0, time: 0, steps: [], }
+ console.log(this.selectedUnit)
+ this.map.setZoomAndCenter(13,[this.selectedUnit.location.x,this.selectedUnit.location.y]); //设置地图中心点
}
- getLngLat(){
- console.log(123)
+ //交换起始点
+ exchangeGISRoute () {
+ let data = this.routeStart
+ this.routeStart = this.routeEnd
+ this.routeEnd = data
+ this.routeStartList = []
+ this.routeEndList = []
+ }
+
+ routes:any = { distance: 0, time: 0, steps: [], };//导航查询结果 路线规划
+ //导航查询
+ queryGISRoute () {
+ //构造路线导航类
+ let that = this
+ this.selectType = true
+ this.routeGIS? this.routeGIS.clear() : null
+ this.routeGIS = new AMap.Driving({
+ map: this.map,
+ });
+ // 根据起终点名称规划驾车导航路线
+ this.routeGIS.search([{keyword: this.routeStart},{keyword: this.routeEnd}],
+ function(status, result) {
+ if (status === 'complete') {
+ that.routes = result.routes[0]
+ } else { alert('获取驾驶规划路线失败') }
+ }
+ );
+ }
+
+ //切换 导航模式 推荐方案/躲避拥堵
+ toggleRoute (e) {
+ let that = this
+ if (this.selectType != e) {
+ this.selectType = e
+ this.routeGIS? this.routeGIS.clear() : null
+ this.routeGIS = new AMap.Driving({
+ map: this.map,
+ policy: e==true? AMap.DrivingPolicy.LEAST_TIME : AMap.DrivingPolicy.REAL_TRAFFIC
+ });
+ // 根据起终点名称规划驾车导航路线
+ this.routeGIS.search([{keyword: this.routeStart},{keyword: this.routeEnd}],
+ function(status, result) {
+ if (status === 'complete') {
+ that.routes = result.routes[0]
+ } else { alert('获取驾驶规划路线失败') }
+ }
+ );
+ }
+ }
+
+
+
+}
+
+
+
+//分享
+@Component({
+ selector: 'shareUrl-dialog',
+ templateUrl: './shareUrl.html',
+ styleUrls: ['./shareUrl.scss']
+})
+export class ShareUrlDialog {
+
+ constructor(public http: HttpClient,public snackBar: MatSnackBar,
+ public dialogRef: MatDialogRef
,
+ @Inject(MAT_DIALOG_DATA) public data,private render2: Renderer2) {}
+
+ selectetime:any = [{id:0,name:'今日有效'},{id:1,name:'本周有效'},{id:2,name:'本月有效'},{id:3,name:'仅一次有效'}]
+ selectedTimeIndex = 0
+ ngOnInit() {
+ this.makeCode()
+ }
+ //生成二维码
+ qrCode
+ makeCode () {
+ this.qrCode = new QRCode(document.getElementById("qrcode"),{
+ text: this.data.url,
+ width: 200,
+ height: 200,
+ colorDark : "#000000",
+ colorLight : "#ffffff",
+ correctLevel : QRCode.CorrectLevel.H
+ });
+ }
+ //下载二维码
+ downloadFile () {
+ let canvas = this.qrCode._el.querySelector("canvas")
+ var base64Text = canvas.toDataURL("image/png");
+ let url = base64Text //createObjectURL创建一个下载Blob的url地址
+ let link = document.createElement("a");
+ link.style.display = "none";
+ link.href = url;
+ link.setAttribute("download", '二维码');
+ document.body.appendChild(link);
+ link.click();
+ }
+ //复制链接
+ copyUrl(){
+ var copyTest = this.data.url
+ var inputTest = document.createElement('input')
+ inputTest.value = copyTest
+ document.body.appendChild(inputTest)
+ inputTest.select()
+ document.execCommand('Copy')
+ inputTest.className = 'oInput'
+ inputTest.style.display = 'none'
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('复制链接成功','确定',config);
+ }
+ selectedTime(index){
+ if(this.selectedTimeIndex != index){
+ this.selectedTimeIndex = index
+ this.qrCode.clear();
+ if(index == 0){//如果今日有效
+ console.log("今日")
+ }
+ if(index == 1){//如果本周有效
+ console.log("本周")
+ this.qrCode.makeCode("http://www.w3cschool.cc")
+ }
+ if(index == 2){//如果本月有效
+ console.log("本月")
+ }
+ if(index == 3){//如果仅一次有效
+ console.log("一次")
+ }
+ }
+ }
+ //关闭
+ closeDiv(){
+ this.dialogRef.close()
}
}
+
+
+
+//查看预案
+@Component({
+ selector: 'lookPlan-dialog',
+ templateUrl: './lookPlan.html',
+ styleUrls: ['./lookPlan.scss']
+})
+export class LookPlanDialog {
+
+ constructor(public http: HttpClient,public snackBar: MatSnackBar,
+ public dialogRef: MatDialogRef,
+ @Inject(MAT_DIALOG_DATA) public data,private render2: Renderer2,public dialog: MatDialog) {}
+
+
+ ngOnInit() {
+ console.log(this.data)
+ this.getAllPlans()
+ }
+ //关闭弹窗
+ closeDiv(){
+ this.dialogRef.close()
+ }
+ //查看单位详情
+ lookUnitDetails(){
+ window.open(`/keyUnit/viewunitinfo?id=${this.data.id}`)
+ }
+ //获得所有预案组件
+ allPlanComponents:any//所有预案组件
+ getAllPlans(){
+ let paramsData:any = {
+ companyId:this.data.id,
+ pageNumber: 1,
+ pageSize: "100",
+ sort: ""
+ }
+ this.http.get("/api/PlanComponents",{params:paramsData}).subscribe((data:any)=>{
+ this.allPlanComponents = data.items
+ console.log(this.allPlanComponents)
+ })
+ }
+ //查看预案
+ lookPlan(e){
+ if(e.planMode == 0){
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('本地文件,请下载查看','确定',config);
+ }
+ if(e.planMode == 1){
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('查看导入word文件','确定',config);
+ }
+ if(e.planMode == 2){ //如果是在线编辑
+ let id = e.id
+ sessionStorage.setItem("planId",id)
+ sessionStorage.setItem("companyId",this.data.id)
+ sessionStorage.setItem("buildingTypeId",this.data.buildingTypes[0].id)
+ sessionStorage.setItem("editable","0")
+ sessionStorage.setItem("planName",e.name)
+ let companyId = sessionStorage.getItem("companyId")
+ window.open(`/keyUnit/viewunitinfoplan?id=${companyId}`);
+ }
+ if(e.planMode == 3){ //如果是跳转网页
+ sessionStorage.setItem("url",e.url)
+ window.open(`/planManagement/webLook`)
+ }
+ }
+
+ //点击下载
+ readFile(element){
+ this.uploadFileLonging = element
+ let data =element
+ const dialogRef = this.dialog.open(DownloadFile, {
+ width:"435px",
+ data
+ });
+ dialogRef.afterClosed().subscribe(
+ data=>{
+ if(data){
+ console.log(123,data)
+ this.downloadFileName = data.fileName
+ this.download = data
+ this.downloadFile()
+ }
+ }
+ );
+ }
+
+ //下载↓
+ selectDownloadFile:any; //选择下载的文件
+ download:any; //下载文件元数据
+ downloadFileName:any //下载文件的文件名
+ downloadisLoading:boolean = false; //进度条loading是否加载
+ downloadProgress:number = 0; //进度条进度
+
+ uploadFileLonging:any
+ downloadFile(){
+ this.downloadProgress = 0
+ let file = this.download
+ let fileSize = file.fileLength//下载文件的总大小
+ let shardSize = 10 * 1024 * 1024 //文件大小是否大于10MB
+
+ if (file && fileSize<=shardSize) { //<=10MB时直接下载
+ this.downloadisLoading = true
+ this.http.get(`/api/Objects/PlanPlatform/${file.objectName}`,{responseType: 'blob'},).subscribe(data=>{
+ let url = window.URL.createObjectURL(new Blob([data])); //createObjectURL创建一个下载Blob的url地址
+ let link = document.createElement("a");
+ link.style.display = "none";
+ link.href = url;
+ let suffix = file.objectName.substring(file.objectName.lastIndexOf(".")+1,file.objectName.length) ;
+ link.setAttribute("download", file.fileName ? file.fileName : this.data.name + "-" +this.uploadFileLonging.name + "." + suffix);
+ document.body.appendChild(link);
+ link.click();
+ this.downloadisLoading = false
+ })
+ } else if (file && fileSize > shardSize) { //>10MB时分块下载
+ this.blockingDownload() //分段下载
+ this.downloadisLoading = true
+ }
+ }
+ //分段下载并合并
+ async blockingDownload () {
+ let file = this.download
+ let fileSize = file.fileLength //下载文件的总大小
+ let shardSize = 3 * 1024 * 1024 //3MB一个分片
+ let allSlice = Math.ceil(fileSize / shardSize) //总文件/3MB===共分多少段
+ let allFile:any = [] //所有的file分段
+
+ for (let i=0;i{
+ this.http.get(`/api/Objects/PlanPlatform/${file.objectName}`,{headers:{'range':`bytes= ${start}-${end}`},responseType:'blob'}).subscribe(data=>{
+ result(data) })
+ })
+ allFile.push(result)
+
+
+
+ if (allFile.length === allSlice) { //合并文件输出给浏览器
+ let url = window.URL.createObjectURL(new Blob(allFile)); //createObjectURL创建一个下载Blob的url地址
+ let link = document.createElement("a");
+ link.style.display = "none";
+ link.href = url;
+ let suffix = file.objectName.substring(file.objectName.lastIndexOf(".")+1,file.objectName.length) ;
+ link.setAttribute("download", file.fileName ? file.fileName : this.data.unitname + "-" +this.uploadFileLonging.name + "." + suffix);
+ document.body.appendChild(link);
+ link.click();
+ this.downloadisLoading = false
+ }
+
+ } //for循环
+
+ }
+
+ //取消分块下载
+ cancelDowload () {
+ }
+}
+
+
+
+//下载文件弹出框
+@Component({
+ selector: 'downloadfile',
+ templateUrl: './downloadFile.html',
+ styleUrls: ['./downloadFile.scss']
+})
+export class DownloadFile {
+
+ constructor(private http: HttpClient,public dialogRef: MatDialogRef,@Inject(MAT_DIALOG_DATA) public data,public snackBar: MatSnackBar) {}
+ name:any //如果真实姓名为空时
+ fileUrls:any //当前预案附件地址数组
+ fileDatas:any = [] //用于循环的数组
+ selectedFileIndex : any = 0
+ selectedFileData : any
+
+ ngOnInit(): void {
+ console.log(this.data)
+ this.name = this.data.name
+ this.fileUrls = this.data.attachmentUrls
+ this.fileUrls.forEach(item=>{
+ this.http.get('/api/ObjectMetadata/PlanPlatform/'+item).subscribe((data:any)=>{
+ data.filePige = (data.fileLength / (1024*1024)).toFixed(2)
+ this.fileDatas.push(data)
+ this.selectedFileData = data
+ })
+ })
+
+ }
+
+ //取消
+ onNoClick(): void {
+ this.dialogRef.close();
+ }
+ //确定
+ confirm(){
+ this.dialogRef.close(this.selectedFileData);
+ }
+
+ //点击想要下载的文件
+ addurl(item,key){
+ console.log(item,key)
+ this.selectedFileIndex = key
+ this.selectedFileData = item
+ }
+}
\ No newline at end of file
diff --git a/src/app/gis-management/gis-labeling/lookPlan.html b/src/app/gis-management/gis-labeling/lookPlan.html
new file mode 100644
index 0000000..c9c0ad9
--- /dev/null
+++ b/src/app/gis-management/gis-labeling/lookPlan.html
@@ -0,0 +1,53 @@
+
+
+ {{data.name}}预案
+ clear
+
+
+
+
+ 单位名称: {{data.name}}
+ 辖区中队: {{data.organizationName}}
+ 单位类型: {{data.buildingTypes[0].name}}
+ 单位地址: {{data.address}}
+
+
+ 查看详情
+
+
+
+
+
+ 预案名称
+ 添加人
+ 修改时间
+ 预案类型
+ 审核状态
+ 是否公开
+ 编制级别
+ 操作
+
+
+ {{item.name}}
+ {{item.creatorName}}
+ {{item.modifiedTime | date:'yyyy-MM-dd'}}
+ {{item.planType | plantype}}
+ {{item.auditStatus | auditsatus}}
+ {{item.openRange}}
+ {{item.planLevel | planlevel}}
+
+ 查看
+ 下载
+
+
+
+
+
+
+
+
+ {{downloadFileName}}
+ 下载中...
+
+
+
\ No newline at end of file
diff --git a/src/app/gis-management/gis-labeling/lookPlan.scss b/src/app/gis-management/gis-labeling/lookPlan.scss
new file mode 100644
index 0000000..c9936e4
--- /dev/null
+++ b/src/app/gis-management/gis-labeling/lookPlan.scss
@@ -0,0 +1,123 @@
+// table,table tr th, table tr td { border: 1px solid #EEF1F5; }
+table { text-align: center; border-collapse: collapse; padding:2px;}
+*{
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.box{
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ height: 100%;
+ cursor: default;
+
+}
+
+.title{
+ width: 100%;
+ height: 48px;
+ line-height: 48px;
+ text-align: center;
+ background: #0080FF;
+ font-size: 18px;
+ color: #ffffff;
+ position: relative;
+ .closeicon{
+ position: absolute;
+ right: 12px;
+ top: 4px;
+ cursor: pointer;
+ }
+}
+.contant{
+ flex: 1;
+ box-sizing: border-box;
+ padding: 20px 50px;
+ border: 1px solid gray;
+ .topbox{
+ display: flex;
+ margin-bottom: 20px;
+ .unitinfo{
+ width: 92%;
+ overflow: hidden;
+ text-overflow:ellipsis;
+ white-space: nowrap;
+ span{
+ margin-right: 50px;
+ font-size: 15px;
+ }
+ }
+ .btnbox{
+ width: 8%;
+ .btn{
+ color: #0080FF;
+ font-size: 15px;
+ cursor: pointer;
+ }
+
+ }
+ }
+ .tablebox{
+ table{
+ table-layout:fixed;
+ width: 100%;
+ font-size: 15px;
+ tr{
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ min-height: 36px;
+ td{
+ flex: 1;
+ }
+ }
+ tr:nth-child(odd){
+ background: #F2F9FF;
+ }
+ .btn{
+ font-size: 15px;
+ color: #0080FF;
+ margin: 0 5px;
+ cursor: pointer;
+ }
+ .grey{
+ color: grey;
+ pointer-events: none;
+ }
+ }
+ }
+}
+//进度条
+.progressBox{
+ line-height: 49px;
+ height: 49px;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ display: inline-block;
+ width: 100%;
+ button{
+ float: right;
+ }
+ .progress{
+ display: inline-block;
+ position: absolute;
+ width: 500px;
+ top: 23px;
+ left: 220px;
+ }
+ .filename{
+ display: inline-block;
+ width: 80px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+
+}
\ No newline at end of file
diff --git a/src/app/gis-management/gis-labeling/shareUrl.html b/src/app/gis-management/gis-labeling/shareUrl.html
new file mode 100644
index 0000000..2c9d6dc
--- /dev/null
+++ b/src/app/gis-management/gis-labeling/shareUrl.html
@@ -0,0 +1,32 @@
+
+
+ 分享
+ clear
+
+
+
+
{{data.buildingType}}
+
{{data.address}}
+
+
+
+
+ 保存图片
+
+
+
+
+ 【安信科创】为您分享了{{data.buildingType}} 的信息,您可复制下面的网址在浏览器中打开查看,该网址【今日有效】
+
+
+ {{data.url}}
+
+
+ 复制链接
+
+
+
\ No newline at end of file
diff --git a/src/app/gis-management/gis-labeling/shareUrl.scss b/src/app/gis-management/gis-labeling/shareUrl.scss
new file mode 100644
index 0000000..bec775b
--- /dev/null
+++ b/src/app/gis-management/gis-labeling/shareUrl.scss
@@ -0,0 +1,127 @@
+//头部title
+.title{
+ width: 100%;
+ height: 42px;
+ line-height: 42px;
+ background: #0080FF;
+ text-align: center;
+ position: relative;
+ .name{
+ font-size: 20px;
+ font-family: Source Han Sans CN;
+ font-weight: 400;
+ color: #FFFFFF;
+ }
+ .close{
+ position: absolute;
+ right: 12px;
+ top: 6px;
+ color: #fff;
+ cursor: pointer;
+ }
+}
+.mat-dialog-container{
+ padding: 0;
+}
+//有效时间选择
+.selectTime{
+ margin: 18px 0;
+ display: flex;
+ justify-content: center;
+ .divitembox{
+ display: flex;
+ }
+ .divitem{
+ width: 100px;
+ height: 36px;
+ line-height: 36px;
+ background: #EEF1F5;
+ font-size: 16px;
+ font-family: Source Han Sans CN;
+ font-weight: 400;
+ color: #333333;
+ opacity: 0.4;
+ text-align: center;
+ cursor: pointer;
+ }
+ .divitem:first-child{
+ border-radius: 4px 0px 0px 4px;
+ }
+ .divitem:last-child{
+ border-radius: 0px 4px 4px 0px;
+ }
+ .selectedtime{
+ background: #0080FF;
+ opacity: 1;
+ color: #FFFFFF;
+ }
+}
+//二维码区域
+.qrcodebox{
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ .p1{
+ font-size: 16px;
+ color: #0080FF;
+ }
+ .p2{
+ font-size: 14px;
+ color: #333333;
+ opacity: 0.4;
+ margin: 5px 0 18px 0;
+ }
+ .qrcodeimg{
+ width: 200px;
+ height: 200px;
+ }
+ .saveqrcode{
+ width: 96px;
+ height: 30px;
+ background: #0080FF;
+ line-height: 30px;
+ border-radius: 4px;
+ margin: 18px 0;
+ color: #FFFFFF;
+ text-align: center;
+ font-size: 14px;
+ cursor: pointer;
+ }
+
+}
+//链接区域
+.urlbox{
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ p{
+ width: 500px;
+ font-size: 12px;
+ }
+ .urldiv{
+ display: block;
+ font-size: 10px;
+ width: 500px;
+ background: #EEF1F5;
+ border-radius: 4px;
+ padding: 3px;
+ box-sizing: border-box;
+ margin: 15px 0;
+ word-wrap: break-word;
+ word-break: normal;
+ white-space:normal
+ }
+ .saveqrcode{
+ width: 96px;
+ height: 30px;
+ background: #0080FF;
+ line-height: 30px;
+ border-radius: 4px;
+ color: #FFFFFF;
+ text-align: center;
+ font-size: 14px;
+ cursor: pointer;
+ }
+}
diff --git a/src/app/gis-management/gis-management-routing.module.ts b/src/app/gis-management/gis-management-routing.module.ts
index 599381e..ec23f61 100644
--- a/src/app/gis-management/gis-management-routing.module.ts
+++ b/src/app/gis-management/gis-management-routing.module.ts
@@ -3,10 +3,13 @@ import { Routes, RouterModule } from '@angular/router';
import { GisLabelingComponent } from './gis-labeling/gis-labeling.component';
+
const routes: Routes = [
{ path: '', component: GisLabelingComponent },
];
+
+
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
diff --git a/src/app/gis-management/gis-management.module.ts b/src/app/gis-management/gis-management.module.ts
index 11bbefe..18a5f5b 100644
--- a/src/app/gis-management/gis-management.module.ts
+++ b/src/app/gis-management/gis-management.module.ts
@@ -1,7 +1,6 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
-import { GisLabelingComponent } from './gis-labeling/gis-labeling.component';
-
+import { DownloadFile, GisLabelingComponent, LookPlanDialog, ShareUrlDialog } from './gis-labeling/gis-labeling.component';
import {A11yModule} from '@angular/cdk/a11y';
import {DragDropModule} from '@angular/cdk/drag-drop';
import {PortalModule} from '@angular/cdk/portal';
@@ -43,58 +42,80 @@ import {MatTabsModule} from '@angular/material/tabs';
import {MatToolbarModule} from '@angular/material/toolbar';
import {MatTooltipModule} from '@angular/material/tooltip';
import {MatTreeModule} from '@angular/material/tree';
-import { FormsModule } from '@angular/forms';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { GisRoutingModule } from './gis-management-routing.module';
+import { LeftWorkingComponent } from './left-working/left-working.component';
+import { BasicInfoComponent } from './basic-info/basic-info.component';
+import { FunctionPartitionComponent } from './function-partition/function-partition.component';
+import { FireFacilitiesComponent } from './fire-facilities/fire-facilities.component';
+import {ImagesData2}from './fire-facilities/imagesdata.component'
+import {AllaroundComponent} from './allaround/allaround.component'
+import {ImgDetails}from './allaround/imgdetails.component';
+import {KeySiteLookComponent} from './key-site-look/key-site.component'
+import {KeySiteImgs2}from './key-site-look/keysiteimgs.component'
+import {RealisticPictureLookComponent} from './realistic-picture-look/realistic-picture.component'
+import {previewImg3} from './realistic-picture-look/realistic-picture.component'
+import { OpenPlanToolDialog, PlanListComponent } from './plan-list/plan-list.component';
+import { PlanManagementModule } from '../plan-management/plan-management.module';
+import { UiModule } from '../ui/ui.module';
+import { CadDrawComponent } from './cad-draw/cad-draw.component';
+import {previewBigImg2} from './fire-facilities/imagesdata.component'
@NgModule({
- declarations: [GisLabelingComponent],
- imports: [
- CommonModule,
- CommonModule,
- GisRoutingModule,
- A11yModule,
- CdkStepperModule,
- CdkTableModule,
- CdkTreeModule,
- DragDropModule,
- MatAutocompleteModule,
- MatBadgeModule,
- MatBottomSheetModule,
- MatButtonModule,
- MatButtonToggleModule,
- MatCardModule,
- MatCheckboxModule,
- MatChipsModule,
- MatStepperModule,
- MatDatepickerModule,
- MatDialogModule,
- MatDividerModule,
- MatExpansionModule,
- MatGridListModule,
- MatIconModule,
- MatInputModule,
- MatListModule,
- MatMenuModule,
- MatNativeDateModule,
- MatPaginatorModule,
- MatProgressBarModule,
- MatProgressSpinnerModule,
- MatRadioModule,
- MatRippleModule,
- MatSelectModule,
- MatSidenavModule,
- MatSliderModule,
- MatSlideToggleModule,
- MatSnackBarModule,
- MatSortModule,
- MatTableModule,
- MatTabsModule,
- MatToolbarModule,
- MatTooltipModule,
- MatTreeModule,
- PortalModule,
- ScrollingModule,
- FormsModule
- ]
+ declarations: [GisLabelingComponent, LeftWorkingComponent, FunctionPartitionComponent, RealisticPictureLookComponent,previewImg3,previewBigImg2,
+ FireFacilitiesComponent,ImagesData2,AllaroundComponent,ImgDetails,KeySiteLookComponent,KeySiteImgs2,BasicInfoComponent,FunctionPartitionComponent,ShareUrlDialog, PlanListComponent,LookPlanDialog,DownloadFile,OpenPlanToolDialog, CadDrawComponent],
+
+ imports: [
+ CommonModule,
+ CommonModule,
+ GisRoutingModule,
+ A11yModule,
+ CdkStepperModule,
+ CdkTableModule,
+ CdkTreeModule,
+ DragDropModule,
+ MatAutocompleteModule,
+ MatBadgeModule,
+ MatBottomSheetModule,
+ MatButtonModule,
+ MatButtonToggleModule,
+ MatCardModule,
+ MatCheckboxModule,
+ MatChipsModule,
+ MatStepperModule,
+ MatDatepickerModule,
+ MatDialogModule,
+ MatDividerModule,
+ MatExpansionModule,
+ MatGridListModule,
+ MatIconModule,
+ MatInputModule,
+ MatListModule,
+ MatMenuModule,
+ MatNativeDateModule,
+ MatPaginatorModule,
+ MatProgressBarModule,
+ MatProgressSpinnerModule,
+ MatRadioModule,
+ MatRippleModule,
+ MatSelectModule,
+ MatSidenavModule,
+ MatSliderModule,
+ MatSlideToggleModule,
+ MatSnackBarModule,
+ MatSortModule,
+ MatTableModule,
+ MatTabsModule,
+ MatToolbarModule,
+ MatTooltipModule,
+ MatTreeModule,
+ PortalModule,
+ ScrollingModule,
+ FormsModule,
+ ReactiveFormsModule,
+ PlanManagementModule,
+ UiModule
+ ]
+
})
export class GISManagementModule { }
diff --git a/src/app/gis-management/key-site-look/key-site.component.html b/src/app/gis-management/key-site-look/key-site.component.html
new file mode 100644
index 0000000..8c3aa72
--- /dev/null
+++ b/src/app/gis-management/key-site-look/key-site.component.html
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+ 单位重点部位
+
+
+
+
+
+
+
+
+
+ {{element.name}}
+
+
+ 所在地址:{{element.position}}
+
+
+ 建筑结构:{{element.structure}}
+
+
+ 使用性质:{{element.nature}}
+
+
+ 主要危险:{{element.hazards}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+
+
+
+ {{element.name}}
+
+
+ 所在地址:{{element.position}}
+
+
+ 建筑结构:{{element.structure}}
+
+
+ 使用性质:{{element.nature}}
+
+
+ 主要危险:{{element.hazards}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/app/gis-management/key-site-look/key-site.component.scss b/src/app/gis-management/key-site-look/key-site.component.scss
new file mode 100644
index 0000000..5186f22
--- /dev/null
+++ b/src/app/gis-management/key-site-look/key-site.component.scss
@@ -0,0 +1,139 @@
+*{
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ scrollbar-width: none; /* Firefox */
+}
+::-webkit-scrollbar {
+ display: none; /* Chrome Safari */
+}
+.content {
+ width: 100%;
+ height: 100%;
+ //padding: 10px;
+ overflow-y: auto;
+ .contentBox{
+ width: 100%;
+ height: 100%;
+ overflow-y: auto;
+ text-align: center;
+ margin: 0 auto;
+ }
+}
+.tableContent{
+ width: 100%;
+ height: 100%;
+ .panelhead{
+ //height: 44px;
+ background-color: #F2F9FF;
+ }
+ .colum{
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ .up{
+ width: 100%;
+ display: flex;
+ margin-top: 3%;
+ .left{
+ width: 40%;
+ height: 120px;
+
+ //margin-left: 4%;
+ img{
+ float: right;
+ width: 140px;
+ height: 120px;
+ cursor: pointer;
+ //padding-left: 7%;
+ //margin-right: 3%;
+ }
+ }
+ .right{
+ width: 60%;
+ //margin-top: 4%;
+ margin-left: 3%;
+ display: flex;
+ flex-direction: column;
+ .rightone{
+ width: 100%;
+ }
+ .righttwo{
+ margin-top: 1%;
+ }
+ .righthree{
+ margin-top: 1%;
+ }
+ .rightfour{
+ margin-top: 1%;
+ }
+ .rightfive{
+ margin-top: 1%;
+ }
+ }
+ }
+ }
+ .down{
+ width: 100%;
+ height: 150px;
+ margin-top: 5%;
+ textarea{
+ width: 95%;
+ height: 80%;
+ margin: 3%;
+ border: none;
+ background-color: #EEF1F5;
+ scrollbar-base-color:#0080FF;
+ }
+
+ }
+}
+
+table {
+ width: 90%;
+ margin: 15px auto;
+ text-align: center;
+ .cdk-header-cell {
+ text-align: center;
+ }
+}
+
+//重点提示
+.tips{
+ width: 75%;
+ height: 150px;
+ border: 1px solid black;
+ border-radius: 5px;
+ margin: 15px auto;
+ text-align: center;
+ padding: 25px;
+ textarea {
+ resize: none;
+ width: 100%;
+ height: 100%;
+ }
+}
+
+//预览图片旋转角度
+.rotateA {transform: rotate(90deg) scale(0.75);}
+.rotateB {transform: rotate(180deg)}
+.rotateC {transform: rotate(270deg) scale(0.75);}
+//预览图片
+.previewImgBox {
+ width: 1500px;
+ height: 700px;
+ text-align: center;
+ img{
+ width: auto;
+ height: auto;
+ max-width: 100%;
+ height: 100%;}
+}
+.previewImgBottom {
+ text-align: center;
+ height: 30px;
+ margin: 20px auto;
+}
diff --git a/src/app/gis-management/key-site-look/key-site.component.ts b/src/app/gis-management/key-site-look/key-site.component.ts
new file mode 100644
index 0000000..6e77fb0
--- /dev/null
+++ b/src/app/gis-management/key-site-look/key-site.component.ts
@@ -0,0 +1,195 @@
+import { Component, OnInit, ViewChild, Inject } from '@angular/core';
+import {HttpClient} from '@angular/common/http'
+import { MatDialogRef, MatDialog, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';
+import { KeySiteImgs2 } from './keysiteimgs.component'
+import { ActivatedRoute } from '@angular/router';
+
+
+
+@Component({
+ selector: 'app-key-site-look',
+ templateUrl: './key-site.component.html',
+ styleUrls: ['./key-site.component.scss']
+})
+export class KeySiteLookComponent implements OnInit {
+
+ constructor(public http: HttpClient,public dialog: MatDialog,public snackBar: MatSnackBar,private route:ActivatedRoute,) { }
+
+ displayedColumns: string[] = ['mainname', 'position', 'construction', 'nature', 'danger', 'img'];
+
+ ngOnInit(): void {
+ this.getCompanyPostion()
+ this.getCompanyTips()
+ this.getAllBuilding()
+ }
+ unitId:any = sessionStorage.getItem('unitId')
+
+ allCompanyPosition:any = []; //所有单位重点部位
+ companyTips:any; //所有单位重点提示
+ companyInput:any; //单位重点提示数据
+ allBuilding:any = []; //所有建筑 + 建筑重点部位 + 建筑重点提示
+
+ //获取单位重点部位
+ getCompanyPostion () {
+ let id = {companyId:this.unitId}
+ this.http.get('/api/CompanyImportantLocations',{params:id}).subscribe(data=>{
+ this.allCompanyPosition = data
+ this.allCompanyPosition.forEach(element => {
+ if(element.imageUrls[0]!=undefined){
+ element.imageUrls[0]+= '?x-oss-process=image/resize,m_fill,h_140,w_120'
+ }
+
+ });
+ })
+
+ }
+
+ //获取单位重点提示
+ getCompanyTips () {
+ let id = {companyId:this.unitId}
+ this.http.get('/api/CompanyImportantTips',{params:id}).subscribe((data:any)=>{
+ if (data) {
+ this.companyTips = data
+ this.companyInput = data.details}
+ })
+ }
+
+ //获取所有建筑
+ getAllBuilding () {
+ let id = {companyId:this.unitId}
+ this.http.get('/api/Buildings',{params:id}).subscribe((data:any)=>{
+ if (data.length) {
+ this.allBuilding = data
+ this.allBuilding.forEach(element => {
+ element.position = [] //建筑重点部位
+ element.tips = null //建筑重点提示
+ element.companyInput = null }) //建筑重点提示数据
+ this.getAllBuildingPositon()
+ this.getAllBuildingTips()
+ }
+ })
+ }
+
+ //获取所有建筑重点部位
+ getAllBuildingPositon () {
+ this.allBuilding.forEach(element => {
+ let id = {buildingId:element.id}
+ this.http.get('/api/BuildingImportantLocations',{params:id}).subscribe(data=>{
+ element.position = data
+ element.position.forEach(element => {
+ if(element.imageUrls[0]!=undefined){
+ element.imageUrls[0]+= '?x-oss-process=image/resize,m_fill,h_140,w_120'
+ }
+ });
+ })
+ });
+ }
+
+ //获取所有建筑重点提示
+ getAllBuildingTips () {
+ this.allBuilding.forEach(element => {
+ let id = {buildingId:element.id}
+ this.http.get('/api/BuildingImportantTips',{params:id}).subscribe((data:any)=>{
+ if (data) {
+ element.tips = data
+ element.companyInput = data.details}
+ })
+ });
+ }
+
+ //保存单位重点提示
+ Preservation () {
+ if (this.companyTips) { //编辑单位重点提示
+ let data = {
+ companyId: this.companyTips.companyId,
+ id: this.companyTips.id,
+ details: this.companyInput}
+ this.http.put(`/api/CompanyImportantTips/${this.companyTips.id}`,data).subscribe(data=>{
+ this.getCompanyTips()
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('数据修改成功','确定',config);
+ })
+ } else { //新增单位重点提示
+ let data = {
+ companyId: this.unitId,
+ id : "",
+ details: this.companyInput || ""}
+ this.http.post('/api/CompanyImportantTips',data).subscribe(data=>{
+ this.getCompanyTips()
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('数据修改成功','确定',config);
+ })
+ }
+ }
+
+ //保存建筑重点提示
+ PreservationBuilding (e) {
+ if (e.tips) { //编辑建筑重点提示
+ let data = {
+ buildingId: e.id,
+ id: e.tips.id,
+ details: e.companyInput}
+ this.http.put(`/api/BuildingImportantTips/${e.tips.id}`,data).subscribe(data=>{
+ this.toUpdate(e)
+ })
+ } else { //新增重点单位提示
+ let data = {
+ buildingId: e.id,
+ details: e.companyInput || ""}
+ this.http.post('/api/BuildingImportantTips',data).subscribe(data=>{
+ this.toUpdate(e)
+ })
+ }
+ }
+
+ //查看图片
+ seeImg (e) {
+ if(e.length>0){
+ var index=e[0].lastIndexOf("\?");
+ if(index!=-1){
+ e[0]=e[0].substring(0,index)
+ }
+
+ }
+ if (e.length) {
+ let data = e
+ const dialogRef = this.dialog.open(KeySiteImgs2, {//调用open方法打开对话框并且携带参数过去
+ width: '1600px',
+ height:'900px',data});
+ dialogRef.afterClosed().subscribe();
+ } else {
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('暂无图片数据','确定',config);
+ }
+ this.getCompanyPostion()
+ this.getAllBuildingPositon()
+ }
+
+ //封装方法获取更新当前tab页重点提示
+ toUpdate (e) {
+ let id = {buildingId:e.id}
+ this.http.get('/api/BuildingImportantTips',{params:id}).subscribe((data:any)=>{
+ if (data) {
+ this.allBuilding.forEach(element => {
+ if (element.id === e.id) {
+ element.tips = data
+ element.companyInput = data.details}
+ });
+ } // if
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('数据修改成功','确定',config);
+ })
+ }
+
+
+
+}
diff --git a/src/app/gis-management/key-site-look/keysiteimgs.component.html b/src/app/gis-management/key-site-look/keysiteimgs.component.html
new file mode 100644
index 0000000..992faec
--- /dev/null
+++ b/src/app/gis-management/key-site-look/keysiteimgs.component.html
@@ -0,0 +1,18 @@
+图片详情
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ refresh
+
\ No newline at end of file
diff --git a/src/app/gis-management/key-site-look/keysiteimgs.component.ts b/src/app/gis-management/key-site-look/keysiteimgs.component.ts
new file mode 100644
index 0000000..fb90d71
--- /dev/null
+++ b/src/app/gis-management/key-site-look/keysiteimgs.component.ts
@@ -0,0 +1,55 @@
+import { Component, OnInit, Inject ,ViewChild} from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import Swiper from 'swiper';
+
+
+
+@Component({
+ selector: 'keysiteimgs',
+ templateUrl: './keysiteimgs.component.html',
+ styleUrls: ['./key-site.component.scss']
+ })
+
+export class KeySiteImgs2 {
+
+ constructor(private http:HttpClient,public dialog: MatDialog,public dialogRef: MatDialogRef,
+ @Inject(MAT_DIALOG_DATA) public data) { }
+ testSwiper: Swiper;
+
+ ngOnInit(): void {
+ this.allImages = []
+ this.data.forEach(element => {
+ element = `${element}?x-oss-process=image/auto-orient,1`
+ this.allImages.push(element)
+ });
+ }
+
+ ngAfterViewInit() {
+
+ this.testSwiper = new Swiper('.swiper-container', {
+ direction: 'horizontal',
+ loop: false,
+ lazy: true,
+ // 如果需要前进后退按钮
+ navigation: {
+ nextEl: '.swiper-button-next',
+ prevEl: '.swiper-button-prev',
+ }
+ });
+
+ }
+
+ allImages:any; //展示所有的图片
+ rotationAngle:number=0; //旋转角度
+
+ //旋转图片
+ rotate () {
+ this.rotationAngle = this.rotationAngle+90
+ if (this.rotationAngle === 360) {this.rotationAngle = 0}
+ }
+
+
+
+}
+
\ No newline at end of file
diff --git a/src/app/gis-management/left-working/left-working.component.html b/src/app/gis-management/left-working/left-working.component.html
new file mode 100644
index 0000000..67cb128
--- /dev/null
+++ b/src/app/gis-management/left-working/left-working.component.html
@@ -0,0 +1,71 @@
+
+
+
+
+
{{selectCompany.name? selectCompany.name : '暂无单位名称'}}
+
关闭
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/app/gis-management/left-working/left-working.component.scss b/src/app/gis-management/left-working/left-working.component.scss
new file mode 100644
index 0000000..d3a857c
--- /dev/null
+++ b/src/app/gis-management/left-working/left-working.component.scss
@@ -0,0 +1,31 @@
+.center {
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+ .title{
+ height: 28px;
+ line-height: 28px;
+ position: relative;
+ font-size: 16px;
+ font-weight: 400;
+ color: #0080FF;
+ opacity: 1;
+ p{
+ text-align: center;
+ cursor: default;;
+ }
+ span{
+ position: absolute;
+ right: 10px;
+ top: 0;
+ font-size: 14px;
+ cursor: pointer;
+ }
+ span:hover{
+ text-decoration: underline;
+ }
+ }
+
+}
diff --git a/src/app/gis-management/gis-labeling/gis-labeling.component.spec.ts b/src/app/gis-management/left-working/left-working.component.spec.ts
similarity index 54%
rename from src/app/gis-management/gis-labeling/gis-labeling.component.spec.ts
rename to src/app/gis-management/left-working/left-working.component.spec.ts
index 666c51f..8f94417 100644
--- a/src/app/gis-management/gis-labeling/gis-labeling.component.spec.ts
+++ b/src/app/gis-management/left-working/left-working.component.spec.ts
@@ -1,20 +1,20 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
-import { GisLabelingComponent } from './gis-labeling.component';
+import { LeftWorkingComponent } from './left-working.component';
-describe('GisLabelingComponent', () => {
- let component: GisLabelingComponent;
- let fixture: ComponentFixture;
+describe('LeftWorkingComponent', () => {
+ let component: LeftWorkingComponent;
+ let fixture: ComponentFixture;
beforeEach(async(() => {
TestBed.configureTestingModule({
- declarations: [ GisLabelingComponent ]
+ declarations: [ LeftWorkingComponent ]
})
.compileComponents();
}));
beforeEach(() => {
- fixture = TestBed.createComponent(GisLabelingComponent);
+ fixture = TestBed.createComponent(LeftWorkingComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
diff --git a/src/app/gis-management/left-working/left-working.component.ts b/src/app/gis-management/left-working/left-working.component.ts
new file mode 100644
index 0000000..57a4f39
--- /dev/null
+++ b/src/app/gis-management/left-working/left-working.component.ts
@@ -0,0 +1,39 @@
+import { Component, EventEmitter, OnInit, Output, ViewChild } from '@angular/core';
+import { FormControl } from '@angular/forms';
+
+@Component({
+ selector: 'app-left-working',
+ templateUrl: './left-working.component.html',
+ styleUrls: ['./left-working.component.scss']
+})
+export class LeftWorkingComponent implements OnInit {
+
+ @Output() onCustomEvent: EventEmitter = new EventEmitter();//创建实例
+ @ViewChild( 'baseInfo',{static: false} ) baseInfo:any //基本信息子组件
+ constructor() { }
+
+ ngOnInit(): void {
+
+ }
+
+ selected = new FormControl(0); //选项卡 实例
+ selectCompany:any = { name: null, id: null } //选择单位
+
+ //父组件 点击基本信息时
+ selectBaseInfo (e) {
+ if (this.selectCompany.id != e.id) { //选择单位 更改时
+ this.selectCompany = e
+ sessionStorage.setItem('unitId',e.id || '')
+ sessionStorage.setItem('buildingTypeId',e.buildingTypes[0].id || '')
+ this.selected.value != 0 ? this.selected.setValue(0) : this.baseInfo.everyInin() //判断当前tab栏是否是 基本信息
+ }
+ }
+
+ //通知父组件关闭div
+ closeDiv(){
+ this.onCustomEvent.emit('closeDiv');
+ }
+
+
+
+}
diff --git a/src/app/gis-management/plan-list/openPlanTool.html b/src/app/gis-management/plan-list/openPlanTool.html
new file mode 100644
index 0000000..9c385b7
--- /dev/null
+++ b/src/app/gis-management/plan-list/openPlanTool.html
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/src/app/gis-management/plan-list/openPlanTool.scss b/src/app/gis-management/plan-list/openPlanTool.scss
new file mode 100644
index 0000000..e69de29
diff --git a/src/app/gis-management/plan-list/plan-list.component.html b/src/app/gis-management/plan-list/plan-list.component.html
new file mode 100644
index 0000000..55ea6a8
--- /dev/null
+++ b/src/app/gis-management/plan-list/plan-list.component.html
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+ 总平面图
+
+
+
+
+
+
+
+
{{item.name}}
+
+
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+
+
{{i.name}}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/app/gis-management/plan-list/plan-list.component.scss b/src/app/gis-management/plan-list/plan-list.component.scss
new file mode 100644
index 0000000..a1939e9
--- /dev/null
+++ b/src/app/gis-management/plan-list/plan-list.component.scss
@@ -0,0 +1,42 @@
+*{
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ scrollbar-width: none; /* Firefox */
+}
+::-webkit-scrollbar {
+ display: none; /* Chrome Safari */
+}
+
+.planlist{
+ width: 100%;
+ height: 100%;
+ overflow-y: auto;
+}
+.contant{
+ box-sizing: border-box;
+ padding: 20px;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+ .contantitem{
+ div{
+ width: 110px;
+ height: 110px;
+ img{
+ width: 100%;
+ height: 100%;
+ cursor: pointer;
+ }
+ }
+ p{
+ text-align: center;
+ font-size: 14px;
+ margin: 2px 0;
+ width: 110px;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/app/gis-management/plan-list/plan-list.component.spec.ts b/src/app/gis-management/plan-list/plan-list.component.spec.ts
new file mode 100644
index 0000000..9a93192
--- /dev/null
+++ b/src/app/gis-management/plan-list/plan-list.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { PlanListComponent } from './plan-list.component';
+
+describe('PlanListComponent', () => {
+ let component: PlanListComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ PlanListComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(PlanListComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/gis-management/plan-list/plan-list.component.ts b/src/app/gis-management/plan-list/plan-list.component.ts
new file mode 100644
index 0000000..1b56d2f
--- /dev/null
+++ b/src/app/gis-management/plan-list/plan-list.component.ts
@@ -0,0 +1,102 @@
+import { HttpClient } from '@angular/common/http';
+import { Component, Inject, OnInit, Renderer2, ViewChild } from '@angular/core';
+import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import { MatSnackBar } from '@angular/material/snack-bar';
+
+@Component({
+ selector: 'app-plan-list',
+ templateUrl: './plan-list.component.html',
+ styleUrls: ['./plan-list.component.scss']
+})
+export class PlanListComponent implements OnInit {
+ constructor(private http: HttpClient,public snackBar: MatSnackBar,public dialog: MatDialog) { }
+
+ //单位相关数据
+ unitId:any = sessionStorage.getItem('unitId')
+
+ ngOnInit(): void {
+ this.getAllBuildings()
+ this.getSitePlan()
+ }
+
+ //获得所有的建筑物
+ allBuildings:any
+ getAllBuildings(){
+ this.http.get("/api/Buildings",{
+ params:{
+ companyId : this.unitId
+ }
+ }).subscribe((data:any)=>{
+ data.forEach((item,index) => {
+ let params = { buildingId: item.id }
+ item.plandata = []
+ this.http.get('/api/BuildingAreas',{params}).subscribe(data=>{
+ item.plandata = data
+ })
+ })
+ this.allBuildings = data
+ })
+ }
+ //获取总平面图
+ sitePlanItems:any
+ getSitePlan () {
+ let params = {companyId: this.unitId}
+ this.http.get('/api/SitePlans',{params:params}).subscribe(data=>{
+ this.sitePlanItems = data
+ })
+ }
+ //打开采集工具
+ openPlan(item,index){
+ sessionStorage.setItem("gisplan",'look')
+ sessionStorage.setItem("companyId",this.unitId)
+ let data = {select: item, key: index, allBuildings: this.allBuildings}
+ let dialogRef = this.dialog.open(OpenPlanToolDialog,{//调用open方法打开对话框并且携带参数过去
+ width: '1500px',
+ height:'850px',
+ id:'openPlanToolDialog',
+ data
+ });
+ dialogRef.afterClosed().subscribe( (data)=>{ } );
+ }
+}
+
+
+
+//查看预案
+@Component({
+ selector: 'lookPlan-dialog',
+ templateUrl: './openPlanTool.html',
+ styleUrls: ['./openPlanTool.scss']
+})
+export class OpenPlanToolDialog {
+
+ constructor(public http: HttpClient,public snackBar: MatSnackBar,public dialogRef: MatDialogRef,
+ @Inject(MAT_DIALOG_DATA) public data,private render2: Renderer2,public dialog: MatDialog) {}
+
+ @ViewChild( 'plan',{static: false} ) plan:any //子组件
+
+ ngOnInit() {
+ }
+
+ ngAfterViewInit(): void {
+ this.noticePlan()
+ }
+
+ //通知 子组件 传递参数
+ noticePlan () {
+ let parameter = { //查询 节点 对应 建筑/楼层 index,id
+ buildingIndex: this.data.key, //总平面图/建筑 index
+ storeyId: this.data.select.id
+ }
+ this.http.get("/api/Buildings",{params:{companyId : sessionStorage.getItem('unitId')} }).subscribe((data:any)=>{
+ this.plan.allBuildings = data
+ this.plan.seekPanelPoint(parameter)
+ })
+ }
+
+ //关闭弹窗
+ closeDiv(){
+ this.dialogRef.close()
+ }
+
+}
\ No newline at end of file
diff --git a/src/app/gis-management/realistic-picture-look/previewImg.html b/src/app/gis-management/realistic-picture-look/previewImg.html
new file mode 100644
index 0000000..1cde6b9
--- /dev/null
+++ b/src/app/gis-management/realistic-picture-look/previewImg.html
@@ -0,0 +1,17 @@
+图片详情
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ refresh
+
\ No newline at end of file
diff --git a/src/app/gis-management/realistic-picture-look/realistic-picture.component.html b/src/app/gis-management/realistic-picture-look/realistic-picture.component.html
new file mode 100644
index 0000000..e124cd2
--- /dev/null
+++ b/src/app/gis-management/realistic-picture-look/realistic-picture.component.html
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+
diff --git a/src/app/gis-management/realistic-picture-look/realistic-picture.component.scss b/src/app/gis-management/realistic-picture-look/realistic-picture.component.scss
new file mode 100644
index 0000000..05d59e7
--- /dev/null
+++ b/src/app/gis-management/realistic-picture-look/realistic-picture.component.scss
@@ -0,0 +1,229 @@
+*{
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ scrollbar-width: none; /* Firefox */
+}
+::-webkit-scrollbar {
+ display: none; /* Chrome Safari */
+}
+.content {
+ //margin: 0 0 0 10px;
+ width: 100%;
+ height: 100%;
+ overflow-y: auto;
+ margin-top: 10px;
+ .leftBox {
+ flex: 15%;
+ padding-top: 10px;
+ .bank {
+ display: flex;
+ padding-left: 10px;
+ .mat-icon {margin-right: 15px;}
+ }
+ }
+ .rightBox {
+ border-left: 1px solid #999;
+ flex: 85%;
+ display: flex;
+ flex-direction: column;
+ .topBox {
+ flex: 5%; padding: 10px;
+ display: flex;
+ :first-child {flex: 85%;};
+ :last-child {flex: 15%;}
+ }
+ .bottomBox {
+ flex: 95%;
+ padding: 5px 0 0 25px;
+ overflow: auto;
+ .imgsBoxflex {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ }
+ }
+ }
+}
+.tableContent{
+ width: 100%;
+ height: 100%;
+ .panelhead{
+ height: 44px;
+ background-color: #F2F9FF;
+ margin-top: 10px;
+ }
+ .colum{
+ width: 100%;
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ .zanwu{
+ width: 100%;
+ height: 30px;
+ margin-top: 10px;
+ span{
+ height: 40px;
+ margin-top: 15px;
+ margin-left: 5%;
+ font-size: 16px;
+ }
+ }
+ .imghe{
+ width: 50%;
+ display: flex;
+ flex-direction: column;
+ cursor: pointer;
+ }
+ img{
+ width: 170px;
+ height: 100px;
+ margin-left: 5%;
+ margin-top: 7%;
+ }
+ input{
+ width: 80%;
+ border: none;
+ outline: none;
+ }
+ }
+}
+
+//icon统一样式
+.mat-icon {
+ cursor:pointer;
+ width: 18px;
+ height: 18px;
+ vertical-align:top;
+ margin-right: 10px;
+}
+.title {margin-right: 30px;font-weight: 500; font-size: 18px;}
+
+.material {
+ cursor:pointer;
+ height: 30px;
+ font-size: 16px;
+ margin-top: 10px;
+ padding-left: 15px;
+ span {
+ max-width: 200px;
+ display: inline-block;
+ overflow: hidden;
+ text-overflow:ellipsis;
+ white-space: nowrap;
+ }
+ .btn {
+ color: #FFC122;
+ }
+}
+.imgBox{
+ width: 300px;
+ height: 200px;
+ margin: 0 35px 35px 0;
+ display: inline-block;
+ position: relative;
+ .fixedImg {
+ width: 100%;
+ height: 170px;
+ text-align: center;
+ margin-bottom: 3px;
+ img {
+ width: auto;
+ height: auto;
+ max-width: 100%;
+ height: 100%;
+ cursor:pointer;
+ }
+ }
+ input{
+ font-size:12px;
+ width: 100px;
+ height:18px;
+ border-radius:3px;
+ border:1px solid #c8cccf;
+ outline:0;
+ text-align:left;
+ padding-left: 5px;
+ display:inline-block;
+ cursor: pointer;}
+ input::-webkit-input-placeholder{
+ color: #986655;
+ font-size: 12px;
+ }
+ a {display: inline-block;
+ width: 45px;
+ height: 24px;
+ line-height: 24px;
+ text-align: center;
+ border-radius: 3px;
+ background-color: #2196F3;
+ font-size: 14px;
+ color: #fff;}
+}
+.uploadFileFixed {
+ position: relative;
+ .uploadFile {
+ opacity:0;
+ display: inline-block;
+ width: 88px;
+ height: 36px;
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ }
+}
+//分页
+.mat-paginator {
+ background-color: rgba(255,255,255,0);
+ padding-right: 10%;
+}
+.isLoading{
+ display: inline-block;
+ margin-left: 15px;
+ top: 8px;
+}
+
+//左侧实景图文件样式
+.leftFile {
+ background-color: rgba(225,225,225,0.8);
+}
+//选中图片样式
+.selectImg {
+ -webkit-filter: drop-shadow(0px 0px 5px #000);
+ filter: drop-shadow(0px 0px 5px #000);
+ border: 1px solid red;
+}
+.checkedImg {
+ position: absolute;
+ top: 1px;
+ right: 1px;
+ color:#00FF00;
+ font-size: 30px;
+ z-index: 999;
+}
+//预览图片旋转角度
+.rotateA {transform: rotate(90deg) scale(0.75);}
+.rotateB {transform: rotate(180deg)}
+.rotateC {transform: rotate(270deg) scale(0.75);}
+
+
+
+//预览图片
+.previewImgBox {
+ width: 1500px;
+ height: 700px;
+ text-align: center;
+ img{
+ width: auto;
+ height: auto;
+ max-width: 100%;
+ height: 100%;}
+}
+.previewImgBottom {
+ text-align: center;
+ height: 30px;
+ margin: 20px auto;
+}
diff --git a/src/app/gis-management/realistic-picture-look/realistic-picture.component.ts b/src/app/gis-management/realistic-picture-look/realistic-picture.component.ts
new file mode 100644
index 0000000..262d8c2
--- /dev/null
+++ b/src/app/gis-management/realistic-picture-look/realistic-picture.component.ts
@@ -0,0 +1,417 @@
+import { Component, OnInit, Inject, ViewChild } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
+import { FileUploader } from 'ng2-file-upload';
+import { MatPaginator } from '@angular/material/paginator';
+import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';
+import Swiper from 'swiper';
+import { Router,ActivatedRoute } from '@angular/router'
+
+@Component({
+ selector: 'app-realistic-picture-look',
+ templateUrl: './realistic-picture.component.html',
+ styleUrls: ['./realistic-picture.component.scss']
+})
+export class RealisticPictureLookComponent implements OnInit {
+ uploader:FileUploader = new FileUploader({ //初始化上传文件
+ url: `/api/Objects/PlanPlatform/${this.route.snapshot.queryParams.id}/RealImgs`,
+ method: "POST",
+ itemAlias: "uploadedfile",
+ autoUpload: false,
+ removeAfterUpload:true,
+ });
+
+ constructor(private router:Router,private route:ActivatedRoute,private http:HttpClient,public dialog: MatDialog,public snackBar: MatSnackBar) { }
+
+ ngOnInit(): void {
+ let companyId = this.unitId
+ this.http.get('/api/RealityImageGroups',{params:{
+ companyId : companyId
+ }}).subscribe((data:any)=>{
+ this.allRealPicture = data
+ this.selectReal = data[0]
+ this.getAllRealPicture()
+ })
+
+ }
+
+ unitId:any = sessionStorage.getItem('unitId')
+
+ companyId:any; //单位编号
+ allRealPicture:any=[]; //所有实景图文件
+ selectReal:any; //选中的实景图文件
+ selectRealIndex:number=0; //选中的实景图文件下标
+ allImages:any=[]; //实景图文件对应所有的实景图
+ isDownload:boolean = false; //是否批量下载
+ downloadList:any = []; //选中需要下载的图片
+
+ //分页
+ @ViewChild(MatPaginator, {static: true})
+ paginator: MatPaginator;
+ length:any; //共多少条数据
+ pageSize:any = '12'; //每页条数
+ pageSizeOptions: number[] = [12] //设置每页条数
+ PageNumber:any; //第几页
+
+ //分页切换
+ chagePage (e) {
+ this.PageNumber = e.pageIndex+1
+ this.getAllRealPicture()
+ }
+
+ //获取所有实景图分组
+ getAllGrouping () {
+ let companyId = this.unitId
+ this.http.get('/api/RealityImageGroups',{params:{
+ companyId : companyId
+ }}).subscribe((data:any)=>{
+ this.allRealPicture = data
+ this.selectReal = data[this.selectRealIndex]
+ })
+ }
+
+ //获取实景图分组对应实景图
+ getAllRealPicture () {
+ if (this.selectReal) {
+ let data ={
+ groupId: this.selectReal.id,
+ PageNumber: this.PageNumber || 1,
+ pageSize: this.pageSize,
+ }
+ this.http.get('/api/RealityImages',{params:data}).subscribe((data:any)=>{
+ this.allImages = data.items
+ // console.log(789,this.allImages)
+ this.length = data.totalCount
+ this.pageSize = data.pageSize
+ this.downloadList = []
+ //console.log(this.allImages)
+ this.allImages.forEach(element => { //每张图片设置选中状态为false
+ element.newImageUrl = `/api/Objects/PlanPlatform/${element.imageUrl}?x-oss-process=image/resize,m_fill,h_170,w_299` //处理图片URL地址
+ element.checked = false //图片是否选中布尔值
+ element.nameStart = element.name.substring(0,element.name.lastIndexOf(".")); //图片名称前缀
+ element.nameEnd = element.name.substring(element.name.lastIndexOf("."),element.name.length); //图片名称后缀
+ });
+
+ })
+ }
+ }
+
+ //切换左侧实景图文件
+ changeReal (e,index) {
+ //this.allImages=[]
+ if (this.selectRealIndex != index) {
+ this.selectReal = e
+ this.selectRealIndex = index
+ this.isDownload = false
+ this.downloadList = []
+ this.getAllRealPicture()
+ }
+
+ }
+
+ //选择批量下载
+ download () {
+ this.isDownload = !this.isDownload
+ if (!this.isDownload) { //取消批量下载时数组清空
+ this.allImages.forEach(element => {element.checked = false});
+ this.downloadList = []
+ }
+ }
+
+ // 预览图片---批量选择图片
+ operation (e,index) {
+ if (this.isDownload) { //批量选择图片
+ e.checked = !e.checked
+ if (e.checked==true) {this.downloadList.push(e)}
+ else {this.downloadList.splice(this.downloadList.findIndex(item => item.id === e.id), 1)}
+ } else { //预览图片
+ let data = {
+ allImages:this.allImages,
+ imgIndex: index}
+ let dialogRef = this.dialog.open(previewImg3,
+ {width: '1600px',
+ height:'900px',data});
+ dialogRef.afterClosed().subscribe();
+ }
+
+ }
+
+ //新建实景图文件
+ addReal () {
+
+ }
+
+ //编辑实景图文件
+ editReal () {
+
+ }
+
+ //删除实景图文件
+ delete () {
+ let companyId = this.unitId
+ if (this.selectReal) {
+ let isDelete = confirm('您确定要删除吗')
+ if (isDelete) {
+ this.http.delete(`/api/RealityImageGroups/${this.selectReal.id}`).subscribe(data=>{
+ this.http.get('/api/RealityImageGroups',{params:{
+ companyId : companyId
+ }}).subscribe((data:any)=>{
+ this.allRealPicture = data
+ this.selectReal = data[this.selectRealIndex]
+ this.allImages = []
+ this.getAllRealPicture()
+ })
+ })
+ }
+ }
+ }
+
+
+
+ //实景图修改
+ preservationImg (e) {
+ let data = {
+ id:e.id,
+ name:e.nameStart+e.nameEnd,
+ imageUrl:e.imageUrl,
+ realityImageGroupId:e.realityImageGroupId
+ }
+ this.http.put(`/api/RealityImages/${e.id}`,data).subscribe(data=>{
+ this.getAllRealPicture()
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('图片修改成功','确定',config);
+ })
+ }
+
+ //实景图删除
+ deleteImg (e) {
+ let isDelete = confirm('您确定要删除吗')
+ if (isDelete) {
+ this.http.delete(`/api/RealityImages/${e.id}`).subscribe(data=>{
+ this.getAllRealPicture()
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('图片删除成功','确定',config);
+ })
+ this.http.delete(`/api/Objects/PlanPlatform/${e.imageUrl}`).subscribe(data=>{})
+ }
+ }
+
+
+
+
+
+ isLoading:boolean = false; //loading加载
+ //上传文件↓
+ file:any; //上传的文件
+ objectName:any; //上传对象名
+ uploadId:any; //上传分块上传事件编号
+
+ //change选择文件
+ uploadFile (e) {
+ if (this.selectReal) {
+ this.file = e.target.files[0] || null //上传的文件
+ let URL = window.URL.createObjectURL(this.file)
+ var img = new Image()
+ img.src = URL
+ let that = this
+ img.onload = function () {
+ if(img.width>=4096 || img.height>=5000 ){
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ that.snackBar.open('请选择分辨率小于4096*5000的图片','确定',config);
+ that.uploader.clearQueue(); //清空input控件文件
+ (document.getElementById('uploadFile')).value = null //清空input框缓存
+ }else{ that.startUploading() }
+ } //onload
+ } else {
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('请选择或创建实景图文件夹','确定',config);
+ this.uploader.clearQueue(); //清空input控件文件
+ (document.getElementById('uploadFile')).value = null //清空input框缓存
+ }
+ }
+
+ //上传文件
+ startUploading () {
+ let file = this.file || null //获取上传的文件
+ let fileSize = file.size || null //上传文件的总大小
+ let shardSize = 5 * 1024 * 1024 //5MB一个分片
+ let maxdSize = 20 * 1024 * 1024 //限制20MB
+
+ if (file && fileSize<=shardSize) { //上传文件<=5MB时
+ this.uploader.queue[0].upload();//开始上传
+ this.uploader.queue[0].onSuccess = (response, status, headers) => {
+ if (status == 201) { // 上传文件成功,上传文件后获取服务器返回的数据
+ let tempRes = JSON.parse(response);
+ this.objectName = tempRes.objectName
+ this.addRealImg()
+ }else { // 上传文件后获取服务器返回的数据错误
+ let tempRes = JSON.parse(response);
+ }};
+ } else if (file && fileSize>shardSize && fileSize5MB时,分块上传
+ let data = {filename: file.name}
+ this.isLoading = true
+ this.http.post(`/api/NewMultipartUpload/PlanPlatform/${this.companyId}/RealImgs`,{},{params:data}).subscribe((data:any)=>{ //初始化分段上传
+ this.objectName = data.objectName
+ this.uploadId = data.uploadId
+ this.subsectionUploading()
+ })
+ }
+
+ }
+
+ PartNumberETag:any=[]; //每次返回需要保存的信息
+ //开始分段上传
+ async subsectionUploading () {
+ let file = this.file || null //获取上传的文件
+ let fileSize = file.size || null //上传文件的总大小
+ let shardSize = 5 * 1024 * 1024 //5MB一个分片
+ let allSlice = Math.ceil(fileSize / shardSize) //总文件/5MB===共分多少段
+
+ for (let i = 0;i < allSlice;i++) { //循环分段上传
+ let start = i * shardSize //切割文件开始位置
+ let end = Math.min(fileSize, start + shardSize); //切割文件结束位置
+ let formData = new FormData()
+ formData.append("file",file.slice(start, end))
+
+ //同步写法实现异步调用
+ let result = await new Promise((resolve, reject) => {
+ // await 需要后面返回一个 promise 对象
+ this.http.post(`/api/MultipartUpload/PlanPlatform/${this.objectName}?uploadId=${this.uploadId}&partNumber=${i+1}`,formData).subscribe((data:any)=>{
+ let msg = {
+ "partNumber":data.partNumber || null,
+ "eTag": data.eTag || null}
+ resolve(msg) // 调用 promise 内置方法处理成功
+ })
+ });
+ this.PartNumberETag.push(result)
+ if (this.PartNumberETag.length === allSlice) {this.endUploading()}
+ }//for循环
+
+ }
+
+ //完成分块上传
+ endUploading () {
+ let data = this.PartNumberETag
+ let paramsData = {uploadId:this.uploadId}
+ this.http.post(`/api/CompleteMultipartUpload/PlanPlatform/${this.objectName}`,data,{params:paramsData}).subscribe(data=>{
+ this.addRealImg() //上传完成后,发送请求创建实景图
+ this.isLoading = false
+ this.uploader.clearQueue(); //清空input控件文件
+ this.PartNumberETag =[] //清空保存返回的信息
+ })
+ }
+
+ //上传图片成功后获取url地址发送请求创建实景图
+ addRealImg () {
+ let data = {
+ name: this.file.name,
+ imageUrl:this.objectName,
+ realityImageGroupId: this.selectReal.id,
+ }
+ this.http.post('/api/RealityImages',data).subscribe(data=>{
+ (document.getElementById('uploadFile')).value = null //清空input框缓存
+ this.getAllRealPicture()
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('图片上传成功','确定',config);
+ })
+ }
+
+
+
+ //批量下载↓
+ //开始下载
+ async batchDownload () {
+ if (this.downloadList.length) { //开始批量循环下载
+ this.isLoading = true
+ for (let i=0;i{
+ this.http.get(`/api/Objects/PlanPlatform/${this.downloadList[i].imageUrl}`,{responseType: 'blob'},).subscribe(data=>{
+ let url = window.URL.createObjectURL(new Blob([data])); //createObjectURL创建一个下载Blob的url地址
+ let link = document.createElement("a");
+ link.style.display = "none";
+ link.href = url;
+ link.setAttribute("download", this.downloadList[i].name);
+ document.body.appendChild(link);
+ link.click();
+ result('success')})
+ })
+ if(i == this.downloadList.length-1) { //判断是否下载完毕
+ this.isLoading = false
+ this.isDownload = false
+ this.allImages.forEach(element => {element.checked = false});
+ this.downloadList = []}
+
+ } //for循环
+ } else {
+ const config = new MatSnackBarConfig();
+ config.verticalPosition = 'top';
+ config.duration = 3000
+ this.snackBar.open('请选择图片','确定',config);}
+ }
+
+
+
+
+
+}
+
+
+
+//预览图片组件
+@Component({
+ selector: 'app-previewImg',
+ templateUrl: './previewImg.html',
+ styleUrls: ['./realistic-picture.component.scss']
+})
+export class previewImg3 {
+
+ constructor(private http:HttpClient,public dialog: MatDialog,public dialogRef: MatDialogRef,
+ @Inject(MAT_DIALOG_DATA) public data) { }
+ testSwiper: Swiper;
+
+ ngOnInit(): void {
+ this.allImages = this.data.allImages
+ this.allImages.forEach(element => {
+ element.previewImageUrl = `/api/Objects/PlanPlatform/${element.imageUrl}?x-oss-process=image/auto-orient,1` //处理图片URL地址
+ });
+ }
+
+ ngAfterViewInit() {
+ this.testSwiper = new Swiper('.swiper-container', {
+ lazy: true,
+ initialSlide: this.data.imgIndex,
+ direction: 'horizontal',
+ loop: false,
+
+
+
+ // 如果需要前进后退按钮
+ navigation: {
+ nextEl: '.swiper-button-next',
+ prevEl: '.swiper-button-prev',
+ }
+ });
+ }
+
+ allImages:any; //展示所有的图片
+ rotationAngle:number=0; //旋转角度
+
+ //旋转图片
+ rotate () {
+ this.rotationAngle = this.rotationAngle+90
+ if (this.rotationAngle === 360) {this.rotationAngle = 0}
+ }
+
+}
+
+
diff --git a/src/app/navigation/navigation.component.html b/src/app/navigation/navigation.component.html
index 61e4648..113eca0 100644
--- a/src/app/navigation/navigation.component.html
+++ b/src/app/navigation/navigation.component.html
@@ -57,8 +57,12 @@
diff --git a/src/app/navigation/navigation.component.scss b/src/app/navigation/navigation.component.scss
index eccfaa5..ac1347c 100644
--- a/src/app/navigation/navigation.component.scss
+++ b/src/app/navigation/navigation.component.scss
@@ -18,6 +18,8 @@ mat-sidenav{
width: 100%;
li{
+ outline: none;
+ border: none;
line-height: 48px;
cursor: pointer;
background-color: #3c4252;
@@ -122,6 +124,8 @@ mat-sidenav{
.example-sidenav-content{
height: 100%;
overflow: hidden;
+ display: flex;
+ flex-direction: column;;
}
.disabledclass{
mat-panel-title{
diff --git a/src/app/plan-management/plan-management.module.ts b/src/app/plan-management/plan-management.module.ts
index d874586..21a83f5 100644
--- a/src/app/plan-management/plan-management.module.ts
+++ b/src/app/plan-management/plan-management.module.ts
@@ -102,6 +102,7 @@ import { WebLookComponent } from './web-look/web-look.component';
MatToolbarModule,
MatTooltipModule,
MatTreeModule
- ]
+ ],
+ exports:[PlanType, AuditSatus, PlanLevel]
})
export class PlanManagementModule { }
diff --git a/src/app/ui/material-bank/addoriginalcopy.component.html b/src/app/ui/material-bank/addoriginalcopy.component.html
index eb0ac05..90fdbe0 100644
--- a/src/app/ui/material-bank/addoriginalcopy.component.html
+++ b/src/app/ui/material-bank/addoriginalcopy.component.html
@@ -14,6 +14,7 @@
点
多点连线
多边形
+ 矢量图
diff --git a/src/app/ui/material-bank/editoriginalcopy.component.html b/src/app/ui/material-bank/editoriginalcopy.component.html
index e00e323..788a503 100644
--- a/src/app/ui/material-bank/editoriginalcopy.component.html
+++ b/src/app/ui/material-bank/editoriginalcopy.component.html
@@ -14,6 +14,7 @@
点
多点连线
多边形
+
矢量图
diff --git a/src/assets/images/2D.jpg b/src/assets/images/2D.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..f8e3b438181974605201f3ea150ebc83934a1ef1
GIT binary patch
literal 6575
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
IRG*gq2YMRA9RL6T
literal 0
HcmV?d00001
diff --git a/src/assets/images/3dicon.png b/src/assets/images/3dicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..9aae7a9244813baa59822d9b9f8ff8da859218f0
GIT binary patch
literal 308
zcmV-40n7f0P)l+BVDyZ5@d;mdQbIl$1
zUGKd6&W_-=d+zx^&pGFwpm}1N6KqTNF%4Yu
z=C>fG6GQP7vX;CO;S1}+4vl1_F^#c3coZxN^iCs?j}
ztiY<$x=&T(@8BC2T2v=FzUNZsaauNJx+c&D4w2*C
z-<69gkNFZ?1#W`*TMorA`1y|UC0{Qq_>38>;YbWm_0(_9iBA4KStNx30000-e-hfuB
zS_$mwY;aKG*!dvN&Z_h$MON&Mot>SXo%yc`1ySGPIUksb8M6e0@jV=^yrB?|Lnwgb
zEw0JoWyYn$-w`SsHM)SK+{ys&%RG7C!}H`0b8?fl9?csJ>=0w2*_?2`v`a^DgrN;^
zyvb$x)jmcee7a
zYlKe+Jho~wYw0)|Co?iZp_
z4nyt~I8`W5HA>=K166nb-Nb-3)#$+162p&-4(-u$l
zx^9*_i~y&8pX~v@UI6?P;c2hyqk3jKwq+W?({TTUl8+f!B+~$5r70+3JN9H6fLYH2
znkl$NvSR@0?9(MU-~oy;0OWuN5bpRCVCYQ&NmO*Fz^T%k8ZC_X*_6h*YJsK{7DJUp
z8td4JHu{7)7Om2D8Nf(k)}`4Li8S`T{oJ_3neG_CdTDTr8)?kK9zmA}h()HXZU$tL
z3``W
z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBxpST_jv*C{Z)e}nJ!BxzUY~B{;J!fmLqw=T
zs)!Zi6xLguUSTg-M5UJqP5m{4H-Y8e>}Ri*tV;Q%ueL++?A`Az6Q>s2&F6o2kfr@}
zrJd<9owvu0=P6@Ts61lP-K2it-2s8+%dhep2=s9^
z6ofFeEM`)W5oLJj^1@;=tAAj^cczr{oVkKC{J16J_p9;Dn_4Lq`dBIX(HW66QLm2e
z4SN=R7GQjA$zOa}di_b4&3_HuSfn;SeAzCb@ZYW0-VzdTWj7aQd7tlz^LbK_Af!;!{$mnDv!kgbw$JQ4OztG7?(
zcw*_>^%wUag8At3+cb>>Qm-CWraP>Nv$1_->3c0e+&>%S)f)A(g_2pD+ICg^Uj?D7
zSis(2!NB1@Td`u%*#Q4QMu9#v=MOHk7tUJ*2^)|ktAm9W!y%v?pRd@_WygTe~DWM4f0I%RW
literal 0
HcmV?d00001
diff --git a/src/assets/images/areaicon.png b/src/assets/images/areaicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..a430fa56752fe2dccb65b6acb56eb7db7df9862a
GIT binary patch
literal 306
zcmV-20nPr2P)b<841nR^%&>J}V1QdN6p3S$4Q>DfyKg{_z*dIdfB~fTAPh(#!3Hx%FE2<@)Dpjn
zwQ%78g=s9;G@hRO`J1u(6g
z-wi!Og6V?l5EtY@YM~t}y+6K5wM1%4}
zd?#gP3=leDYCO6>6xlI!ab6d`HO{9-7$Zg&pqC7`JN#O7PAFmT0RR9107*qoM6N<$
Eg8R&PumAu6
literal 0
HcmV?d00001
diff --git a/src/assets/images/basicinfoicon.png b/src/assets/images/basicinfoicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d025871e657c1a1794e50efe1b26c1d7f892822
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^JV4CH!3HFy_x^nYq*^^)978mMr(W8~d&oe5^+LKP
ztEwt1tFr-53C{t6n~gjN7^06l*lSX!|P@607Q8!LiPD>YNR;)lHh8O>>jkpVeFavSn#{
pY~pABknLZ7)q1tga9f=DPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D14BtfK~!i%)tN1D
z>Od5Q5eNhVQBhHes6ZepD-cLT1p-llKvp7f6%`c~2n3=6fv7+rkq9ILfj}S;6$k_Z
zf!H@^yOgj!g#8J;aAv+4=H_N|FWJ5OlZ5clYPAxtudgDP%ZWrH;l%y@y=((*`N%nu
z#bP0YV8OY7wq~=LYTaJWi99|&(tv!(=ksE_-KrTaRyZmUHvza=jUhYcnzTN
z$VB@6K6SVzWDe&nrI$kXsBAV%FJ2RBt;a9=fI;~7_9javRsjINVZ$|cPXth-6HiZ1
zVltV?!51bh4l9)kZNmd5t{0yMRP_UB>s@v^SKNIvn<)Vq`T?_kY=4S#*c2FN5AJoqPY77O7LtU8VnQs_4
zjX|LZ%Hwc@8be_LxO549eBdy_gC~+WLBy6+uTnd`zrP=}?Ep0zb1X0j|1v5X
z2s>p*;;d~;sL>ew)0mB2g*gaqu(mCsMr*MCvia%+UypSagBqQ{-W`+Wv7I1g$Wl;arVh5}AX`hA3{x9MGR#)=6;z-AZneF#tU_
zGyfeF4(Rub6(%-R9p)TI@FsRiKnI`RP#STVhHvO`>~07i0~=%F@L*7ge^6buM4a3K~J2Ch`F
zuv8EX#Nq@?MInvpECv6J%-gwSZ}m9ES1miUKW4t~dn>d$LGuW&P$puFFpKh&AQ!iN
zA~#+J?Lc^oG6r;I>c7WAnD
z-vAvgfacb+0}dKJw%TvtlpJL~$(B!Ou6+Ou*f79^U2?!l>?`R2S4>%tfp&m?C+{MZ
z`7CP=Od???Wi`|K0*!z^|L&K8OcT?_G%~I1>?6!KCAm52&%Cc5Cxlv7qhSX=_r@g2
z$wcX-Z~Ka?X^p-D7ZjLfQvUi%gRap~M(_<_jv$-yeG+E7i+Nk^$nTW7QR5M1KFVP#
z7LyLEn9cEdM!UI;8kr>KZVaS3WcoC&h~;C|UEFJ$sH8pal1X6N{&TY3rCle-e1u)a
y6&kDFa%r=vd+=}MCeTKI?V?+C4p?dRW4i`d7oR+PT%%C{0000w1evThF!MarZ>s?w*$`A1qv!<+QImFB$Rt-fZ*>*b$U-1|ZdQ#k1HXho_&$Kj4Al9yx^SOa`
zw6W1p%JJ6=Tw|k*7V}HI8PV6>VW<=5E#6_jT=b}BQ*Qd9t-Pq^FOJH;Z{iCE8e@@8
zv>5eRCDMhev09`b8jVea3`1QkPIEkD8&a`5$(wZxa!7Us14>~W00000NkvXXu0mjf
DiEOVv
literal 0
HcmV?d00001
diff --git a/src/assets/images/download.png b/src/assets/images/download.png
new file mode 100644
index 0000000000000000000000000000000000000000..0a7b603d26a915b5b415d3f0ee3f270fb5befc3e
GIT binary patch
literal 233
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
literal 0
HcmV?d00001
diff --git a/src/assets/images/navicon.png b/src/assets/images/navicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..2f79c857b18ddbcd6dd6daa10f0bd0763497fb41
GIT binary patch
literal 315
zcmV-B0mS}^P)A!9-FpWmGUzg!tcIIpvB)h-?k4#MEXsi7bz@|*u*ziTFOZC8vkbQk>Mr8G
z`ab8Y@2bN&bvpH)=Xv{`_lTtB;(!?jSpimoH$}Y*ukgwOupIVeiGA)D%}40bWFUtZ
zf#FEwLviADK4_sFo(C!k>8FJG3owxY7sw-~MkbyCo4{zIyoKpJywQa*9iq;KvpkHV
z=NDD#?5Pu<>XGl`9REsjhiNIR#YOW5@X#mr*r2Ve|HLZr4%C9&Wr%Th)csq`Zq4t3
z*&tqHS}zjBqyC7ez;=L}m~KLzOR5*x!C`z$=n5063UV0
z)BDq5)xe5@A4X=3x(joHSvlR=wx?{q?6XZ$NQD&;S4c07*qoM6N<$f=oiK-~a#s
literal 0
HcmV?d00001
diff --git a/src/assets/images/planicon.png b/src/assets/images/planicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d55f353ff7785019f36842b119e500dcdbc3cda
GIT binary patch
literal 255
zcmVIwX
zZ=aWa1fvU}N&bp}1S7}iHNmJBAbV`#oRFBl?Cr)sa06Tjs56kQFPtFkfC_L$nfgMT
z-62KUDuSo1zAn&v??oQ89qgc-2`HhgeV|1VMiPeFLYV>OBKSfht#V5veIVC&*qUl-
zq#WdeW0Vyk`YV#Vt3n$k1{$vPifZ(jz{kk>4EgtC%RA)LQW7sL+1UU9002ovPDHLk
FV1fxjX)*u+
literal 0
HcmV?d00001
diff --git a/src/assets/images/point.gif b/src/assets/images/point.gif
new file mode 100644
index 0000000000000000000000000000000000000000..9074c395f4e3f6c3db275d9ca0298e0f3fc3f6b5
GIT binary patch
literal 55
zcmZ?wbhEHbWMyDwn8?Jy!0;aefGowIEQ|~cObj|eHc*xo$mVbnSvGx7n*$?*H2|++
B4f6m1
literal 0
HcmV?d00001
diff --git a/src/assets/images/routdown.png b/src/assets/images/routdown.png
new file mode 100644
index 0000000000000000000000000000000000000000..59ce9713045c67de733d6c89ccb87b29799086cf
GIT binary patch
literal 143
zcmeAS@N?(olHy`uVBq!ia0vp^96-#{?BM^bZld^
zt~hk!!VmlT5A6@LtohW#!`hS3+4lb}4-b!MMwgX@l!Ue-mqJ&Xv4O!7he~50-`FuH
og;fVAe|jO8lBATx|Are3HV(q!H*XZ~1=_&i>FVdQ&MBb@08vOQYXATM
literal 0
HcmV?d00001
diff --git a/src/assets/images/routdown2.png b/src/assets/images/routdown2.png
new file mode 100644
index 0000000000000000000000000000000000000000..e714690339d639fde6a6d94a3247e19eb7b4516f
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0zk~g!3HGv?z=Y!NVR#oIEH8h&%JO_u*pE6mIo_%&5x>SgB^{ZI$Gh{4m<&t;ucLK6T~a!E!2
literal 0
HcmV?d00001
diff --git a/src/assets/images/routup.png b/src/assets/images/routup.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d8f2b12c6ccec9b461d5fc1e87aec707eaaf71a
GIT binary patch
literal 144
zcmeAS@N?(olHy`uVBq!ia0vp^96-#Z
zcte0{fU51330jPt9-YmPpI!_In)GSn{@upYtuIzRi+*5qRCZa!>Q$%Cf2cc^?+|)P
zNF`zWgm}Z!(~a+$J~PNj&1Uuan;ph=?co{GNs$S82QJuTNzO4?YRBLBQ_!NG^LbRi
w<_rHHnu5*lN1h#jxl`^k|Fw1hPFmk%T+63co^-P!6X+}kPgg&ebxsLQ0Aox|VgLXD
literal 0
HcmV?d00001
diff --git a/src/assets/images/shareicon.png b/src/assets/images/shareicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..942b042071499e99677819a7d525f727dc60c93a
GIT binary patch
literal 331
zcmV-R0kr;!P)KOWEEQ|l)8NY3WY|cRVWk+5)uW8jzS{B$|YOu1878{RFIHRDwGPv79wSVH(K7l9=JT=(aGcw|*mB@jTo*M8#;bB*XGzl9
dr5Rh8{Q#LLPGO7l2xkBQ002ovPDHLkV1i2VjJ5y(
literal 0
HcmV?d00001
diff --git a/src/assets/images/showhide.png b/src/assets/images/showhide.png
new file mode 100644
index 0000000000000000000000000000000000000000..d3b5278d2d8901852f38a5cd851d201b46a23b2b
GIT binary patch
literal 596
zcmV-a0;~OrP))qnbYs
z@0OvWUkhJnjshdN@3O7bvH5j~yn=h@p(xKgn1_?lIHC=-TnjEKfT?S#>HV+HxX*
z61pzzYJgN2Cs(E;^Yx{4-Ag0000a~y
z(UY}bzvmbl!1QS|su~E2%B`yjPIuh4Ns3>&`5fTN3
zlFB8nP{@tUe&p7=wYe#G-e=#L*>{Dk@^v+6d9vF{A{{wjt0;RxPguc|T3YuP^mQ7g
z4)jFgZ-f~p!A%{b#SPGxa%fUuf(^NkpSMA${lFbCoU!%`FpiT(xItV_&w#ni
zV}*@6PUhR7ud~r!Ib2|6`<@F_dJaY`P@=^<
zZ~&AtU`tLhOpen9-~{+WSc{wuE_Z+zadMiBoWc9ih3z8`q{41a6`a_glgMi5Y-3k}
mDPSaWvv6MkHJrS~6Z`;OGg*G;M)oKG0000vj!Ih9y5L`imkpJ5i1Xlo55O)B76U)J=fD%jxrUXR%BO+lZyKpAH
zGyW3X?pV8z#Mc2Q_Px2eop%Sq6X9W+LhCk&K7x^%E!m@AB21xaj2d46^PklGJ%KRj
zu@9JmXJGD|TLW9e1E@beNkXWH-sJP74c3>t8N7v#p!Y79`xU~y5nz5~*F1Dk6&gJ{
zoOR)ujRNFH=qsw{gj%yxc;t=%t8?ClJyKN96l(s#XHK}A1GMfq8oVXN;#D6WDMY~X
z=xcoi*UZ#AI-XA9fl>tMPw+vazrYhk0hm6+2RpmWKA%zq@O$`xD1#?T5#TKOmC4`<
zg}{jdAaJ4p2%IPY0w)T9z^UT}!Dnd$$`)+4W_f}s%NT=r{E!b>EQik%h9`_ObiX}k
z9ck8GGoUT1MtzD|y;m-~#h(KC;78jH-lE#r*CXzyg?dMR4p<%e-BhV$_LKZA7`>te
zSoxFKv00+peD=1neg(-`f3gacT038|1t3&q(5#&=*#dB70%SK&;!F^M69quvL;(;u
zQ2+!^6aaw}1%MFv`x`GS({du9UK^I(8W+eBz;>S|3m2Vf1>^`|+iF2auA3<32(Ume
zf7WrC55x#Shqhr-+os9XWj>H~8B}!}1(Q4*+eqQzVtv84rm
zgT}zzJ4uFe)&_las6y7_=w!pT3>70s05v}-ui&~^tQ9m9+#B)mbq2@CnhIMH92Z4`
zE`xlr6rold@wa_vP1|y2f~{Z8|1&`vx~d6eO@vz4Cs4YZzjRU=igSdhdEL7uLgk3G
z#Fip}kKq8Zo}kGI12};AM{>3LFK~bmCMwv$Tg=#_Eso7aNGMGH0RVa0vTWzJyZ`_I
M07*qoM6N<$f*prX9RL6T
literal 0
HcmV?d00001
diff --git a/src/assets/images/其他.png b/src/assets/images/其他.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b0bcbc6788b7486e3dee94f427b28128fa5d6f8
GIT binary patch
literal 791
zcmV+y1L*vTP)u#yGqW?91#+ahtsgc&>iY;06TV}L9+wVs
zLLmpnfj9p7`tk0P>cBJJ1vEeDE;ObM`%NQZ9Uk#2U`F^qXrTLfNv*;Y-UPUWxA>GG
zE}*re>ssTDDYuf`XC%C>R{9;hQ<2EPu_{&GY0kb+bK3KZUwT0&w01q^RV
zB_YvH@anc+DQI}2zEH(Z(jzwK5kTQh<(DV}8Y{cY>Xl1XCjq4jZ*i0`a|+POZRx@j
z3SF1O*8d6^H}DMQWn-3vsZ(Ie$!%Ggdg6SnfH@0qIab0E0dpGOazw%*0dpSSa!A5o
z0fB_KtQ!fNbTPRKh#o%|i6L;tUOR1s=mjQ9i0S2-`9w~I%S04_z=;A7I8gusCkjB|
zEWjhRDsb-{uv`PqpBNS5#{uy5C$Kdbm2dm-hL^1{1%28u!B4x@fA<}DzL#A@A-2MI
zO^?66;vSy3b9QtO-7Agg6j)mX9xNgiG+iED9DTmngBW5XfO;=&_(@2jOZm!pOrCQhpv;|+AN<0hL1>6=CkYp)!
zgZxDeK1t4&u00d4HfWV0Y5I9kQQ!Rx)%17U&(r-Y@
V3g;l--@^a^002ovPDHLkV1kL9M9BaE
literal 0
HcmV?d00001
diff --git a/src/assets/images/医院.png b/src/assets/images/医院.png
new file mode 100644
index 0000000000000000000000000000000000000000..2da56bad9c7d152e7638da4d99e5c957888efcb4
GIT binary patch
literal 1158
zcmV;11bO?3P)7-q
z9^>vcfC;4BX0R-iCkQbIaK|J-VFchwdrs?U*AwdFKLp>})`|8s!5#l)JbSJyo%nzx
zQ2eiS`m2M=2A7a>pi`s^Um?UJgc!78Zh8`U@xK8ugp{k|KPjh$+qBg^*~kmDTM9;oO#B$hLp)tX&Ms9_=U&)VKrWe>4ESOnfE$FxKK}KAexiF%l|u_
z_g6I!TdfPIX!`D%eWSnk)Z`JGX+li=OK*FmRTZ
zclhF;3!6@;H~qu&{oo2SMiX3lniKzA*mOdXaOKg7;M5sI!m8%;WkFC`sVV;dSn~d+
zs1~b#CeDiaXdHr+_XW{3Mu>g2h}DF7Az&nK>aENz@xLg_T|3s0vg%PnxQtoq%5r~i
zU%z#8j^IKnzD^(`$kh+yw$E5M#E<~}_Q#fNqr`Aqh-WzznMk{oep@;E`UbHiKzrUe
zWj`|A0_rXPxs8)p^on`PI?)iR)()=tx8YgmeG|U)XW~#NB2iBQ#kQKD?-_c+sOH+l
zM%N%N?DfLB*s_!0E^R+5YFqkM68sh6N5`d^L2Sa9z3-nHmFGM31k!=OH8$0W*&c&H
zaop&FYmZRxyYXCiiR@`vA3hrwU48y1=TeozD1?NqvBn7a>gzh99zwWC7?#WHyxVa9
zDLPLAEaA{5OieNSf@X|Q8C~Zj$Vq}*Q_O3mF;u)4G4E7y}D
zgoL4Pu+~4M8y7|`ur^wCVReGrmLPO)vdO+J!0oQ-bZ#`a|h&-@XXrKpxvjoPoyqb=Ml(W-=VMqToQbZ%$R#0
zbWC6BxAyQ}ws5mU$dMS|Te5AQtctc5Z}TSPR0_-P^mT&URo%Ns^!eDSD-Dn4*pRze
znt8X+=z7$NlUU>?fg8_RkNf8&Va+~nNB6B;w@9P&YX=-jAatGt97!N_o&*F`jAMOR
zs|f~yW7vP&5H<$uX8~LiMhSX)XAvh+Y)CQ20XiQJIFdl3Ea$hC$;HUIzs07*qoM6N<$f|#EucmMzZ
literal 0
HcmV?d00001
diff --git a/src/assets/images/危化品.png b/src/assets/images/危化品.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d39ecf8537e168ad302a0c8796897e0fd65ff56
GIT binary patch
literal 1885
zcmV-j2cr0iP)3SkacCqsB#}^^8@D6})TS5P2b6|OoWG#1
zkcf+f8V#!Ow^gazIKLpmrf(6TiD4@n3+71n)n^adpe=hkLUa2z=W>@WNUzP_{f29V4a|Q
zj-NOb+pgOWhS+R3oG$>h#|0)TI-t^g?LK4R-+lROY@2RBLC^&OSeC3dUn4h_JhV=HkN0f;
z9>2^D^iu&QYytRz_f^z&a!=b0p8WW461c)z{fOwXwL>W%Fh9ADS)gdAgWOmOWL_OS
z1lv#iaIaDTbL%EgKPmK6U04|!1tv<-Am;q9U@~MZs*MK7ovfLDL=hBF&Irv<-r1;?
zxt<54yRb5R928J?gaRq1L6eV{Ukg9_Sb0!HSpbXWp$aaaRZxT?y2D3$!Vf11Y6iDs
zX<_Acb|R#KmMh$I(3_^^2MUmaYtSx0YL9d!_yy3wKw)GJGeq`vu0Eh}wh{dNeE)Ii
z1MrYo81X3^?1Bb{N@Hq5P{+*V2_w-U4TJ`yx*eEQO--IKem>yB)V-XLK^{^d09kyx
z<}eVhR7xPEtle0T`y@=lnnpSOR8%k}^W#
zO6XbEEsiP+Ag(a#`@!6&Uz`lRGIW_GXb=RlXjyde9lZG~X2VI62MV-Ph;-W#RX=tGJvyjG9p!)pP|?)C0G
zx6Me}v~@8P4jsr>)OiAG0mE7X3WoqR=X;$LUxCV4VoTw;e!c
zT1P?E&KZV#f2{M}Y6_8+53oXoBb-DxW0l4NZ{yK39%
z2d!J5r4}G5Sb;T1fSp6r7201MP-*e%&~j5-Heq+Pq7vD0GMyCrHzrs=q%|Y4AS#1k
z6@ghET{JmV!rj{18Re$SSOUOu
z*iv$5C*on~$oM|w8-ByH=vj;!DE$1T@(`;|z;cBt761k6Ka0yhdEy<9nmlo-JX|7A
zP73uh7e0fX9AO1RGF-YmwLu;nPOOl`ORL{gKu78d)1$1Bb}YatfSB;$cphcfV*whJ
za3XF&B_zj9dT^v4FfG0mrC@6Tl3aZ@PT;^kAW?tFG$uMO$Cx|J-Dg}dh=iVslwPED
zp~<8EP%hP{krk$&usC3pcKwMqZJp7m4a(T$$kvvB8w}Fh>s6x;Xx7K!f(9BVL@4Lq
z`fxILCTn*@p)`tSG>EY8`+Pot6e37_Mp$A*)RbQ_&G5CJ1UW0|P&8VZ?QL&aSJ?jo
XamJ5a#Uiut00000NkvXXu0mjfDuiPh
literal 0
HcmV?d00001
diff --git a/src/assets/images/厂房.png b/src/assets/images/厂房.png
new file mode 100644
index 0000000000000000000000000000000000000000..11dd1d591b0b3718edffd426eedb2fdcc30cbbec
GIT binary patch
literal 739
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
literal 0
HcmV?d00001
diff --git a/src/assets/images/学校.png b/src/assets/images/学校.png
new file mode 100644
index 0000000000000000000000000000000000000000..e698b5dcc594d527c885db416a8c880370a0da6f
GIT binary patch
literal 754
zcmVn6~yMK&-E?MgO@#tKFu^0fz
zX{n#e?=B+6HJwT@wn}+tfy=*%N7^*mACJy9MmqBTG6`_p0(dbNL#FXIu&)F<{)#h~
ze-jU!xdy8Qx=T6Z-9Ls)sacLv?#JO?NPuI&HIP==yrlZU_cFtUdja@Kv4J=m^@IhT
z{V&^ZQY9n+js}`SSj|>kXEg`6VMp0*IllE++C5!@N|CzvCHfS7?`7sexces_DkVdfN
z!s;hutLQM_+AIeYc7KzekY)#JbV8-66Qb`sAW8570Q_lb8EsT~P)em{L;0c&o`>@7j7?+K#qFGY5)vo3+HZui02xz6ZM2P6re=p`UY
z@I)^GNrFc+m0nOi!38bX^iqjbH6$#l0kd6xuc9|&tD?%e|IpDIjmP1xCSU_~riQdi
z#L(zK9c`*m<7FZ@C3y)!Rb&z+wi-kwG_8UfpSARCt{2o6T+8Fcg4air(w9F4YG00z|Vx)4PBs6I7X?=>%0K
zr~_~SXM#G=0F^hWFFeN+xOmVLs>+f`krXMJ`hWn=k7)8UMZWi_T%ArQ@Cg^}7T-RJ
z@{O-NR{5C=yhz}J
z-2lL@
z7>1<9j09Amh*&lwR2Rm0h5~^4EG^!uN+`(c+&HLIq?9Doa)ddFI8c#CigKJl3ry@e
zSyJT@Zv)lsa&VkLRpVbH4#1cs%CCmB5q!i5i-eNkCBPz~gHH)$DODuEKGY{FTi3=EoX`y$6)3AKkUFM-a(8QGfP>=^+Eq+M?zlQ5+drqPf|
z@OhqKo6fQHN}xw(9;ZG!1@8KG3DwHd&_`{i!k%`9-fU8}p0G1H@brjM_4%#C{vD}G
zUDf;6EzdUGQxywnQFc<;bt$1)`Nd}zp(f(K`Lqe$hQG(|n6uoWV_Fs+ulugCPViYI
zED}nBmjH`|5@!;)V4KGGt41iBHH#t5YsNyBN~g60jMzfNxUa{A6;vL^Z!0^$k{1%@Vf)_
zNSI^BsLEMgp;ZE<&X-V3X>!+=kI1%2ynmF=_-6o~K~&rCKLFq_eg_+tC;sRr00000
LNkvXXu0mjfT5g(C
literal 0
HcmV?d00001
diff --git a/src/assets/images/影剧院.png b/src/assets/images/影剧院.png
new file mode 100644
index 0000000000000000000000000000000000000000..4e60bed49cc72aa06718f98e35bee48814323610
GIT binary patch
literal 1040
zcmV+r1n>KaP))x^3Bfnx(Tq*P%eQZT0CjOV9Ozs~6PggwEs^>h
zm&{lb(HnneIsNU@#Iul)CiIPno`~qP@RlWCpXK!4g*_)FAx)ImUmHAp84HjRR2e5D
zAx)I$9|J74C8AkKRh)!`G*RBa54hx>b4iw~oZ*ejfQD5fO=upN0LF;JDoyAr#A2P2
zfE@7B(el^GFW#_*Lrn?e(#7$(awVuVQF6Tw_~2Ez%W`E?YgCeuCNx6{b3H(9=|UO&
z+0AnwVUy*`QLS-A0%D9M_NC#1-?N;4n7>F9<((Vh{X13`R5phCn%FS)Ns=EVfPl4!
ze3x0Sysy{#BfM{srYXTUE^IMcd7reqj
zkpSbR(zW3!O_ZD`f@}B4JGFqsB^AKS_De{&wUkO2HCW48UG#N_SyzN
zE^uQcX<|feuW$L2K$Bntm%%ZYA(WyivbhbC7%h*^l|Zl3ISDpncAW7|*&*>koE~)
z)8r?_cikpOWo*MhTUmOC8YE%yf;N4Hhq*$iND{V&*C2KA@b%zoZ;x7HVQ2Y(&r{3}
zoVP?twhpX>m4gKBskPxH*Y+51j=m%2+is;vA;}q5XcAmA|4oCgY-3E7JWKrcHPZ3F
zyql>@7`zB$lfp;FN23#RZ4>(jW!4H^9i9XYkOYfzhlc@a8NyftdXF*4uCqBxPZ0Og
zj9kVx%j>(lfSav5>^2A4WF@mtz@oP;6|r=+%Ghgo5RS%m_{9@yNCK#8dkrOUjvtpQ
zn6P=1tt!dHQVZNDp1_f319D9W4N-}Z!5X2;$??g5rvYam3
zuGabC%m0ArNg#BL(E=0fI!Y2S1;1hxxQi|v;Qcpq7K%m*CGQ_03MEu|-$bvKVDr9-
z-YUW6eG|P=0#3m-u9}>y_9+}%pGQXDG15Rnf#^w~frJ9llRyIr1)?W`1`-NHPXY}j
z6o{S#8b~P6rvb`*Z)x1*y@=kBP=3?B$=8i~8xDBkdn$R8uGcw%Pp|R1z_abTC=#Pf
z712}&n<}C!kyWaQvQH?hBI*NK{gt8UJ4PBvD8S)ht)aaK5&Z+)6)o0m3zFOb0000<
KMNUMnLSTXz4BPks
literal 0
HcmV?d00001
diff --git a/src/assets/images/轨道交通.png b/src/assets/images/轨道交通.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d2483a4b4edd16a945d96b2ef342fcb6423b74f
GIT binary patch
literal 1161
zcmV;41a|w0P)JwQkh6NpSK40L288zUX)3KLQbODp&*pfueoww4hwv9Xnnm4OK)mTm|r
zETvMD!5uozsome2vwMF0zK`!7y9NZTZMj`=@F;6c{UX4|3P9r$kofrr;Prce
zgCDs=w|AbI4Pat{$=aq{&bxTeufG8AJ_4CHA5a(XSzmqWTEK)Y02sK79eQ*Og<>q+
z2PSL*jDZ$*?BW8DA+?Od&t)2x0PAg6a}JiUlAgCPL*
z80wq?ycV$d{`XvA2oO=*hB&9uVGJn!?^(P6WTt>
z6mEijYL8zyvIt}WoPpawBw|#6KZYuTW%vMD088vO&J!R&7LMTqbPq7ZM6hYGM@;qvx|ImC=bSAgl1|LzBlPVlXY
zZvj*O{tv_pq855Ac3>6ye+Xf&C=c*q!*LgWLxsTl0BRlJ!v@3HH{QG+i?;$I+HV2A
z9srp^K(e1V4tH71utBm446v8d$T_0~;D!x#!A2;+6%jjUTm>-0hDf6VxFRCwoGUQ&H3?E4KN_`lAIQ{l7q9*
zFu;Js2qDJ@QU##C0iLF=*aAW^n^|v;Qw2Eg@E?DkNU;K>=gJC5(px|nfRx1qJy`)s
zmH?svq%;Pwow16bB0wiBum6fzFNRnH?Rwn?(lJ-_RQ2=9PPk=HK
z8)4#lAh`mZ%m7P?L$-h<04X_%0m+O2k^rRaBn2ch0@yRy|AC}{WcIy)A0%7>JiG^R
z=N72)=}Z3uY6(eijwdR>zX6s6AOX!)U_fbi*_;kYCIrxW1FX3f4ruKzrvs8n0Sy1M
z^Kmq{!hwkKwP_+#K47zcns0Eb104c%%16tlP9*~R+pwj>K0$ZR6BOD3fbXp)PumaTl#f|>OrYC@A08#-H
z^wdH?(i4F5349t=FhNha=AHm)VF8CKm|%~=rmyb-iUCL^Ob|w&)?4iWq!K3Brx%b|
z$s6EliZs9?{)P`oY`pwcv#lZxFre9DaT^@k#dEM12L-zz#NU|*a|qK`S~^t_-}wEV
b=VtFekWSH5jJdf)@dZ#FN&I)D)!IKmh~Zci_33zbI+BC^evecLS$zed
zk74bov!u`Z??&a>CPmkxiXde50l=7!5r8YlCbj?;0Pa|(HqAY?Tm0l1#Li4}k;$1n*Nfu6p8DmS5>@nA;7`yAw{aK@vsiDfVr>+xhEul!)Z&q{&H(G;H1R<+&&!d5fa1j7_r=vaL$`mp?
zMWDp!6fZ{HjJw)1SwiQ@0n7n>2k=ql*+3rvJ_Gnc^#X2g=z%u!Hn9jw53i;g0M!$9
z7%nNa70mA@BYNX~g~<{|jGfQ|jBJV^D$h!~_KxxTt@qL@0@VsQ>w_axyskrHaXRJJ
zG`h9Sb{ffxuI3tTc^si
zf~v;s<^Nd2VHauIF3KcOED;KyN|Fg0Dl6`GV~DV<N16ts#a8Rx`oAP^pe9>O8~k
z7*|vrHK85mtl>AdYni8Hm0c;h5-2VacB$7e
zQ1oHBCYK0hs=WzyC<+Bn;Btr%D>1SqI2v&{#;I#!BxI#$w|+JJOGg){nJ*oUgsgM|
z_08qHI-!=Zjj;*CgCO4!Dnc)o@=#Rrp12JWA#|dZo5D9_hKLX~J$9wG(#08H5#~Le
zWAsX(e4;~eVnoAe5Yk3VyHB*<$!Ybik0qQWF|viCl~V%cD#ED~BU_?w`fyH+P5})!
z>k8E1%fsW#mcHXv9K)lc=5GLxeHWm{djQu*-|1yP^@pfGPqbsSEl|7*Nlkk~)2^NA
z+0Q_Md_wQn6h&tJyz_kl#Iy+p00000NkvXXu0mjfN8r(?
literal 0
HcmV?d00001
diff --git a/src/assets/images/餐饮.png b/src/assets/images/餐饮.png
new file mode 100644
index 0000000000000000000000000000000000000000..41174620c84de5e90274284cefe0d3549722fa04
GIT binary patch
literal 828
zcmV-C1H=4@P)gbtR2?~to6Y$^z;Af$q&1gC;P
z1q&CS;qLe1?ZD{(Dj-iDiFJ%5{7=HR{JX#ten$S78O@Buhs)&x*ZJtW02o9doEHIu
z2*js{eRJr|0nBrwJNQv-dn)!g~jR7P8Mv_m@{8jbY1b%cfIXzpeLm+v`H*WId^g-Es;BW4l
zQ5qi%W6KgwIT7T)Fj>q2z*A=Q4SqB=IX&~15PB1d73`!YPGdoC^y%ihhOv<+Or)cs
zw=Q+PLCm@XnK$$4mzsC_$*m`8XlDOmMg&TT*pj$t_|E&(UHs_K|oW*$+0b)W$E=K%tMyIaEDuQJswLB6Ixl3(znN{Ll9
zOCa-)TO!ByT8NPvSP*KY$`_|ejw2$cQBEfzpfN{Hg_Krvv~0Rb4_G#Tj)
zWnx0mvKVlWm!hjiF?XPwy_%h~5eoGq?pp%6ft5Cw0Y*jUUc?<%9f<=f7QC~qL@xrZ
z26ZdIHlPiX_bkD9Ys(Tdoi*GOp;Xe*a+E))S_CSKyBrJhEVz5$ptFQpm03%XK9f!a
zZA9(A2oyy6yF5x