2024-07-31 10:27:27 +08:00
< template >
< div :id ="mapContainerName" class = "map-container" >
2024-08-05 08:25:10 +08:00
< div class = "search-container-box" >
< SearchComponent @toPosition ="toPosition" @handlerFilter ="handlerFilter" > < / SearchComponent >
< / div >
2024-11-09 16:56:31 +08:00
< div class = "map-type-switch-container" >
2024-11-12 10:29:20 +08:00
< div class = "switch-button" v-if ="mapAngle == '3D'" @click="handlerChangeMapAngle()" >
< TableOutlined style = "font-size:20px;position:relative;top:1px;left:-6px;" / >
< span > & nbsp ; 二维地图 < / span >
< / div >
< div class = "switch-button" v -else @click ="handlerChangeMapAngle()" >
< GlobalOutlined style = "font-size:20px;position:relative;top:1px;left:-6px;" / >
< span > & nbsp ; 三维地图 < / span >
< / div >
< div class = "home-button" @click ="handlerInitialize" >
< HomeOutlined / >
< / div >
2024-11-09 16:56:31 +08:00
< / div >
2024-07-31 10:27:27 +08:00
< / div >
< / template >
< script lang = "ts" setup >
import { ref , onMounted , defineExpose , defineEmits } from "vue" ;
import { generateUUID } from '@/components/MapboxMaps/src/tool'
import { WktToGeojson } from '@/components/MapboxMaps/src/WktGeojsonTransform' ;
import mapboxgl , { Map , Popup } from 'mapbox-gl' ;
import { MAPBOX _TOKEN , TINADITU _TOKEN , MAP _VIEWER } from './config.ts'
import heatGeoJson from './data.json'
2024-08-01 17:25:52 +08:00
import { getPolygonCenter , getUserOrgs } from '@/api/tiankongdi'
2024-07-31 10:27:27 +08:00
import axios from 'axios'
2024-08-05 08:25:10 +08:00
import SearchComponent from './SearchComponent.vue'
2024-08-10 18:09:02 +08:00
const { VITE _GLOB _YINGXIANG _SERVER } = getAppEnvConfig ( ) ;
2024-07-31 10:27:27 +08:00
import { getAppEnvConfig } from '@/utils/env' ;
const { VITE _GLOB _API _URL } = getAppEnvConfig ( ) ;
const VITE _GLOB _API _URL _VAR = ref < String > ( VITE _GLOB _API _URL ) ;
2024-08-03 08:29:23 +08:00
import { waiData } from "../LargeScreenMap/linyishi" ;
2024-07-31 10:27:27 +08:00
const mapContainerName = ref < String > ( )
mapContainerName . value = "mapContainer-" + generateUUID ( ) ;
2024-11-09 16:56:31 +08:00
2024-08-19 10:51:59 +08:00
//
2024-11-12 10:29:20 +08:00
import { TableOutlined , GlobalOutlined , HomeOutlined } from '@ant-design/icons-vue' ;
2024-07-31 10:27:27 +08:00
const emits = defineEmits ( [ "onload" , "handlerGetDetails" ] )
2024-11-09 16:56:31 +08:00
2024-07-31 10:27:27 +08:00
let map : Map ;
2024-11-09 16:56:31 +08:00
2024-07-31 10:27:27 +08:00
// init map
const initMap = ( ) => {
return new mapboxgl . Map ( {
container : mapContainerName . value ,
language : 'zh-cmn' ,
2024-11-09 16:56:31 +08:00
projection : 'globe' , // wgs84参考系
2024-07-31 10:27:27 +08:00
style : {
glyphs : 'mapbox://fonts/mapbox/{fontstack}/{range}.pbf' ,
version : 8 ,
sources : {
'raster-tiles' : {
2024-08-06 16:55:39 +08:00
type : 'raster' ,
tiles : [
` http://t0.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk= ${ TINADITU _TOKEN } ` ,
] ,
tileSize : 256 ,
} ,
'raster-tiles-font' : {
type : 'raster' ,
tiles : [
` https://t0.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk= ${ TINADITU _TOKEN } ` ,
] ,
tileSize : 256 ,
2024-07-31 10:27:27 +08:00
} ,
2024-08-13 11:22:15 +08:00
// 'raster-tiles-geo': {
// type: 'raster',
// tiles: [
// VITE_GLOB_YINGXIANG_SERVER,
// ],
// tileSize: 256,
// }
2024-07-31 10:27:27 +08:00
} ,
layers : [
2024-08-06 16:55:39 +08:00
{
2024-08-07 16:04:35 +08:00
id : 'tdt-vec-tiles' ,
type : 'raster' ,
source : 'raster-tiles-font' ,
2024-08-12 16:35:12 +08:00
maxZoom : 32 ,
2024-08-06 16:55:39 +08:00
} ,
2024-07-31 10:27:27 +08:00
{
2024-08-07 16:04:35 +08:00
id : 'tdt-img-tiles' ,
type : 'raster' ,
source : 'raster-tiles' ,
2024-08-12 16:35:12 +08:00
maxZoom : 32 ,
2024-07-31 10:27:27 +08:00
} ,
2024-08-13 11:22:15 +08:00
// {
// id: 'tdt-wms-tiles',
// type: 'raster',
// source: 'raster-tiles-geo',
// },
2024-07-31 10:27:27 +08:00
] ,
} ,
2024-08-12 16:35:12 +08:00
maxZoom : 22 ,
2024-08-09 09:30:12 +08:00
minZoom : 8 ,
2024-11-12 10:29:20 +08:00
zoom : 8 ,
2024-07-31 10:27:27 +08:00
pitch : 0 ,
2024-11-12 10:29:20 +08:00
center : [ 118.30207505530701 , 35.30123435040745 ] ,
2024-07-31 10:27:27 +08:00
} ) ;
} ;
// 获取图斑面数据
const polygonVisibility = ref < String > ( "visible" ) ;
2024-08-05 08:25:10 +08:00
const isRootLevel = ref < Boolean > ( false )
2024-08-01 17:25:52 +08:00
async function handlerCheckUserOrgs ( ) {
let orgs = await getUserOrgs ( { } ) ;
let isLevel = orgs . find ( ( item , index ) => {
return ( item . name == "临沂市" || item . parentId == 0 || item . parentName == "根节点" ) ;
} )
if ( isLevel ) {
2024-08-05 08:25:10 +08:00
isRootLevel . value = true ;
2024-08-01 17:25:52 +08:00
handlerLoadPolygon ( "" , "" , "" , "1" )
} else {
2024-08-05 08:25:10 +08:00
isRootLevel . value = false ;
2024-08-01 17:25:52 +08:00
handlerLoadPolygon ( )
}
}
function handlerLoadPolygon ( code = "" , filter = "" , type = "" , level = "" ) {
2024-07-31 10:27:27 +08:00
let sql _filter ;
if ( code ) {
sql _filter = "&filter=\"countyid\"=\'" + code + "\'" ;
} else {
sql _filter = ""
}
let map _filter ;
switch ( filter ) {
case "合法" :
map _filter = [ "all" , [ "==" , [ "get" , "is_illegal" ] , 0 ] , [ "==" , [ "get" , "handle_status_id" ] , 5 ] ] ;
break ;
case "其他" :
map _filter = [ "all" , [ "==" , [ "get" , "is_illegal" ] , 2 ] , [ "==" , [ "get" , "handle_status_id" ] , 5 ] ] ;
break ;
case "补办手续" :
2024-09-11 17:40:48 +08:00
map _filter = [ "all" , [ "==" , [ "get" , "is_illegal" ] , 1 ] , [ "==" , [ "get" , "measure_name" ] , "1" ] , [ "==" , [ "get" , "handle_status_id" ] , 5 ] , [ "==" , [ "get" , "weifaleixing" ] , 0 ] ] ;
2024-07-31 10:27:27 +08:00
break ;
case "拆除复耕" :
2024-09-11 17:40:48 +08:00
map _filter = [ "all" , [ "==" , [ "get" , "is_illegal" ] , 1 ] , [ "==" , [ "get" , "measure_name" ] , "0" ] , [ "==" , [ "get" , "handle_status_id" ] , 5 ] , [ "==" , [ "get" , "weifaleixing" ] , 0 ] ] ;
2024-08-08 09:47:23 +08:00
break ;
case "违法" :
map _filter = [ "any" ,
[ "all" , [ "!=" , [ "get" , "is_illegal" ] , 1 ] , [ "!=" , [ "get" , "handle_status_id" ] , 5 ] ] ,
[ "all" , [ "==" , [ "get" , "is_illegal" ] , 1 ] , [ "!=" , [ "get" , "measure_name" ] , "0" ] , [ "!=" , [ "get" , "measure_name" ] , "1" ] , [ "==" , [ "get" , "handle_status_id" ] , 5 ] ]
] ;
2024-07-31 10:27:27 +08:00
break ;
default :
map _filter = [ "!=" , [ "get" , "gid" ] , 0 ] ;
}
let type _filter ;
switch ( type ) {
case "农用地" :
type _filter = [ "==" , [ "get" , "typename" ] , "农用地" ] ;
break ;
case "建设用地" :
type _filter = [ "==" , [ "get" , "typename" ] , "建设用地" ] ;
break ;
case "推堆土" :
type _filter = [ "==" , [ "get" , "typename" ] , "推堆土" ] ;
break ;
}
if ( filter && type ) {
map _filter . push ( type _filter ) ;
} else if ( ! filter && type ) {
map _filter = [ "all" , [ "!=" , [ "get" , "gid" ] , 0 ] , type _filter ] ;
}
2024-08-05 08:25:10 +08:00
2024-07-31 10:27:27 +08:00
if ( map . getSource ( "historyLayerLine" ) ) {
polygonVisibility . value = map . getLayoutProperty ( 'historyLayerLine' , 'visibility' ) ;
map . removeLayer ( "historyLayerLine" )
map . removeLayer ( "historyLayerFill" )
map . removeSource ( "historyLayerLine" )
map . removeSource ( "historyLayerFill" ) ;
}
2024-08-01 17:25:52 +08:00
if ( level ) {
} else {
sql _filter = '&filter=streetid in ( select CAST(\"OrgId\" AS VARCHAR) from sys_userorg where \"UserId\" = ' + localStorage . getItem ( 'userid' ) + ') or countyid in ( select CAST(\"OrgId\" AS VARCHAR) from sys_userorg where \"UserId\" = ' + localStorage . getItem ( 'userid' ) + ')'
}
2024-07-31 10:27:27 +08:00
map . addLayer (
{
'id' : 'historyLayerLine' ,
'type' : 'line' ,
'source' : {
type : 'vector' ,
2024-09-11 17:40:48 +08:00
tiles : [ VITE _GLOB _API _URL _VAR . value + '/api/DroneCaseInfoSingle/QueryVectorTileByTable?z={z}&x={x}&y={y}&table=view_drone_shp_data' + sql _filter + '&field=\"gid\",\"handle_status_id\",\"is_illegal\",\"measure_name\",\"typename\",\"Id\",\"weifaleixing\",' ] ,
2024-07-31 10:27:27 +08:00
minzoom : 1 ,
2024-08-07 13:43:42 +08:00
maxzoom : 20 ,
'cluster' : true , // 启用聚合
'clusterMaxZoom' : 0 , // 最大聚合缩放级别
'clusterRadius' : 0 // 聚合半径
2024-07-31 10:27:27 +08:00
} ,
"source-layer" : "view_drone_shp_data" ,
'layout' : {
'line-join' : 'round' ,
'line-cap' : 'round' ,
2024-08-07 17:32:23 +08:00
'visibility' : polygonVisibility . value ,
2024-07-31 10:27:27 +08:00
} ,
'filter' : map _filter ,
'paint' : {
'line-color' : [
"case" ,
[ "all" , [ "==" , [ "get" , "is_illegal" ] , 0 ] , [ "==" , [ "get" , "handle_status_id" ] , 5 ] ] , //合法
2024-08-05 14:32:30 +08:00
"#0AF703" ,
2024-07-31 10:27:27 +08:00
[ "all" , [ "==" , [ "get" , "is_illegal" ] , 2 ] , [ "==" , [ "get" , "handle_status_id" ] , 5 ] ] , //其他
2024-08-05 14:32:30 +08:00
"#0382F7" ,
2024-09-11 17:40:48 +08:00
[ "all" , [ "==" , [ "get" , "is_illegal" ] , 1 ] , [ "==" , [ "get" , "measure_name" ] , "1" ] , [ "==" , [ "get" , "handle_status_id" ] , 5 ] , [ "==" , [ "get" , "weifaleixing" ] , 0 ] ] , //补办手续
2024-08-08 09:47:23 +08:00
"#AD04F4" ,
2024-09-11 17:40:48 +08:00
[ "all" , [ "==" , [ "get" , "is_illegal" ] , 1 ] , [ "==" , [ "get" , "measure_name" ] , "0" ] , [ "==" , [ "get" , "handle_status_id" ] , 5 ] , [ "==" , [ "get" , "weifaleixing" ] , 0 ] ] , //拆除复耕
2024-08-08 09:47:23 +08:00
"#F4E004" ,
[ "any" , [ "all" , [ "!=" , [ "get" , "is_illegal" ] , 1 ] , [ "!=" , [ "get" , "handle_status_id" ] , 5 ] ] , [ "all" , [ "==" , [ "get" , "is_illegal" ] , 1 ] , [ "!=" , [ "get" , "measure_name" ] , "0" ] , [ "!=" , [ "get" , "measure_name" ] , "1" ] , [ "==" , [ "get" , "handle_status_id" ] , 5 ] ] ] , //违法
"#F70303" ,
2024-07-31 10:27:27 +08:00
// 默认
2024-08-07 17:32:23 +08:00
"#F70303" ,
2024-07-31 10:27:27 +08:00
] ,
2024-08-05 08:25:10 +08:00
'line-width' : 5
2024-07-31 10:27:27 +08:00
}
}
)
map . addLayer ( {
'id' : 'historyLayerFill' ,
'type' : 'fill' ,
'source' : {
type : 'vector' ,
2024-09-11 17:40:48 +08:00
tiles : [ VITE _GLOB _API _URL _VAR . value + '/api/DroneCaseInfoSingle/QueryVectorTileByTable?z={z}&x={x}&y={y}&table=view_drone_shp_data' + sql _filter + '&field=\"gid\",\"handle_status_id\",\"is_illegal\",\"measure_name\",\"typename\",\"Id\",\"weifaleixing\",' ] ,
2024-07-31 10:27:27 +08:00
minzoom : 1 ,
2024-08-07 13:43:42 +08:00
maxzoom : 20 ,
cluster : false
2024-07-31 10:27:27 +08:00
} ,
"source-layer" : "view_drone_shp_data" ,
'filter' : map _filter ,
'layout' : {
'visibility' : polygonVisibility . value ,
} ,
'paint' : {
'fill-color' : [
2024-08-08 09:47:23 +08:00
"case" ,
[ "all" , [ "==" , [ "get" , "is_illegal" ] , 0 ] , [ "==" , [ "get" , "handle_status_id" ] , 5 ] ] , //合法
"#0AF703" ,
[ "all" , [ "==" , [ "get" , "is_illegal" ] , 2 ] , [ "==" , [ "get" , "handle_status_id" ] , 5 ] ] , //其他
"#0382F7" ,
[ "all" , [ "==" , [ "get" , "is_illegal" ] , 1 ] , [ "==" , [ "get" , "measure_name" ] , "1" ] , [ "==" , [ "get" , "handle_status_id" ] , 5 ] ] , //补办手续
"#AD04F4" ,
[ "all" , [ "==" , [ "get" , "is_illegal" ] , 1 ] , [ "==" , [ "get" , "measure_name" ] , "0" ] , [ "==" , [ "get" , "handle_status_id" ] , 5 ] ] , //拆除复耕
"#F4E004" ,
[ "any" , [ "all" , [ "!=" , [ "get" , "is_illegal" ] , 1 ] , [ "!=" , [ "get" , "handle_status_id" ] , 5 ] ] , [ "all" , [ "==" , [ "get" , "is_illegal" ] , 1 ] , [ "!=" , [ "get" , "measure_name" ] , "0" ] , [ "!=" , [ "get" , "measure_name" ] , "1" ] , [ "==" , [ "get" , "handle_status_id" ] , 5 ] ] ] , //违法
"#F70303" ,
// 默认
"#F70303" ,
2024-07-31 10:27:27 +08:00
] ,
2024-08-07 16:04:35 +08:00
'fill-opacity' : 0.5
2024-07-31 10:27:27 +08:00
}
} )
emits ( "onload" ) ;
map . on ( "click" , "historyLayerFill" , ( e ) => {
2024-08-05 08:25:10 +08:00
console . log ( "handlerGetDetails" , e . features [ 0 ] . properties )
2024-07-31 10:27:27 +08:00
emits ( "handlerGetDetails" , e . features [ 0 ] . properties ) ;
} )
}
// 获取和处理图斑点数据
const currentCode = ref ( "" )
async function handlerDealPoint ( code = "" ) {
let sql _filter ;
if ( code ) {
sql _filter = "\"countyid\"=\'" + code + "\'" ;
} else {
sql _filter = ""
}
let points = await getPolygonCenter ( { tablename : "view_drone_shp_data" , filter : sql _filter } )
let heatdata = {
type : "FeatureCollection" ,
features : [ ]
}
points ? . forEach ( ( item , index ) => {
let geometry = WktToGeojson ( item [ 'centroid_point' ] ) ;
let feature = {
geometry : geometry ,
properties : {
mag : 1
}
}
heatdata . features . push ( feature ) ;
} )
handlerLoadHeatLayer ( heatdata ) ;
if ( map . getLayer ( 'clusters' ) ) {
map . moveLayer ( "clusters" , "heatLayer" ) ;
map . moveLayer ( "cluster-count" , "heatLayer" )
map . moveLayer ( "unclustered-point" , "heatLayer" )
}
}
2024-08-05 08:25:10 +08:00
function toPosition ( item ) {
2024-08-19 10:51:59 +08:00
handlerLocation ( item , 17.2 ) ;
2024-08-05 08:25:10 +08:00
handlerLoadSearchResult ( item ) ;
}
function handlerFilter ( item ) {
// handlerLoadPolygon("",item);
if ( isRootLevel . value ) {
handlerLoadPolygon ( "" , item , "" , "1" ) ;
} else {
handlerLoadPolygon ( "" , item , "" , "" ) ;
}
}
function handlerLoadSearchResult ( item ) {
let geojson = {
type : "FeatureCollection" ,
features : [
{
type : "Feature" ,
geometry : {
type : "Point" ,
coordinates : item . location ,
} ,
properties : {
name : item . id ,
} ,
} ,
] ,
} ;
2024-08-08 10:26:37 +08:00
// if (map.getSource("searchSource")) {
// map.getSource("searchSource").setData(geojson);
// } else {
// map.addSource("searchSource", {
// type: "geojson",
// data: geojson,
// });
// }
2024-08-05 08:25:10 +08:00
2024-08-08 10:26:37 +08:00
// if (map.hasImage("searchIcon")) {
// } else {
// map.loadImage(
// "/public/statistical/search-icon.png",
// function (error, image) {
// if (error) throw error;
// map.addImage("searchIcon", image);
// }
// );
// }
2024-08-05 08:25:10 +08:00
2024-08-08 10:26:37 +08:00
// if (map.getLayer("searchLayer")) {
// } else {
// map.addLayer({
// id: "searchLayer",
// type: "symbol",
// source: "searchSource",
// layout: {
// "icon-image": "searchIcon",
// "icon-size": 1.2,
// "text-field": "{name}",
// "text-offset": [0, 2],
// "text-anchor": "top",
// "text-size": 12,
// },
// paint: {
// "text-color": "#fff",
// },
// });
// }
2024-08-05 08:25:10 +08:00
}
2024-07-31 10:27:27 +08:00
// 加载热力图图斑数据
function handlerLoadHeatLayer ( heatdata ) {
if ( map . getSource ( "heatSource" ) ) {
map . getSource ( "heatSource" ) . setData ( heatdata ) ;
} else {
map . addSource ( 'heatSource' , {
'type' : 'geojson' ,
'data' : heatdata
} ) ;
map . addLayer (
{
'id' : 'heatLayer' ,
'type' : 'heatmap' ,
'source' : 'heatSource' ,
'maxzoom' : 13 ,
'minzoom' : 7 ,
'layout' : {
"visibility" : "none"
} ,
'paint' : {
'heatmap-weight' : [
'interpolate' ,
[ 'linear' ] ,
[ 'get' , 'mag' ] ,
0 ,
1 ,
7 ,
0
] ,
'heatmap-intensity' : [
'interpolate' ,
[ 'linear' ] ,
[ 'zoom' ] ,
0 ,
1 ,
9 ,
3
] ,
'heatmap-color' : [
'interpolate' ,
[ 'linear' ] ,
[ 'heatmap-density' ] ,
0 ,
'rgba(33,102,172,0)' ,
0.2 ,
'rgba(103,169,207,0.8)' ,
0.4 ,
'rgba(209,229,240,0.8)' ,
0.6 ,
'rgba(253,219,199,0.8)' ,
0.8 ,
'rgba(239,138,98,0.8)' ,
1 ,
'rgba(178,24,43,0.8)'
] ,
'heatmap-radius' : [
'interpolate' , [ 'linear' ] , [ 'zoom' ] ,
4 ,
7 ,
11 ,
20
] ,
'heatmap-opacity' : [
'interpolate' ,
[ 'linear' ] ,
[ 'zoom' ] ,
7 ,
0 ,
8 ,
1
]
}
}
) ;
}
if ( map . getLayer ( 'heatLayer' ) ) {
map . moveLayer ( 'heatLayer' , 'historyLayerLine' ) ;
map . moveLayer ( 'heatLayer' , 'historyLayerFill' ) ;
if ( map . getLayer ( 'clusters' ) ) {
map . moveLayer ( "clusters" , "heatLayer" ) ;
map . moveLayer ( "cluster-count" , "heatLayer" )
map . moveLayer ( "unclustered-point" , "heatLayer" )
}
}
}
// 地图定位
function handlerLocation ( lngLat , zoom ) {
map . flyTo ( {
center : lngLat ,
zoom : zoom ,
bearing : 0 ,
speed : 1 , // 飞行速度
curve : 2 , // 飞行曲线
essential : true ,
easing ( t ) {
// 飞行动画函数
return t ;
} ,
} ) ;
} ;
// 获取县区边界数据
const handlerDealCountry = ( countyName : String = "临沂市" ) : void => {
let center = { } ;
let zoom ;
let filterName = "" ;
if ( countyName == '临沂市' ) {
center = { lng : 118.72504868812163 , lat : 35.180072027132915 }
zoom = 7.848587811931849 ;
handlerLocation ( [ center [ 'lng' ] , center [ 'lat' ] ] , zoom ) ;
} else if ( countyName ) {
center = MAP _VIEWER [ countyName ] . center ;
zoom = MAP _VIEWER [ countyName ] . zoom ;
handlerLocation ( [ center [ 'lng' ] , center [ 'lat' ] ] , zoom ) ;
filterName = countyName ;
}
axios ( {
method : "get" ,
2024-08-24 17:20:15 +08:00
// url:`http://175.27.168.120:8080/geoserver/linyishi/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=linyishi%3Axianjie&maxFeatures=50&outputFormat=application%2Fjson&cql_filter=xzqmc%20like%20%27%25${filterName}%25%27`,
url : ` http://120.222.154.7:8090/geoserver/linyishi/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=linyishi%3Axianjie&maxFeatures=50&outputFormat=application%2Fjson `
2024-07-31 10:27:27 +08:00
} ) . then ( res => {
2024-08-24 17:20:15 +08:00
handlerLoadPanelLayer ( res . data ) ;
2024-07-31 10:27:27 +08:00
handlerLoadCountyLayer ( res . data ) ;
} )
}
2024-08-28 08:26:37 +08:00
/ * *
*
* 县区边界 : countyLayer
* 县区面板图层 : countyPanelLayer
* 乡镇边界 : streetLayer
* 乡镇名称图层 : streetLabelLayer
* 遮罩图层 : mb - tag
* 图斑线 : historyLayerLine
* 图斑面 : historyLayerFill
*
* * /
2024-08-19 10:51:59 +08:00
// 渲染县区边界数据
2024-07-31 10:27:27 +08:00
const handlerLoadCountyLayer = ( geojson ) => {
// 绘制线
if ( map . getSource ( "countySource" ) ) {
map . getSource ( "countySource" ) . setData ( geojson ) ;
2024-08-24 17:20:15 +08:00
} else {
2024-07-31 10:27:27 +08:00
map . addSource ( "countySource" , {
2024-08-24 17:20:15 +08:00
type : "geojson" ,
data : geojson
2024-07-31 10:27:27 +08:00
} )
map . addLayer (
2024-08-24 17:20:15 +08:00
{
"id" : "countyLayer" ,
"type" : "line" ,
"source" : "countySource" ,
"paint" : {
'line-color' : '#6f7ff4' , // 设置线的颜色
'line-width' : 3 // 设置线的宽度
}
2024-08-19 10:51:59 +08:00
}
)
2024-08-24 17:20:15 +08:00
if ( map . getLayer ( "countyPanelLayer" ) ) {
map . moveLayer ( "countyLayer" , "countyPanelLayer" )
}
}
}
// 渲染县界白板图层
const handlerLoadPanelLayer = ( geojson ) => {
if ( map . getSource ( "countyPanelLayer" ) ) {
map . getSource ( "countyPanelSource" ) . setData ( geojson ) ;
} else {
map . addSource ( "countyPanelSource" , {
type : "geojson" ,
data : geojson
} )
map . addLayer (
{
"id" : "countyPanelLayer" ,
"type" : "fill" ,
"source" : "countyPanelSource" ,
"layout" : {
'visibility' : 'none'
} ,
"paint" : {
'fill-color' : [
'case' ,
[ '==' , [ 'get' , 'xzqdm_1' ] , "371302" ] ,
"#49B0F9" ,
[ '==' , [ 'get' , 'xzqdm_1' ] , "371311" ] ,
"#3EABFA" ,
[ '==' , [ 'get' , 'xzqdm_1' ] , "371312" ] ,
"#27A2FB" ,
[ '==' , [ 'get' , 'xzqdm_1' ] , "3713122" ] ,
"#34E6B1" ,
[ '==' , [ 'get' , 'xzqdm_1' ] , "3713001" ] ,
"#1099FB" ,
[ '==' , [ 'get' , 'xzqdm_1' ] , "3713271" ] ,
"#0695FB" ,
[ '==' , [ 'get' , 'xzqdm_1' ] , "371321" ] ,
"#058DEE" ,
[ '==' , [ 'get' , 'xzqdm_1' ] , "371322" ] ,
"#09C78E" ,
[ '==' , [ 'get' , 'xzqdm_1' ] , "371323" ] ,
"#047DD4" ,
[ '==' , [ 'get' , 'xzqdm_1' ] , "371324" ] ,
"#94D515" ,
[ '==' , [ 'get' , 'xzqdm_1' ] , "371325" ] ,
"#0568B0" ,
[ '==' , [ 'get' , 'xzqdm_1' ] , "371326" ] ,
"#3EABFA" ,
[ '==' , [ 'get' , 'xzqdm_1' ] , "371327" ] ,
"#49B0F9" ,
[ '==' , [ 'get' , 'xzqdm_1' ] , "371328" ] ,
"#27A2FB" ,
[ '==' , [ 'get' , 'xzqdm_1' ] , "371329" ] ,
"#94D515" ,
"#1099FB" ,
] ,
'fill-opacity' : 0.9
}
2024-08-28 08:26:37 +08:00
} ,
2024-08-24 17:20:15 +08:00
)
2024-08-28 08:26:37 +08:00
// if(map.getLayer("countyPanelLayer")){
// map.moveLayer("countyPanelLayer","countyLayer");
// map.moveLayer("countyPanelLayer","historyLayerLine");
// map.moveLayer("countyPanelLayer","historyLayerFill");
// }
2024-08-24 17:20:15 +08:00
}
2024-08-19 10:51:59 +08:00
}
2024-08-19 17:26:11 +08:00
function getMaskData ( ) {
axios ( {
method : "get" ,
url : ` http://120.222.154.7:8090/geoserver/linyishi/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=linyishi%3Ashijie&maxFeatures=50&outputFormat=application%2Fjson ` ,
} ) . then ( res => {
let geojson = { DATA : res . data . features [ 0 ] . geometry . coordinates [ 0 ] [ 0 ] }
handlerLoadMaskLayer ( geojson ) ;
} ) ;
}
2024-08-19 10:51:59 +08:00
// 加载地图遮罩
2024-08-19 17:26:11 +08:00
function handlerLoadMaskLayer ( geojson ) {
2024-08-19 10:51:59 +08:00
map . addLayer ( {
//蒙版图层 //通过边界数据反选 达到挖洞效果
id : 'mb-tag' ,
type : 'fill' ,
source : {
type : 'geojson' ,
data : {
type : 'Feature' ,
geometry : {
type : 'Polygon' ,
coordinates : [
[
// 多边形外围 需要进行遮罩的点 这里是给世界地图加遮罩 所以是世界的四个端点
[ - 180 , 90 ] ,
[ 180 , 90 ] ,
[ 180 , - 90 ] ,
[ - 180 , - 90 ] ,
] ,
2024-08-19 17:26:11 +08:00
geojson . DATA ,
2024-08-19 10:51:59 +08:00
] ,
} ,
} ,
} ,
paint : {
'fill-color' : '#ffffff' ,
'fill-opacity' : 1 /* 透明度 */ ,
} ,
layout : {
visibility : 'visible' ,
} ,
} ) ;
}
// 获取乡镇数据
const handlerDealStreet = ( countyName : String = "临沂市" ) : void => {
axios ( {
method : "get" ,
url : ` http://175.27.168.120:8080/geoserver/linyishi/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=linyishi%3Azhenjie&maxFeatures=10000&outputFormat=application%2Fjson ` ,
} ) . then ( res => {
handlerLoadStreetLayer ( res . data ) ;
} )
}
// 渲染乡镇边界数据
const handlerLoadStreetLayer = ( geojson ) => {
// 绘制线
if ( map . getSource ( "streetSource" ) ) {
map . getSource ( "streetSource" ) . setData ( geojson ) ;
} else {
map . addSource ( "streetSource" , {
type : "geojson" ,
data : geojson ,
minzoom : 10 ,
maxzoom : 24 ,
} )
map . addLayer (
{
"id" : "streetLayer" ,
"type" : "line" ,
"source" : "streetSource" ,
"paint" : {
'line-color' : '#42befb' , // 设置线的颜色
'line-width' : 2 // 设置线的宽度
} ,
minzoom : 10 ,
maxzoom : 24 ,
}
)
map . addLayer ( {
'id' : 'streetLabelLayer' ,
'type' : 'symbol' ,
'source' : 'streetSource' ,
'layout' : {
'text-field' : [ 'get' , 'xzqmc' ] ,
'text-font' : [ 'Open Sans Bold' , 'Arial Unicode MS Bold' ] ,
'text-size' : 12 ,
'text-anchor' : 'center' ,
} ,
'paint' : {
'text-color' : '#041B36' ,
'text-halo-color' : '#fff' ,
'text-halo-width' : 2 ,
2024-07-31 10:27:27 +08:00
}
2024-08-19 10:51:59 +08:00
} ) ;
}
}
let VillageGeojson = { } ;
const handlerLoadVillageLayer = ( ) => {
// 绘制线
if ( map . getSource ( "villageSource" ) ) {
map . getSource ( "villageSource" ) . setData ( VillageGeojson ) ;
} else {
map . addSource ( "villageSource" , {
type : "geojson" ,
data : VillageGeojson ,
minzoom : 12 ,
maxzoom : 24 ,
} )
map . addLayer (
{
"id" : "villageLayer" ,
"type" : "line" ,
"source" : "villageSource" ,
"paint" : {
'line-color' : '#42befb' , // 设置线的颜色
'line-width' : 2 // 设置线的宽度
} ,
minzoom : 12 ,
maxzoom : 24 ,
2024-07-31 10:27:27 +08:00
}
)
2024-08-19 10:51:59 +08:00
map . addLayer ( {
'id' : 'villageLabelLayer' ,
'type' : 'symbol' ,
'source' : 'villageSource' ,
'layout' : {
'text-field' : [ 'get' , 'zldwmc' ] ,
'text-font' : [ 'Open Sans Bold' , 'Arial Unicode MS Bold' ] ,
'text-size' : 12 ,
'text-anchor' : 'center' ,
} ,
'paint' : {
'text-color' : '#041B36' ,
'text-halo-color' : '#fff' ,
'text-halo-width' : 2 ,
}
} ) ;
2024-07-31 10:27:27 +08:00
}
}
// 控制图层显示隐层
/ * *
* 热力图 : heatLayer
*
* 图斑线 : historyLayerLine
*
* 图斑面 : historyLayerFill
*
* 行政区划 : countyLayer
*
2024-08-28 08:26:37 +08:00
*
*
2024-07-31 10:27:27 +08:00
* * /
function handlerChangeLayerVisible ( layerName , checked ) {
if ( checked ) {
map . setLayoutProperty ( layerName , 'visibility' , 'visible' ) ;
} else {
map . setLayoutProperty ( layerName , 'visibility' , 'none' ) ;
}
2024-08-24 17:20:15 +08:00
if ( layerName == 'countyPanelLayer' ) {
if ( map . getLayer ( "countyPanelLayer" ) ) {
2024-08-28 08:26:37 +08:00
map . moveLayer ( "countyPanelLayer" , "streetLayer" ) ;
map . moveLayer ( "countyPanelLayer" , "streetLabelLayer" ) ;
map . moveLayer ( "countyPanelLayer" , "countyLayer" ) ;
map . moveLayer ( "countyPanelLayer" , "historyLayerFill" ) ;
map . moveLayer ( "countyPanelLayer" , "historyLayerLine" ) ;
2024-08-24 17:20:15 +08:00
}
}
2024-07-31 10:27:27 +08:00
}
// 切换县区
function handlerChangeCounty ( county , type = "" ) {
handlerLoadPolygon ( county . code , type ) ;
handlerDealPoint ( county . code ) ;
2024-08-24 17:20:15 +08:00
handlerDealCountry ( county . name ) ;
2024-07-31 10:27:27 +08:00
2024-08-24 17:20:15 +08:00
}
2024-11-09 16:56:31 +08:00
const mapAngle = ref < String > ( "2D" )
2024-11-12 10:29:20 +08:00
const handlerChangeMapAngle = ( ) => {
2024-11-09 16:56:31 +08:00
if ( map ) {
const currentPitch = map . getPitch ( ) ;
if ( currentPitch === 0 ) {
map . easeTo ( { pitch : 60 , bearing : 0 , duration : 1000 } ) ;
map . dragRotate . enable ( ) ; // 启用拖动旋转
map . pitchWithRotate = true ; // 启用旋转时俯仰变化
2024-11-12 10:29:20 +08:00
mapAngle . value = "3D" ;
2024-11-09 16:56:31 +08:00
} else {
map . easeTo ( { pitch : 0 , bearing : 0 , duration : 1000 } ) ;
map . dragRotate . disable ( ) ; // 禁用拖动旋转
map . pitchWithRotate = false ; // 禁用旋转时俯仰变化
2024-11-12 10:29:20 +08:00
mapAngle . value = "2D" ;
2024-11-09 16:56:31 +08:00
}
2024-11-12 10:29:20 +08:00
2024-11-09 16:56:31 +08:00
}
}
2024-11-12 10:29:20 +08:00
// 回到初始视角
const handlerInitialize = ( ) => {
map . flyTo ( {
center : [ 118.30207505530701 , 35.30123435040745 ] , // 设置中心点坐标
zoom : 8 , // 设置缩放等级
} ) ;
}
2024-11-09 16:56:31 +08:00
2024-07-31 10:27:27 +08:00
onMounted ( ( ) => {
mapboxgl . accessToken = MAPBOX _TOKEN ;
map = initMap ( ) ;
2024-11-09 16:56:31 +08:00
2024-07-31 10:27:27 +08:00
map . on ( "load" , ( ) => {
2024-11-09 16:56:31 +08:00
2024-08-07 13:43:42 +08:00
// map.addLayer({
// 'id': 'wms-test-layer',
// 'type': 'raster',
// 'source': {
// 'type': 'raster',
// 'tiles': [
// // 'http://60.213.14.14:8060/geoserver/feixian/wms?service=WMS&version=1.1.0&request=GetMap&layers=feixian:yingxiang&styles=&bbox={bbox-epsg-3857}&width=256&height=256&srs=EPSG:3857&format=image/png&TRANSPARENT=TRUE'
// 'http://192.168.10.132:8080/geoserver/ne/wms?service=WMS&version=1.1.0&request=GetMap&layers=ne:linyitif&styles=&bbox={bbox-epsg-3857}&width=256&height=256&srs=EPSG:3857&format=image/png&TRANSPARENT=TRUE'
// ],
// 'tileSize': 256
// },
// 'paint': {}
// });;
2024-08-01 17:25:52 +08:00
handlerCheckUserOrgs ( ) ;
2024-08-19 17:26:11 +08:00
// handlerLoadMaskLayer();
getMaskData ( ) ;
2024-08-19 10:51:59 +08:00
handlerDealStreet ( ) ;
2024-07-31 10:27:27 +08:00
handlerDealCountry ( ) ;
2024-08-19 10:51:59 +08:00
2024-08-07 13:43:43 +08:00
map . flyTo ( {
2024-08-09 09:30:12 +08:00
center : [ 118.30207505530701 , 35.30123435040745 ] ,
zoom : 8 ,
2024-08-07 13:43:43 +08:00
} ) ,
2024-07-31 10:27:27 +08:00
map . on ( "click" , ( e ) => {
var center = map . getCenter ( ) ; // 获取当前视图中心点
var zoom = map . getZoom ( ) ; // 获取当前视图缩放级别
console . log ( zoom ) ;
console . log ( center ) ;
} )
2024-11-09 16:56:31 +08:00
// 添加地形数据
map . addSource ( 'mapbox-dem' , {
'type' : 'raster-dem' ,
'tiles' : [ VITE _GLOB _API _URL _VAR . value + '/mapbox_terrain/{z}/{x}/{y}.png' ] ,
'tileSize' : 256 ,
'maxzoom' : 13 ,
'minzoom' : 10 ,
} ) ;
map . setTerrain ( { source : "mapbox-dem" , exaggeration : 1 } ) ;
// 设置2D地图
2024-11-12 10:29:20 +08:00
map . easeTo ( { pitch : 0 , bearing : 0 , duration : 1000 } ) ;
map . dragRotate . disable ( ) ; // 禁用拖动旋转
map . pitchWithRotate = false ; // 禁用旋转时俯仰变化
mapAngle . value = "2D" ;
2024-11-09 16:56:31 +08:00
2024-07-31 10:27:27 +08:00
} )
} )
// 抛出函数
defineExpose ( {
handlerChangeCounty , // 切换县区
handlerChangeLayerVisible , // 控制图层显示隐藏
handlerLoadPolygon ,
} ) ;
< / script >
< style type = "less" scoped >
. map - container {
width : 100 % ;
height : 100 % ;
2024-08-05 08:25:10 +08:00
position : relative ;
}
. search - container - box {
position : absolute ;
width : 330 px ;
height : 40 px ;
2024-08-05 16:30:29 +08:00
top : 72 px ;
left : 73 px ;
2024-08-05 08:25:10 +08:00
z - index : 9999 ;
2024-07-31 10:27:27 +08:00
}
2024-11-09 16:56:31 +08:00
. map - type - switch - container {
2024-11-12 10:29:20 +08:00
width : 280 px ;
2024-11-09 16:56:31 +08:00
height : 40 px ;
position : absolute ;
top : 72 px ;
2024-11-12 10:29:20 +08:00
right : 23 px ;
2024-11-09 16:56:31 +08:00
z - index : 9999 ;
font - size : 22 px ;
color : # fff ;
text - align : center ;
line - height : 40 px ;
cursor : pointer ;
2024-11-12 10:29:20 +08:00
}
. map - type - switch - container . switch - button {
line - height : 40 px ;
width : 150 px ;
height : 40 px ;
float : left ;
background : url ( / m a p / c h a n g e - v i e w - b t n . p n g ) ;
background - size : 100 % 100 % ;
}
. map - type - switch - container . switch - button span {
font - size : 14 px ;
}
. home - button {
width : 100 px ;
height : 100 px ;
background : url ( / m a p / h o m e - b t n . p n g ) ;
background - size : 100 % 100 % ;
float : right ;
position : relative ;
top : - 25 px ;
line - height : 100 px ;
text - align : center ;
2024-11-09 16:56:31 +08:00
}
2024-07-31 10:27:27 +08:00
: : v - deep . mapboxgl - ctrl - logo {
display : none ! important ;
}
< / style >