机场mock部署版

This commit is contained in:
任娜 2025-06-30 10:27:48 +08:00
parent 53299fde52
commit 46007683d5
45 changed files with 6218 additions and 391 deletions

View File

@ -5,7 +5,8 @@ VITE_APP_TITLE = 青岛机场无人驾驶车辆协同云平台
VITE_APP_ENV = 'production'
# 青岛机场无人驾驶车辆协同云平台/生产环境
VITE_APP_BASE_API = '/prod-api'
# VITE_APP_BASE_API = '/prod-api'
VITE_APP_BASE_API = '/dev-api'
# 是否在打包时开启压缩,支持 gzip 和 brotli
VITE_BUILD_COMPRESS = gzip

View File

@ -5,7 +5,8 @@ VITE_APP_TITLE = 青岛机场无人驾驶车辆协同云平台
VITE_APP_ENV = 'staging'
# 青岛机场无人驾驶车辆协同云平台/生产环境
VITE_APP_BASE_API = '/stage-api'
# VITE_APP_BASE_API = '/stage-api'
VITE_APP_BASE_API = '/dev-api'
# 是否在打包时开启压缩,支持 gzip 和 brotli
VITE_BUILD_COMPRESS = gzip

8
.env.test Normal file
View File

@ -0,0 +1,8 @@
# 页面标题
VITE_APP_TITLE = 青岛机场无人驾驶车辆协同云平台
# 开发环境配置
VITE_APP_ENV = 'test'
VITE_USE_MOCK=true
# 青岛机场无人驾驶车辆协同云平台/开发环境
VITE_APP_BASE_API = '/dev-api'

View File

@ -109,4 +109,7 @@ getStyle(type, item, status) {
# 模拟数据版本
# 模拟数据版本
1.使用mock数据
2.打包npm run build:test
3.打包前隐藏

View File

@ -1,12 +1,13 @@
@echo off
echo.
echo [信息] 打包Web工程生成dist文件。
echo [信息] 构建Web工程生成dist文件夹
echo.
%~d0
cd %~dp0
cd ..
set NODE_OPTIONS=--max-old-space-size=4096
yarn build:prod
pause

View File

@ -1,12 +0,0 @@
@echo off
echo.
echo [信息] 安装Web工程生成node_modules文件。
echo.
%~d0
cd %~dp0
cd ..
yarn --registry=https://registry.npmmirror.com
pause

View File

@ -1,12 +0,0 @@
@echo off
echo.
echo [信息] 使用 Vite 命令运行 Web 工程。
echo.
%~d0
cd %~dp0
cd ..
yarn dev
pause

File diff suppressed because one or more lines are too long

View File

@ -8,196 +8,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="icon" href="/favicon.ico">
<title>青岛机场</title>
<!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
<style>
html,
body,
#app {
height: 100%;
margin: 0px;
padding: 0px;
}
.chromeframe {
margin: 0.2em 0;
background: #ccc;
color: #000;
padding: 0.2em 0;
}
#loader-wrapper {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 999999;
}
#loader {
display: block;
position: relative;
left: 50%;
top: 50%;
width: 150px;
height: 150px;
margin: -75px 0 0 -75px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #FFF;
-webkit-animation: spin 2s linear infinite;
-ms-animation: spin 2s linear infinite;
-moz-animation: spin 2s linear infinite;
-o-animation: spin 2s linear infinite;
animation: spin 2s linear infinite;
z-index: 1001;
}
#loader:before {
content: "";
position: absolute;
top: 5px;
left: 5px;
right: 5px;
bottom: 5px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #FFF;
-webkit-animation: spin 3s linear infinite;
-moz-animation: spin 3s linear infinite;
-o-animation: spin 3s linear infinite;
-ms-animation: spin 3s linear infinite;
animation: spin 3s linear infinite;
}
#loader:after {
content: "";
position: absolute;
top: 15px;
left: 15px;
right: 15px;
bottom: 15px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #FFF;
-moz-animation: spin 1.5s linear infinite;
-o-animation: spin 1.5s linear infinite;
-ms-animation: spin 1.5s linear infinite;
-webkit-animation: spin 1.5s linear infinite;
animation: spin 1.5s linear infinite;
}
@-webkit-keyframes spin {
0% {
-webkit-transform: rotate(0deg);
-ms-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes spin {
0% {
-webkit-transform: rotate(0deg);
-ms-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg);
transform: rotate(360deg);
}
}
#loader-wrapper .loader-section {
position: fixed;
top: 0;
width: 51%;
height: 100%;
background: #7171C6;
z-index: 1000;
-webkit-transform: translateX(0);
-ms-transform: translateX(0);
transform: translateX(0);
}
#loader-wrapper .loader-section.section-left {
left: 0;
}
#loader-wrapper .loader-section.section-right {
right: 0;
}
.loaded #loader-wrapper .loader-section.section-left {
-webkit-transform: translateX(-100%);
-ms-transform: translateX(-100%);
transform: translateX(-100%);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
}
.loaded #loader-wrapper .loader-section.section-right {
-webkit-transform: translateX(100%);
-ms-transform: translateX(100%);
transform: translateX(100%);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
}
.loaded #loader {
opacity: 0;
-webkit-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;
}
.loaded #loader-wrapper {
visibility: hidden;
-webkit-transform: translateY(-100%);
-ms-transform: translateY(-100%);
transform: translateY(-100%);
-webkit-transition: all 0.3s 1s ease-out;
transition: all 0.3s 1s ease-out;
}
.no-js #loader-wrapper {
display: none;
}
.no-js h1 {
color: #222222;
}
#loader-wrapper .load_title {
font-family: 'Open Sans';
color: #FFF;
font-size: 19px;
width: 100%;
text-align: center;
z-index: 9999999999999;
position: absolute;
top: 60%;
opacity: 1;
line-height: 30px;
}
#loader-wrapper .load_title span {
font-weight: normal;
font-style: italic;
font-size: 13px;
color: #FFF;
opacity: 0.5;
}
</style>
</head>
<body>

View File

@ -5,8 +5,9 @@
"license": "MIT",
"scripts": {
"dev": "vite",
"build:prod": "vite build",
"build:stage": "vite build --mode staging",
"build:prod": "node --max-old-space-size=4096 ./node_modules/vite/bin/vite.js build",
"build:stage": "node --max-old-space-size=4096 ./node_modules/vite/bin/vite.js build --mode staging",
"build:test": "node --max-old-space-size=4096 ./node_modules/vite/bin/vite.js build --mode test",
"preview": "vite preview"
},
"repository": {
@ -19,7 +20,7 @@
"@vueuse/core": "9.5.0",
"axios": "0.27.2",
"echarts": "5.4.0",
"element-plus": "2.2.21",
"element-plus": "^2.2.21",
"file-saver": "2.0.5",
"fuse.js": "6.6.2",
"js-cookie": "3.0.1",
@ -30,6 +31,7 @@
"ol": "6.15.1",
"pinia": "2.0.22",
"proj4": "^2.17.0",
"terser": "^5.43.1",
"vue": "3.2.45",
"vue-cropper": "1.0.3",
"vue-router": "4.1.4"

91
public/airport_roads.json Normal file
View File

@ -0,0 +1,91 @@
{
"type": "FeatureCollection",
"name": "geo0429",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { "fid": 1, "road_id": "51", "name": "51", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.089884182963942, 36.376724574565223 ], [ 120.075794941435717, 36.370830831641541 ] ] } },
{ "type": "Feature", "properties": { "fid": 2, "road_id": "41", "name": "41", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.091171665579296, 36.37364679296428 ], [ 120.077079436852429, 36.367760191065202 ] ] } },
{ "type": "Feature", "properties": { "fid": 3, "road_id": "52", "name": "52", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.087816178671858, 36.377827096292791 ], [ 120.087136287735902, 36.377546882933956 ], [ 120.0866407555514, 36.377427695780376 ], [ 120.079471166856848, 36.374428548342273 ], [ 120.079137987036347, 36.374452791174129 ], [ 120.076747820709613, 36.373457143740168 ] ] } },
{ "type": "Feature", "properties": { "fid": 4, "road_id": "D1", "name": "D1", "directionality": "双向", "prohibited": true, "width": 8.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.085781751289929, 36.384316680703712 ], [ 120.087429682801499, 36.385006035390809 ], [ 120.087479539518469, 36.385049582213938 ], [ 120.087518099243951, 36.385111094338583 ], [ 120.08753705252515, 36.385183313960894 ], [ 120.087530256876477, 36.385244762416235 ], [ 120.085643808884626, 36.389763436695894 ], [ 120.085632153476936, 36.389845543244505 ], [ 120.085658595639572, 36.389936022915258 ], [ 120.08570306677305, 36.389992444203308 ], [ 120.085744088212692, 36.390020949594245 ], [ 120.087213649435554, 36.390639471124537 ], [ 120.086340216964871, 36.392745529624911 ], [ 120.086335524614142, 36.392838112593608 ], [ 120.086364659568517, 36.392922155031883 ], [ 120.086408604877505, 36.392970792691607 ], [ 120.086457409945496, 36.392998772258046 ], [ 120.08722344060908, 36.393319214475873 ], [ 120.087288633505139, 36.393335140148757 ], [ 120.087358686160201, 36.393330407728371 ], [ 120.087426635517303, 36.393294540794635 ], [ 120.087482005156389, 36.393234502404475 ], [ 120.088761607060448, 36.390184600610951 ], [ 120.088806836878405, 36.390130720623695 ], [ 120.088872914015155, 36.390090288677833 ], [ 120.088947005857847, 36.390075900408753 ], [ 120.089029112406465, 36.390087555816436 ], [ 120.090521203942941, 36.390715502117857 ], [ 120.090574868769949, 36.390722823591005 ], [ 120.09063825311496, 36.390688828877629 ] ] } },
{ "type": "Feature", "properties": { "fid": 5, "road_id": "D2", "name": "D2", "directionality": "双向", "prohibited": true, "width": 8.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.090633982849752, 36.39067191522507 ], [ 120.09426620139071, 36.381979902671596 ], [ 120.094281633073777, 36.381884248460111 ], [ 120.094270053135233, 36.381817004135584 ], [ 120.093965609848752, 36.38084062916905 ], [ 120.093960056856972, 36.380781578758558 ], [ 120.093968630113253, 36.380720401174138 ], [ 120.104768334324675, 36.354907772179004 ], [ 120.104799942793036, 36.354854812384602 ], [ 120.104847234056876, 36.354814085691856 ], [ 120.105802437796683, 36.354320676316604 ], [ 120.105835360826262, 36.354287175593058 ], [ 120.10587424802452, 36.354234896955248 ], [ 120.109330614530577, 36.345972306756693 ] ] } },
{ "type": "Feature", "properties": { "fid": 6, "road_id": "D3", "name": "D3", "directionality": "双向", "prohibited": true, "width": 8.0, "speed_limit": 50.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.109331960926454, 36.345969088140471 ], [ 120.10934074433429, 36.345925489447858 ], [ 120.109341513036185, 36.345855847078496 ], [ 120.109314365840973, 36.345789654402942 ], [ 120.109255295395656, 36.345713889582832 ], [ 120.107830121602134, 36.345115826902877 ], [ 120.107777572093411, 36.345078717312227 ], [ 120.107733774157879, 36.345020686716062 ], [ 120.107714673503239, 36.344957860030192 ], [ 120.107720039051912, 36.34486366775338 ], [ 120.10912221574111, 36.341507184804932 ], [ 120.109134249599833, 36.341442254821125 ], [ 120.109127087299953, 36.341382531212695 ], [ 120.109097920510919, 36.341321166461491 ], [ 120.109029982953629, 36.34125303789628 ], [ 120.108238876558104, 36.340920215203354 ], [ 120.108170727958068, 36.340906834948754 ], [ 120.108116505471926, 36.340914407534335 ], [ 120.108054204610553, 36.340941291817316 ], [ 120.107977471845601, 36.341020757443658 ], [ 120.107096066521052, 36.343118753486117 ], [ 120.106930570697259, 36.343053305912825 ], [ 120.10561737527398, 36.342503976396543 ], [ 120.105539833737481, 36.342490448768494 ], [ 120.105467351202904, 36.342505510235526 ], [ 120.105405576166021, 36.342540178146841 ], [ 120.105345494141389, 36.342611481693815 ], [ 120.105127882908377, 36.343131690542556 ], [ 120.10509560124207, 36.34318625964508 ], [ 120.105041462460065, 36.343229794668375 ], [ 120.104978898686454, 36.343252787137175 ], [ 120.104872357769196, 36.343249819633364 ], [ 120.103204441362266, 36.342553995879143 ] ] } },
{ "type": "Feature", "properties": { "fid": 7, "road_id": "84", "name": "84", "directionality": "双向", "prohibited": false, "width": 8.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.099428587000972, 36.351810871464117 ], [ 120.100227262666039, 36.349906123851802 ], [ 120.100206731911385, 36.349810553344454 ], [ 120.100209552041761, 36.349713405363644 ], [ 120.103204441362266, 36.342553995879143 ] ] } },
{ "type": "Feature", "properties": { "fid": 8, "road_id": "85", "name": "85", "directionality": "双向", "prohibited": false, "width": 8.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.100226158256376, 36.349904243672768 ], [ 120.100988970303732, 36.350223339494725 ], [ 120.102187057488052, 36.347361521608008 ], [ 120.101342170726753, 36.34700809269129 ] ] } },
{ "type": "Feature", "properties": { "fid": 9, "road_id": "81", "name": "81", "directionality": "双向", "prohibited": false, "width": 8.0, "speed_limit": 50.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.099429896553488, 36.351810001082001 ], [ 120.086833037269429, 36.346540544233143 ] ] } },
{ "type": "Feature", "properties": { "fid": 10, "road_id": "82", "name": "82", "directionality": "双向", "prohibited": false, "width": 8.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.100407977133571, 36.349239061796226 ], [ 120.095462573290732, 36.347170324537011 ] ] } },
{ "type": "Feature", "properties": { "fid": 11, "road_id": "87", "name": "87", "directionality": "双向", "prohibited": false, "width": 8.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.094402754595649, 36.349706126073961 ], [ 120.095644131590774, 36.346738561906626 ] ] } },
{ "type": "Feature", "properties": { "fid": 12, "road_id": "86", "name": "86", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 50.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.101693448593537, 36.346166087947246 ], [ 120.100854999064694, 36.345815351822267 ], [ 120.100795948654209, 36.34582090481404 ], [ 120.100750971731088, 36.345838017709525 ], [ 120.100710938271092, 36.345870434949454 ], [ 120.100680560659811, 36.345906891376998 ], [ 120.099630424639386, 36.348403724961514 ] ] } },
{ "type": "Feature", "properties": { "fid": 13, "road_id": "83", "name": "83", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 50.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.099630424639386, 36.348403724961514 ], [ 120.089115336860502, 36.344006995550757 ] ] } },
{ "type": "Feature", "properties": { "fid": 14, "road_id": "88", "name": "88", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 50.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.08911567345946, 36.3440061908967 ], [ 120.090149563570961, 36.341527852417528 ], [ 120.090168913002941, 36.341461255356201 ], [ 120.09015177417271, 36.341386958370677 ], [ 120.090117837228718, 36.341330216400976 ], [ 120.090076610646221, 36.341304461571198 ], [ 120.089272293186809, 36.340967057948838 ] ] } },
{ "type": "Feature", "properties": { "fid": 15, "road_id": "89", "name": "89", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 50.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.086832316765111, 36.346540006470661 ], [ 120.087629514578182, 36.344636531567495 ], [ 120.087721503935597, 36.344586139008634 ], [ 120.087792398979275, 36.344507067750648 ], [ 120.093305048582735, 36.331328845909411 ] ] } },
{ "type": "Feature", "properties": { "fid": 16, "road_id": "810", "name": "810", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.087629214822584, 36.344634987987426 ], [ 120.086876058623929, 36.344319931353091 ], [ 120.088075791959739, 36.341456438430207 ], [ 120.088918396214993, 36.341810803457108 ] ] } },
{ "type": "Feature", "properties": { "fid": 17, "road_id": "X3", "name": "X3", "directionality": "双向", "prohibited": true, "width": 10.0, "speed_limit": 50.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.093296875594731, 36.331343863465598 ], [ 120.090086305901778, 36.330000833582055 ], [ 120.09076118683322, 36.328387502195 ], [ 120.090777785704063, 36.328320699990819 ], [ 120.090772117173486, 36.328248364829705 ], [ 120.090736660525437, 36.328174914350306 ], [ 120.090702633977401, 36.328134207692379 ], [ 120.090675423112856, 36.328113370391002 ], [ 120.089877206286943, 36.327779464214437 ], [ 120.089839108716632, 36.327771091092302 ], [ 120.089787579022243, 36.327772226445411 ], [ 120.089717904818215, 36.327794135430594 ], [ 120.089679217754096, 36.32782333405428 ], [ 120.089638774008407, 36.327861252416497 ], [ 120.089612140837843, 36.327906838868259 ], [ 120.088212299415389, 36.331248698628862 ], [ 120.088175600110432, 36.331295747015275 ], [ 120.088134630540253, 36.331325881749152 ], [ 120.088073676074742, 36.331349547415904 ], [ 120.088017581368248, 36.331352554989365 ], [ 120.087962307233141, 36.331344560318264 ], [ 120.086519693962572, 36.33074298427519 ], [ 120.086446948515771, 36.330754153928027 ], [ 120.086401035482453, 36.330768984317466 ], [ 120.086359392714343, 36.330800728359456 ], [ 120.086318275770736, 36.330840256029774 ], [ 120.086292147498625, 36.330884635500453 ] ] } },
{ "type": "Feature", "properties": { "fid": 18, "road_id": "X2", "name": "X2", "directionality": "双向", "prohibited": true, "width": 10.0, "speed_limit": 50.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.086292399947851, 36.330884032009905 ], [ 120.082833603562278, 36.339156951255084 ], [ 120.082824409868749, 36.339206051069986 ], [ 120.082828690151374, 36.339263623628476 ], [ 120.083102786324417, 36.340362268139152 ], [ 120.083109365030424, 36.340407565743917 ], [ 120.083109243591721, 36.340446278742782 ], [ 120.083098850875771, 36.340489204237443 ], [ 120.072334592127447, 36.366215969275864 ], [ 120.072310257380252, 36.3662492807739 ], [ 120.072285265352463, 36.366272862736501 ], [ 120.072257596450257, 36.366291543088039 ], [ 120.071356226282532, 36.366755708008192 ], [ 120.071325133621229, 36.366775792525004 ], [ 120.071293162619156, 36.366800236911061 ], [ 120.071265346343509, 36.366828310199054 ], [ 120.071248185250425, 36.366853513407783 ], [ 120.067590511635274, 36.375588296123816 ], [ 120.067584831304885, 36.375619956461655 ], [ 120.067601360606488, 36.375650507381145 ], [ 120.067618841935612, 36.375672001963125 ], [ 120.069141715469158, 36.376309988464193 ], [ 120.069191851015688, 36.376346088257947 ], [ 120.069220234522305, 36.376379943418378 ], [ 120.069243595424751, 36.376419024850854 ], [ 120.069257505621323, 36.376451316534563 ], [ 120.069264873064057, 36.376508289581857 ], [ 120.069260112926528, 36.376553571269291 ], [ 120.069241789208789, 36.376606415524897 ], [ 120.067850709822508, 36.3799318495847 ], [ 120.067837834466374, 36.379998791203661 ], [ 120.067844455024442, 36.380062070027286 ], [ 120.067871339307416, 36.380124370888666 ], [ 120.067918503232647, 36.380174354944252 ] ] } },
{ "type": "Feature", "properties": { "fid": 19, "road_id": "X1", "name": "X1", "directionality": "双向", "prohibited": true, "width": 10.0, "speed_limit": 50.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.06791954191425, 36.380175262169729 ], [ 120.067955603973417, 36.380199802059771 ], [ 120.068734509101944, 36.38052562986109 ], [ 120.068754362541156, 36.380530153021127 ], [ 120.068806754659008, 36.380535996642294 ], [ 120.068862923052222, 36.380528292600594 ], [ 120.068908573173303, 36.380509570396981 ], [ 120.06895236699134, 36.380474944337735 ], [ 120.068987851356539, 36.380433060474623 ], [ 120.069806470510485, 36.378480637109348 ], [ 120.069812697591388, 36.378465751009273 ], [ 120.071689787210119, 36.379251438729362 ], [ 120.071739281393377, 36.379266470144138 ], [ 120.071793019907105, 36.37926909514907 ], [ 120.071838990709807, 36.379260907134949 ], [ 120.07188578208391, 36.379241716876258 ], [ 120.071926956796915, 36.379208831581238 ], [ 120.071965060267146, 36.3791652069539 ], [ 120.072159446171341, 36.378700519235188 ], [ 120.072183723149138, 36.378660565361841 ], [ 120.072222631273419, 36.378617277333468 ], [ 120.072263059101772, 36.378590697814801 ], [ 120.072300047253719, 36.378576861304943 ], [ 120.072359507949898, 36.378565807190881 ], [ 120.072409954160662, 36.378571782268175 ], [ 120.072442682064818, 36.378581691011696 ], [ 120.073281599648752, 36.378933568389698 ] ] } },
{ "type": "Feature", "properties": { "fid": 20, "road_id": "72", "name": "72", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.073276008922406, 36.378949193415785 ], [ 120.076539420069878, 36.371147871156204 ] ] } },
{ "type": "Feature", "properties": { "fid": 21, "road_id": "73", "name": "73", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.076658536338883, 36.373663455062214 ], [ 120.07566076530648, 36.373246072341516 ] ] } },
{ "type": "Feature", "properties": { "fid": 22, "road_id": "74", "name": "74", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.074292245591678, 36.379320173092665 ], [ 120.073294474559276, 36.378902790371967 ] ] } },
{ "type": "Feature", "properties": { "fid": 23, "road_id": "71", "name": "71", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.072618938433507, 36.383324804885142 ], [ 120.077539594601447, 36.371561768369091 ] ] } },
{ "type": "Feature", "properties": { "fid": 24, "road_id": "2", "name": "2", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 50.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.075797650021158, 36.370834977509801 ], [ 120.078247922210949, 36.364977498291772 ], [ 120.078324654975901, 36.364898032665415 ], [ 120.078398631279782, 36.3648703596457 ], [ 120.07847231283678, 36.364861472498909 ], [ 120.078540461436816, 36.364874852753502 ], [ 120.078851731101295, 36.365003170647157 ], [ 120.078956925622691, 36.365009356767196 ], [ 120.079040294863034, 36.364981831120943 ], [ 120.079144049266986, 36.364914614513573 ], [ 120.086831896016406, 36.346541012288235 ] ] } },
{ "type": "Feature", "properties": { "fid": 25, "road_id": "56", "name": "56", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.077213771684427, 36.373651553751181 ], [ 120.078003580237521, 36.371754442393751 ] ] } },
{ "type": "Feature", "properties": { "fid": 26, "road_id": "55", "name": "55", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.082159545743323, 36.375552154264355 ], [ 120.082895203714585, 36.373802573429174 ] ] } },
{ "type": "Feature", "properties": { "fid": 27, "road_id": "54", "name": "54", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.083268096123533, 36.376012095828514 ], [ 120.083997038032763, 36.374267269230963 ] ] } },
{ "type": "Feature", "properties": { "fid": 28, "road_id": "66", "name": "66", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.082057474872599, 36.388376201202547 ], [ 120.086639522941439, 36.377427141973953 ] ] } },
{ "type": "Feature", "properties": { "fid": 29, "road_id": "53", "name": "53", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.086091590371041, 36.377195569842414 ], [ 120.086822983085824, 36.375449404807661 ] ] } },
{ "type": "Feature", "properties": { "fid": 30, "road_id": "65", "name": "65", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.083729845761539, 36.389077197438745 ], [ 120.082057774628211, 36.388377744782602 ] ] } },
{ "type": "Feature", "properties": { "fid": 31, "road_id": "64", "name": "64", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.083730650415589, 36.389077534037717 ], [ 120.087936249381741, 36.379026132139309 ] ] } },
{ "type": "Feature", "properties": { "fid": 32, "road_id": "63", "name": "63", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.088778853636995, 36.37938049716621 ], [ 120.087936249381741, 36.379026132139309 ] ] } },
{ "type": "Feature", "properties": { "fid": 33, "road_id": "62", "name": "62", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.087584190211757, 36.382240910887653 ], [ 120.086739303450443, 36.381887481970935 ] ] } },
{ "type": "Feature", "properties": { "fid": 34, "road_id": "61", "name": "61", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.087583517013812, 36.382242520195767 ], [ 120.089484228164139, 36.377707830500995 ] ] } },
{ "type": "Feature", "properties": { "fid": 35, "road_id": "1", "name": "1", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.089483423510089, 36.37770749390203 ], [ 120.092340417783674, 36.370870947879119 ], [ 120.092350495717895, 36.370765490445493 ], [ 120.092315859641232, 36.370681037721525 ], [ 120.092235457904707, 36.370602022450527 ], [ 120.091867599543903, 36.370446250814915 ], [ 120.09178289570751, 36.37037299957845 ], [ 120.09175361337968, 36.370298350076631 ], [ 120.091748271430674, 36.370184551355514 ], [ 120.099431290255737, 36.351808929536368 ] ] } },
{ "type": "Feature", "properties": { "fid": 36, "road_id": "42", "name": "42", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.091952056260979, 36.371794822194282 ], [ 120.088266740673561, 36.370253198919436 ] ] } },
{ "type": "Feature", "properties": { "fid": 37, "road_id": "44", "name": "44", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.087487156536923, 36.372107787109236 ], [ 120.088509071004708, 36.369664857387967 ] ] } },
{ "type": "Feature", "properties": { "fid": 38, "road_id": "43", "name": "43", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.092198746461378, 36.371207359003591 ], [ 120.086592516493752, 36.368865024552541 ] ] } },
{ "type": "Feature", "properties": { "fid": 39, "road_id": "45", "name": "45", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.084604680556936, 36.370904840165892 ], [ 120.085385442789956, 36.369047435686895 ] ] } },
{ "type": "Feature", "properties": { "fid": 40, "road_id": "46", "name": "46", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.08271052490349, 36.3701124861945 ], [ 120.083735132163014, 36.367663119240767 ] ] } },
{ "type": "Feature", "properties": { "fid": 41, "road_id": "49", "name": "49", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.08373331771206, 36.367665196603973 ], [ 120.078104089375699, 36.365312296128792 ] ] } },
{ "type": "Feature", "properties": { "fid": 42, "road_id": "47", "name": "47", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.08092546560303, 36.369366714336849 ], [ 120.081946854246326, 36.366916000987246 ] ] } },
{ "type": "Feature", "properties": { "fid": 43, "road_id": "48", "name": "48", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 40.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.081700463801525, 36.367505007757998 ], [ 120.077859045326775, 36.365898084283295 ] ] } },
{ "type": "Feature", "properties": { "fid": 44, "road_id": "1C2", "name": "1C2", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.088052924804487, 36.365369336452005 ], [ 120.086577611526394, 36.368896135189914 ], [ 120.086520863656773, 36.36898206988338 ], [ 120.086439302967491, 36.369059515915922 ], [ 120.086351042133472, 36.369130377342543 ], [ 120.086231531247321, 36.369190057316487 ], [ 120.086076615582584, 36.369234926935825 ], [ 120.085926591511509, 36.3692364607748 ], [ 120.085825436177743, 36.36922061880604 ], [ 120.08573017132592, 36.369190695391275 ], [ 120.084519298424169, 36.368686059851058 ], [ 120.08433961357423, 36.368595767623411 ], [ 120.084176758672712, 36.368465242692842 ], [ 120.084025232597313, 36.368294074773672 ], [ 120.083890914921383, 36.368099850716376 ], [ 120.08373251305801, 36.367664860005007 ], [ 120.083767762228121, 36.367503749985218 ], [ 120.085514521648122, 36.363319007139793 ] ] } },
{ "type": "Feature", "properties": { "fid": 45, "road_id": "1C6", "name": "1C6", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.085385442789956, 36.369047435686895 ], [ 120.085733149524231, 36.368216228044574 ], [ 120.085750132746, 36.36811460465573 ], [ 120.085724805901648, 36.36799433686749 ], [ 120.08569384647889, 36.367871712886476 ] ] } },
{ "type": "Feature", "properties": { "fid": 46, "road_id": "1C7", "name": "1C7", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.088052288449902, 36.365368597526 ], [ 120.08701187075242, 36.364933375059984 ] ] } },
{ "type": "Feature", "properties": { "fid": 47, "road_id": "1C4", "name": "1C4", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.087720043699747, 36.363645026073456 ], [ 120.08660546637276, 36.363176890595255 ] ] } },
{ "type": "Feature", "properties": { "fid": 48, "road_id": "1C1", "name": "1C1", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.088093990341548, 36.363526325188587 ], [ 120.087939747874756, 36.363569585499818 ], [ 120.087810581139891, 36.363625226286139 ], [ 120.087703944718669, 36.363690291843575 ], [ 120.087654307279465, 36.363777310020666 ], [ 120.0875830756368, 36.363857185932709 ], [ 120.087488640482562, 36.363929246381758 ], [ 120.087379036557522, 36.364100852856446 ], [ 120.087345323899996, 36.364195005339944 ], [ 120.08701576256658, 36.364933112147746 ], [ 120.086652393962879, 36.365761077297833 ], [ 120.086494434433973, 36.366134165910019 ], [ 120.086431858860536, 36.36626115387778 ], [ 120.086347645449152, 36.366507672766552 ], [ 120.086193326622009, 36.366772611153358 ], [ 120.086113626353239, 36.366958617696973 ], [ 120.086108113431123, 36.367062202910233 ], [ 120.086094648581181, 36.367166716275023 ], [ 120.085891625751401, 36.367737936952345 ], [ 120.085825895231025, 36.367818223150081 ], [ 120.085695119188046, 36.367873190738472 ], [ 120.085617545816888, 36.3678823407975 ], [ 120.085511004899629, 36.367879373293682 ], [ 120.085400424794742, 36.367886061638565 ], [ 120.085296650355957, 36.367871960434051 ], [ 120.085217447641853, 36.36779911948328 ], [ 120.085009928263844, 36.367510928326837 ], [ 120.084997444049776, 36.367418723809173 ], [ 120.085006374831053, 36.367365732180126 ], [ 120.08504381100326, 36.367271719111415 ], [ 120.085309596849598, 36.366726753153621 ], [ 120.085445622902455, 36.366564308537789 ], [ 120.085562349057739, 36.366289790047766 ], [ 120.085561835033076, 36.366178010920464 ], [ 120.085664444957715, 36.3659462785103 ], [ 120.085721161883868, 36.365810694301473 ], [ 120.08646363732106, 36.363936328417928 ], [ 120.08651783977237, 36.363847438020471 ], [ 120.086575009727497, 36.363652006705749 ], [ 120.086561884150157, 36.363538733809115 ], [ 120.086552650386977, 36.363425198000243 ], [ 120.086606139570691, 36.363175281287148 ], [ 120.086475736417384, 36.362845130522125 ] ] } },
{ "type": "Feature", "properties": { "fid": 49, "road_id": "1C5", "name": "1C5", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.086428266801974, 36.366262960370086 ], [ 120.085664986699527, 36.365942723295106 ] ] } },
{ "type": "Feature", "properties": { "fid": 50, "road_id": "1D1", "name": "1D1", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.088094158641027, 36.363525922861562 ], [ 120.088205059427551, 36.363529768706158 ], [ 120.088310984916276, 36.363540987893415 ], [ 120.088408306205281, 36.363563735149718 ], [ 120.088504806922884, 36.363597484650604 ], [ 120.088593771007069, 36.36364699063369 ], [ 120.088677423194483, 36.363704674613473 ], [ 120.088926812300684, 36.363895034573765 ], [ 120.089069313873253, 36.364042572778345 ], [ 120.090149216711922, 36.365409516304496 ], [ 120.090208034262417, 36.365522048216377 ], [ 120.090256186167295, 36.365632954902807 ], [ 120.090278756550589, 36.365805015297681 ], [ 120.09028887455446, 36.365862193487821 ], [ 120.090433290199456, 36.366032277923367 ], [ 120.090505350648499, 36.366126713077584 ], [ 120.09111049524023, 36.367017093246169 ], [ 120.091169091730549, 36.367143714562737 ], [ 120.091330781226702, 36.367100733081088 ], [ 120.091414939203787, 36.367084882877336 ], [ 120.091753937322281, 36.367056508389865 ], [ 120.091811788710345, 36.367044781077873 ], [ 120.091895221620007, 36.366971900057436 ], [ 120.092037939582568, 36.366630726736688 ], [ 120.092052287781996, 36.366542182955612 ], [ 120.092014202011512, 36.366429814334509 ], [ 120.091943077672639, 36.366337661686323 ], [ 120.091863317299399, 36.366279714794302 ], [ 120.091786039566344, 36.366197751777968 ], [ 120.090785096564346, 36.364981075200305 ], [ 120.090210590713738, 36.364202784823249 ], [ 120.090131503538416, 36.364143228623107 ], [ 120.089854001074571, 36.3637624167634 ], [ 120.089801053079995, 36.363626812796063 ], [ 120.089728750644738, 36.363537476437095 ], [ 120.08965089432651, 36.363461416870081 ], [ 120.089601312321619, 36.363317766362165 ], [ 120.089493659650898, 36.363055278166037 ], [ 120.089456983945595, 36.362894335554529 ], [ 120.089409831820205, 36.362740355999968 ] ] } },
{ "type": "Feature", "properties": { "fid": 51, "road_id": "1B1", "name": "1B1", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.082072012219001, 36.363120340365647 ], [ 120.081986050699584, 36.36310659963609 ], [ 120.081938207676515, 36.363110222638099 ], [ 120.08181511564041, 36.363140040807828 ], [ 120.081733839680595, 36.363158042061514 ], [ 120.081615439995232, 36.363095277262545 ], [ 120.081577585302313, 36.3630094781427 ], [ 120.081527324199584, 36.36291943469238 ], [ 120.081349250440184, 36.362685161257765 ], [ 120.081323186728582, 36.362611858151816 ], [ 120.081329777234416, 36.362553160257633 ], [ 120.081445435823383, 36.362274413354456 ], [ 120.081475630109068, 36.362177370895033 ], [ 120.081528612166309, 36.362109479169149 ], [ 120.081592753413403, 36.362109837585358 ], [ 120.083056633200528, 36.361996088523043 ], [ 120.083183128069678, 36.361955875578609 ], [ 120.083399018234743, 36.361968658104402 ], [ 120.083518349912794, 36.361941048754005 ], [ 120.08439758513353, 36.361819098647999 ], [ 120.084542749445603, 36.361838222902293 ], [ 120.085073183325676, 36.361750001032597 ], [ 120.085146276280071, 36.361706358429181 ], [ 120.085265197672442, 36.361684250201066 ], [ 120.085503450742863, 36.361634532622553 ], [ 120.085722161038291, 36.36155016716755 ], [ 120.085839389418396, 36.361491423303782 ], [ 120.085946699037564, 36.361424748438232 ], [ 120.086076307892782, 36.361340928842537 ] ] } },
{ "type": "Feature", "properties": { "fid": 52, "road_id": "1A1", "name": "1A1", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.086075503238717, 36.361340592243565 ], [ 120.086118729380189, 36.361280201337117 ], [ 120.086156085965769, 36.361242882486117 ], [ 120.08622617045549, 36.361215472378646 ], [ 120.086321165051274, 36.360983863465954 ], [ 120.086290410771355, 36.360858488923803 ], [ 120.08627605522814, 36.360689392191574 ], [ 120.086214662207112, 36.360451927857881 ], [ 120.086162913234958, 36.360322498210785 ], [ 120.086089454520561, 36.360172641547983 ], [ 120.085971755750279, 36.359992933098397 ], [ 120.085698292474049, 36.35960246538999 ], [ 120.085684198951867, 36.359509587674388 ], [ 120.085229369613273, 36.358888196603722 ], [ 120.085150019525713, 36.358824748589406 ], [ 120.085070816811609, 36.358751907638634 ], [ 120.084857706707254, 36.358479341508279 ], [ 120.084789706371865, 36.358384241114763 ], [ 120.084357164469495, 36.35784970081292 ], [ 120.083994400510122, 36.357410531775493 ], [ 120.083915608081696, 36.357332189702433 ], [ 120.083774168175538, 36.357240877660459 ], [ 120.083715045860743, 36.357106472715557 ], [ 120.083678916014748, 36.357034631544281 ], [ 120.08367134342916, 36.356980409058139 ], [ 120.083702342368909, 36.356883703197688 ], [ 120.083738337532481, 36.356788614604014 ], [ 120.084098235516322, 36.355923742947361 ] ] } },
{ "type": "Feature", "properties": { "fid": 53, "road_id": "1A3", "name": "1A3", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.084095953010277, 36.355924679057537 ], [ 120.084117116893211, 36.355856004633011 ], [ 120.084106273821902, 36.355741795626201 ], [ 120.084066925359693, 36.355668608059041 ], [ 120.084031815328018, 36.355635011831517 ], [ 120.083984619568142, 36.355607705463015 ], [ 120.083180638707688, 36.355269497186598 ] ] } },
{ "type": "Feature", "properties": { "fid": 54, "road_id": "1A2", "name": "1A2", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.085025286222432, 36.360167122048892 ], [ 120.085035300487348, 36.360107019989428 ], [ 120.085028926924196, 36.360058971823513 ], [ 120.084989988747665, 36.359980283134064 ], [ 120.082805171898883, 36.357116333030042 ], [ 120.082731207394815, 36.35704001055079 ], [ 120.082643663393242, 36.356982589483245 ], [ 120.082491452320085, 36.356917026371136 ] ] } },
{ "type": "Feature", "properties": { "fid": 55, "road_id": "1A4", "name": "1A4", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.083774767686748, 36.357243964820583 ], [ 120.083639836917357, 36.35729530350703 ], [ 120.083497859386867, 36.357300203335697 ], [ 120.083289099687036, 36.357369822105419 ], [ 120.083188374673782, 36.35742979682626 ], [ 120.083095285915434, 36.35749863865906 ] ] } },
{ "type": "Feature", "properties": { "fid": 56, "road_id": "1A5", "name": "1A5", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.084216246145914, 36.358964066544473 ], [ 120.084312027696015, 36.358888787479209 ], [ 120.084376495524651, 36.358847682335409 ], [ 120.084512163161293, 36.358749378966664 ], [ 120.084595122115942, 36.358727354442685 ], [ 120.084751993705183, 36.358723012273181 ], [ 120.084863163303851, 36.35867875218247 ], [ 120.08495531595203, 36.358607627843604 ] ] } },
{ "type": "Feature", "properties": { "fid": 57, "road_id": "1A7", "name": "1A7", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.081083795434623, 36.360282089643313 ], [ 120.081235070397611, 36.360345370249355 ], [ 120.08134105365572, 36.360363231811924 ], [ 120.081450550276969, 36.360363653897444 ], [ 120.08168139817009, 36.36033163870821 ], [ 120.081754470198447, 36.360279005495372 ], [ 120.08180044690107, 36.360218819731763 ], [ 120.0824926626794, 36.358564048660682 ], [ 120.082506800727273, 36.358457925987786 ], [ 120.082489982578693, 36.358394163191733 ], [ 120.08245183313889, 36.358327149944799 ], [ 120.082278892068146, 36.35811676913702 ], [ 120.082194303770549, 36.358056802651184 ], [ 120.082042092697392, 36.357991239539096 ] ] } },
{ "type": "Feature", "properties": { "fid": 58, "road_id": "1B6", "name": "1B6", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.080692741120174, 36.36121240119094 ], [ 120.081125645003581, 36.361393491435884 ], [ 120.081225043655792, 36.361418053143147 ], [ 120.081424924443823, 36.3614600661273 ], [ 120.081561348982547, 36.361396115888148 ], [ 120.081637870704725, 36.361371398572437 ], [ 120.081689958058263, 36.361355369160563 ], [ 120.084575582656981, 36.360984499357599 ], [ 120.084618129700615, 36.360977715508739 ], [ 120.084677885143705, 36.360947875521774 ], [ 120.084712827767092, 36.360909546873877 ], [ 120.084728163946181, 36.360881925723639 ] ] } },
{ "type": "Feature", "properties": { "fid": 59, "road_id": "1A6", "name": "1A6", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.08472752759161, 36.360881186797641 ], [ 120.085026090876497, 36.360167458647865 ] ] } },
{ "type": "Feature", "properties": { "fid": 60, "road_id": "1B7", "name": "1B7", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.083182575864839, 36.361954935489095 ], [ 120.083221685014479, 36.36181624024416 ], [ 120.083254293262328, 36.361720207581641 ], [ 120.083301385283249, 36.361630233700552 ], [ 120.083339494653387, 36.361534611323727 ], [ 120.083339243540976, 36.361426724010585 ], [ 120.083324508655508, 36.361312777916019 ], [ 120.083299918678406, 36.361145545445503 ] ] } },
{ "type": "Feature", "properties": { "fid": 61, "road_id": "1B8", "name": "1B8", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.081527891662006, 36.362108941406667 ], [ 120.081487953705974, 36.362073325585335 ], [ 120.081469064094094, 36.361955750588841 ], [ 120.081469486179628, 36.361846253967592 ], [ 120.081481595507483, 36.36163197311064 ], [ 120.081425345192528, 36.361459060309734 ] ] } },
{ "type": "Feature", "properties": { "fid": 62, "road_id": "1B9", "name": "1B9", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.079741259986505, 36.363486957050483 ], [ 120.081289414394845, 36.364134573465506 ], [ 120.081396891422287, 36.364139823475369 ], [ 120.081743031805843, 36.364089854784446 ], [ 120.081800504742873, 36.364060950907657 ], [ 120.08186919096724, 36.363978119291623 ], [ 120.081894688784686, 36.36388100314548 ], [ 120.081887737527566, 36.363766531226418 ], [ 120.081873675840043, 36.363650975823738 ], [ 120.081873424727618, 36.36354308851061 ], [ 120.081911123812063, 36.363452967256066 ], [ 120.082058332208803, 36.363186945385628 ], [ 120.082068756759412, 36.363121342203883 ] ] } },
{ "type": "Feature", "properties": { "fid": 63, "road_id": "1B10", "name": "1B10", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.08346799307462, 36.362791460099089 ], [ 120.083428445369464, 36.362669025343585 ], [ 120.083414120769689, 36.362549578126739 ], [ 120.083351436787098, 36.362084663724268 ], [ 120.083297668221135, 36.361960062001508 ] ] } },
{ "type": "Feature", "properties": { "fid": 64, "road_id": "1B11", "name": "1B11", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.085499595540583, 36.362504869034829 ], [ 120.085395315989203, 36.361655716678484 ] ] } },
{ "type": "Feature", "properties": { "fid": 65, "road_id": "1C3", "name": "1C3", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.086563456614911, 36.363541755241179 ], [ 120.086458672379209, 36.36353006799883 ], [ 120.086354561341452, 36.363516771448374 ], [ 120.086260137987054, 36.363484836398456 ], [ 120.085795047941303, 36.363290282194775 ], [ 120.085698342080846, 36.363259283255033 ], [ 120.085641574176421, 36.363263900136623 ], [ 120.085576464984484, 36.363283936901453 ], [ 120.085350161177445, 36.363305089260898 ], [ 120.083963086059583, 36.363479330633538 ], [ 120.08385235858124, 36.363495411914876 ], [ 120.083736540266329, 36.363505581788232 ], [ 120.083686767253496, 36.363497997402824 ], [ 120.083640770516041, 36.363476865354549 ], [ 120.08359653046017, 36.36344701356775 ], [ 120.083558201812252, 36.363412070944364 ], [ 120.083530496957891, 36.363360772327553 ], [ 120.083511575511352, 36.363265875018143 ], [ 120.083470609506023, 36.363006700942201 ], [ 120.083402620079241, 36.362879932252191 ] ] } },
{ "type": "Feature", "properties": { "fid": 66, "road_id": "1B4", "name": "1B4", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.082066679396206, 36.363119527752922 ], [ 120.082165352980979, 36.363087058643515 ], [ 120.082285357856975, 36.363057839984997 ], [ 120.08340138421346, 36.362876106166077 ] ] } },
{ "type": "Feature", "properties": { "fid": 67, "road_id": "1B5", "name": "1B5", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.083401552512953, 36.362875703839045 ], [ 120.083467693319008, 36.362789916519034 ], [ 120.083564000693599, 36.36272242108209 ], [ 120.083639176019915, 36.362700922382608 ], [ 120.084439869924651, 36.362608517516662 ], [ 120.084555835613031, 36.362588954706851 ], [ 120.084685265260134, 36.362537205734704 ], [ 120.085139408495621, 36.362500270681984 ], [ 120.085238807147817, 36.362524832389248 ], [ 120.085349913077195, 36.362525927672714 ], [ 120.085579582873919, 36.362496728772683 ], [ 120.085681001119937, 36.362516462555611 ], [ 120.085786458553571, 36.362526540489824 ], [ 120.085886004579208, 36.362541709260654 ], [ 120.08598607642935, 36.362564661659803 ], [ 120.08609112357729, 36.362580240716305 ], [ 120.08618016134821, 36.362625050231159 ], [ 120.086268115635491, 36.362676970176416 ], [ 120.086351767822904, 36.362734654156206 ], [ 120.086431380822702, 36.362801993984704 ], [ 120.086475063219439, 36.362846739830246 ] ] } },
{ "type": "Feature", "properties": { "fid": 68, "road_id": "1B2", "name": "1B2", "directionality": "双向", "prohibited": false, "width": 8.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.081546062320513, 36.362953745969911 ], [ 120.081690501565163, 36.36291583940752 ], [ 120.083142781378911, 36.36265352820881 ], [ 120.083170902418885, 36.362647327953837 ], [ 120.083225887707002, 36.362622110748376 ], [ 120.083249969559361, 36.362625566342111 ], [ 120.083267598261926, 36.362637667987634 ], [ 120.083282066117647, 36.362655065612614 ], [ 120.083306010613967, 36.362708573048749 ], [ 120.083398970251295, 36.362875096369173 ] ] } },
{ "type": "Feature", "properties": { "fid": 69, "road_id": "1D5", "name": "1D5", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.089005136674004, 36.363972235393796 ], [ 120.089652635090758, 36.363464035975099 ] ] } },
{ "type": "Feature", "properties": { "fid": 70, "road_id": "1D6", "name": "1D6", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.090255250057112, 36.365630672396762 ], [ 120.09090877542063, 36.365130666892099 ] ] } },
{ "type": "Feature", "properties": { "fid": 71, "road_id": "1D2", "name": "1D2", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.088052793348353, 36.365367390544918 ], [ 120.088084465486034, 36.365269075376347 ], [ 120.08813088430901, 36.365180710803372 ], [ 120.088173148405559, 36.365088717328476 ], [ 120.088207302292219, 36.365038713238057 ], [ 120.088244380048224, 36.365008841416433 ], [ 120.088308027305473, 36.364978738517216 ], [ 120.088636170552846, 36.364940150521896 ], [ 120.088702857218223, 36.364943464642103 ], [ 120.088792568187074, 36.364986664848843 ], [ 120.088869341021677, 36.365069834846253 ], [ 120.089503811575725, 36.365908191330611 ], [ 120.089545211466401, 36.365953873286337 ], [ 120.089580468871532, 36.365978076577392 ], [ 120.089631030621078, 36.365997336405314 ], [ 120.089677174731989, 36.366009075517141 ], [ 120.090175442484551, 36.365988707500577 ], [ 120.090249155876208, 36.365957142666709 ], [ 120.090287265246346, 36.365861520289883 ] ] } },
{ "type": "Feature", "properties": { "fid": 72, "road_id": "1D3", "name": "1D3", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.09234405160457, 36.368760313672169 ], [ 120.090823255434231, 36.368124141622069 ], [ 120.090772841058111, 36.368095488857691 ], [ 120.090697677531637, 36.368012992058212 ], [ 120.090521549679309, 36.367778587167479 ], [ 120.090499114869644, 36.367701129335117 ], [ 120.090502492659155, 36.367589087295563 ], [ 120.090549847592314, 36.367503005228649 ], [ 120.090600767758076, 36.367458123809485 ], [ 120.090749309859646, 36.367365206024232 ], [ 120.091066000507098, 36.367168662956054 ], [ 120.091165873114306, 36.367142368166867 ] ] } },
{ "type": "Feature", "properties": { "fid": 73, "road_id": "1E6", "name": "1E6", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.093688743556925, 36.365536730099485 ], [ 120.093511982576331, 36.365466570140619 ], [ 120.093422156068684, 36.365410085183264 ], [ 120.093351294642076, 36.365321824349259 ], [ 120.093280696127692, 36.365237455329414 ], [ 120.093226369902581, 36.365127747665412 ], [ 120.093220354755644, 36.365015558252416 ], [ 120.093917935191428, 36.363338922106976 ], [ 120.093985275019904, 36.363259309107171 ], [ 120.094060071895186, 36.363220633842886 ], [ 120.094130682209382, 36.363201007363763 ], [ 120.094244218018261, 36.363191773600583 ], [ 120.094355639620574, 36.363183073620547 ], [ 120.094459750658331, 36.363196370171003 ], [ 120.094636774551162, 36.36327042194403 ] ] } },
{ "type": "Feature", "properties": { "fid": 74, "road_id": "1D4", "name": "1D4", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.093293408068646, 36.366481796291062 ], [ 120.092933333336191, 36.366325498830975 ], [ 120.092844968763217, 36.366279080008006 ], [ 120.092760790751313, 36.366213612399868 ], [ 120.092587638637809, 36.36605797990272 ], [ 120.092541358953284, 36.365951638228388 ], [ 120.092478838814145, 36.365847957511157 ], [ 120.090711112149862, 36.363532884108565 ], [ 120.090695178241972, 36.363412763693781 ] ] } },
{ "type": "Feature", "properties": { "fid": 75, "road_id": "1E2", "name": "1E2", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.090694242131789, 36.363410481187728 ], [ 120.090724567873593, 36.363315384635392 ], [ 120.091001104852097, 36.362663351935851 ], [ 120.091079709837402, 36.362588451321606 ], [ 120.09116992659591, 36.362558117344804 ], [ 120.091236497722491, 36.362548146714381 ], [ 120.094809711628812, 36.362097595295786 ], [ 120.094911803072762, 36.362115719770593 ], [ 120.095090436273722, 36.362190444741557 ] ] } },
{ "type": "Feature", "properties": { "fid": 76, "road_id": "1E1", "name": "1E1", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.089409363765128, 36.362739214746945 ], [ 120.089438984474327, 36.362668405189808 ], [ 120.089442445967975, 36.362592325587968 ], [ 120.08945592172654, 36.362456143926671 ], [ 120.089495903317044, 36.362365086561951 ], [ 120.089560024529291, 36.362284127166291 ], [ 120.08966411553223, 36.362216105904857 ], [ 120.089752113453997, 36.362141352664061 ], [ 120.089858076677288, 36.362077896414746 ], [ 120.089975978255325, 36.362017543242864 ], [ 120.090106754298318, 36.361962575654481 ], [ 120.090305037578062, 36.361899919941727 ], [ 120.090481810358483, 36.361866084401619 ], [ 120.090587089475221, 36.361835905756926 ], [ 120.090778608940937, 36.36181202081243 ], [ 120.091318288384031, 36.361733339252631 ], [ 120.091489328964585, 36.361672523925577 ], [ 120.091616349658224, 36.361640094609484 ], [ 120.092315067657808, 36.361542850019376 ], [ 120.092420672464897, 36.361543535017141 ], [ 120.092521827798663, 36.361559376985888 ], [ 120.092750939936252, 36.361545072144608 ], [ 120.094102966909347, 36.36143653357518 ], [ 120.094212200618344, 36.361433063846533 ], [ 120.094230808174359, 36.361393102014517 ], [ 120.094595681456013, 36.360520857015224 ] ] } },
{ "type": "Feature", "properties": { "fid": 77, "road_id": "1E3", "name": "1E3", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.094595008258068, 36.360522466323339 ], [ 120.094686152891754, 36.360309101541752 ], [ 120.094741669904295, 36.360239670215137 ], [ 120.094788813794679, 36.36020833645884 ], [ 120.094844267137887, 36.360184260506408 ], [ 120.094955110155013, 36.360181463975692 ], [ 120.095048187113548, 36.360216617641854 ], [ 120.095782704812734, 36.360521986592822 ] ] } },
{ "type": "Feature", "properties": { "fid": 78, "road_id": "1E4", "name": "1E4", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.094212368917823, 36.361432661519508 ], [ 120.094279864354775, 36.361528968894099 ], [ 120.094268177112426, 36.361633753129794 ], [ 120.09417907210738, 36.361923607798907 ], [ 120.094181605725851, 36.362030559001866 ], [ 120.09419979030514, 36.362172420993559 ] ] } },
{ "type": "Feature", "properties": { "fid": 79, "road_id": "1E5", "name": "1E5", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.092524110304709, 36.361558440875712 ], [ 120.092503954436268, 36.361769355742972 ], [ 120.092461427427466, 36.361857457403715 ], [ 120.092412726098445, 36.361946758086866 ], [ 120.092384945774938, 36.362044810343193 ], [ 120.092399007462461, 36.362160365745872 ], [ 120.092426047353896, 36.362398586981627 ] ] } },
{ "type": "Feature", "properties": { "fid": 80, "road_id": "1D8", "name": "1D8", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.092589247945924, 36.366058653100659 ], [ 120.09251184198304, 36.36613972803513 ], [ 120.092419426422623, 36.366206960559815 ], [ 120.092356304989849, 36.366244847087373 ], [ 120.092279930641126, 36.366260171466628 ], [ 120.091943414271611, 36.366336857032266 ] ] } },
{ "type": "Feature", "properties": { "fid": 81, "road_id": "1D7", "name": "1D7", "directionality": "双向", "prohibited": false, "width": 10.0, "speed_limit": 30.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.091505218097993, 36.364572746330069 ], [ 120.091284360870119, 36.36475265045776 ], [ 120.091229959175877, 36.364792293666895 ], [ 120.091176788338714, 36.36481543350915 ], [ 120.09105131417509, 36.364821564194891 ], [ 120.090935232947928, 36.364827842254073 ], [ 120.090847414234261, 36.364870524871321 ], [ 120.09075338936573, 36.36493708419809 ] ] } },
{ "type": "Feature", "properties": { "fid": 82, "road_id": "XC1", "name": "XC1", "directionality": "双向", "prohibited": false, "width": 15.0, "speed_limit": 50.0, "width_limit": 3.5, "height_limit": 3.2 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.087792927807811, 36.377562881777465 ], [ 120.091385653739394, 36.368972058451163 ], [ 120.091460526083807, 36.368784032313748 ], [ 120.091532179811992, 36.368594659780449 ], [ 120.0915831754469, 36.368400427488147 ], [ 120.09161403881302, 36.368209119065178 ], [ 120.091626936877603, 36.368006513650748 ], [ 120.091605481812593, 36.367804665138394 ], [ 120.091559329466705, 36.367607612715716 ], [ 120.09149813568861, 36.367419395570366 ], [ 120.091409026013395, 36.367234628118837 ], [ 120.091292484413458, 36.367043112770624 ], [ 120.090472126419428, 36.365849031958305 ] ] } },
{ "type": "Feature", "properties": { "fid": 83, "road_id": "XC2", "name": "XC2", "directionality": "双向", "prohibited": false, "width": 15.0, "speed_limit": 50.0, "width_limit": 3.5, "height_limit": 3.2 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.076927347458437, 36.373018590562467 ], [ 120.080520204846152, 36.364429713143245 ], [ 120.080600841225092, 36.36424598910569 ], [ 120.080678932185748, 36.364059309364144 ], [ 120.080763723291099, 36.363879214228518 ], [ 120.080865953873499, 36.363702632456018 ], [ 120.080986580969153, 36.363540837162141 ], [ 120.081122312275099, 36.363397178419227 ], [ 120.08128083680694, 36.363266836261595 ], [ 120.081451267858853, 36.363162274868486 ], [ 120.081632574707953, 36.363076917592657 ], [ 120.081786964548186, 36.363024264344979 ], [ 120.081924556274686, 36.362989166113131 ], [ 120.082105294556015, 36.362950371192547 ], [ 120.083174356230202, 36.362767900506384 ] ] } },
{ "type": "Feature", "properties": { "fid": 84, "road_id": "FB1", "name": "FB1", "directionality": "双向", "prohibited": true, "width": 15.0, "speed_limit": 50.0, "width_limit": 3.5, "height_limit": 3.8 }, "geometry": { "type": "LineString", "coordinates": [ [ 120.079467258498624, 36.366228095481588 ], [ 120.074334670015787, 36.364082474242814 ] ] } }
]
}

93
public/dianziweilan.json Normal file
View File

@ -0,0 +1,93 @@
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
120.07177603096052,
36.370812533360755
],
[
120.08385709134191,
36.33999243140878
],
[
120.08565563667813,
36.34060862711547
],
[
120.08669982868061,
36.34062878164365
],
[
120.07455220429061,
36.37193239994289
],
[
120.07234631337181,
36.37156118999518
],
[
120.07177603096052,
36.370812533360755
]
]
]
},
"properties": {
"type": "polygon",
"area": 671992.2620217785,
"perimeter": 6459.222679044949,
"vertices": 6
}
},
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
120.09357854630166,
36.38111581893121
],
[
120.09150927608138,
36.38118099552585
],
[
120.09017484057917,
36.380485019173435
],
[
120.10265440053722,
36.34926707805199
],
[
120.10434101414667,
36.34985392006327
],
[
120.1053224475362,
36.35065874503395
],
[
120.09357854630166,
36.38111581893121
]
]
]
},
"properties": {
"type": "polygon",
"area": 731220.4002154289,
"perimeter": 6460.346045623342,
"vertices": 6
}
}
]
}

4044
public/roadTest.json Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
src/assets/images/layer.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 881 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -209,7 +209,7 @@ function handleCurrentChange(val) {
// width: 100%;
// Element Plus
// ::v-deep(.el-pagination) {
// :deep(.el-pagination) {
// padding: 0;
// background: none;
// border: 1px solid #0a4273;

View File

@ -157,11 +157,11 @@ function exportData() {
}
}
::v-deep(.el-input__wrapper:hover) {
:deep(.el-input__wrapper:hover) {
box-shadow: none !important;
}
::v-deep(.el-select) {
:deep(.el-select) {
border: none !important;
width: 140px !important;
// el-selectborder
@ -169,7 +169,7 @@ function exportData() {
--el-border-color: #343744 !important;
}
::v-deep(.el-input__wrapper) {
:deep(.el-input__wrapper) {
background: #343744 !important;
border: none !important;
border-radius: 8px !important;
@ -179,11 +179,11 @@ function exportData() {
box-shadow: none !important;
}
::v-deep(.el-select__wrapper.is-focused) {
:deep(.el-select__wrapper.is-focused) {
box-shadow: none !important;
}
::v-deep(.el-select__wrapper) {
:deep(.el-select__wrapper) {
background: #343744 !important;
color: #96A0B5 !important;
border-radius: 8px !important;
@ -194,11 +194,11 @@ function exportData() {
border: none !important;
}
::v-deep(.el-select__placeholder) {
:deep(.el-select__placeholder) {
color: #96A0B5 !important;
}
::v-deep(.el-button) {
:deep(.el-button) {
background: #343744;
border-color: transparent;
border-radius: 8px;

View File

@ -135,11 +135,11 @@ function handlePagination({ page: newPage, limit: newLimit }) {
}
//
::v-deep(.el-input__wrapper:hover) {
:deep(.el-input__wrapper:hover) {
box-shadow: none !important;
}
::v-deep(.el-select) {
:deep(.el-select) {
border: none !important;
width: 160px !important;
// el-selectborder
@ -147,11 +147,11 @@ function handlePagination({ page: newPage, limit: newLimit }) {
--el-border-color: #343744 !important;
}
::v-deep(.el-select__wrapper.is-focused) {
:deep(.el-select__wrapper.is-focused) {
box-shadow: none !important;
}
::v-deep(.el-select__wrapper) {
:deep(.el-select__wrapper) {
background: #343744 !important;
color: #96A0B5 !important;
border-radius: 8px !important;
@ -161,7 +161,7 @@ function handlePagination({ page: newPage, limit: newLimit }) {
border: none !important;
}
::v-deep(.el-input__wrapper) {
:deep(.el-input__wrapper) {
background: #343744 !important;
color: #96A0B5 !important;
border-radius: 8px !important;
@ -170,7 +170,7 @@ function handlePagination({ page: newPage, limit: newLimit }) {
box-shadow: none !important;
}
::v-deep(.el-select__placeholder) {
:deep(.el-select__placeholder) {
color: #96A0B5 !important;
}

View File

@ -23,6 +23,9 @@
<!-- 比例尺控件传递map对象 -->
<OpenLayersScaleControl :map="map" />
<!-- 路线绘制控件 -->
<RouteDrawControl :map="map" ref="routeDrawControlRef" v-if="map" />
<!-- 插槽允许父组件添加其他控件 -->
<slot></slot>
</div>
@ -45,6 +48,7 @@ import OpenLayersMapInfo from "./controls/OpenLayersMapInfo.vue";
import OverviewMap from 'ol/control/OverviewMap';
import ScaleLine from 'ol/control/ScaleLine';
import OpenLayersScaleControl from "./controls/OpenLayersScaleControl.vue";
import RouteDrawControl from "./controls/RouteDrawControl.vue";
// EPSG:4528
proj4.defs(

View File

@ -0,0 +1,904 @@
<template>
<div class="layer-switcher">
<div class="layer-icon" @click="toggleLayerPanel"></div>
<!-- 图层面板 -->
<div class="layer-panel" v-if="showPanel">
<!-- 标签页切换 -->
<div class="panel-tabs">
<div
class="tab"
:class="{ active: activeTab === 'icon' }"
@click="activeTab = 'icon'"
>
图标
</div>
<!-- <div
class="tab"
:class="{ active: activeTab === 'text' }"
@click="activeTab = 'text'"
>
文本
</div> -->
<div
class="tab"
:class="{ active: activeTab === 'road' }"
@click="activeTab = 'road'"
>
道路
</div>
</div>
<div class="panel-content" v-if="activeTab === 'icon'">
<!-- 航空器图层 -->
<div class="layer-group">
<div class="group-title">航空器</div>
<div class="layer-grid">
<div class="layer-item" v-for="layer in exampleVehicleLayers.filter(l => l.id !== 'no-people-car')" :key="'example-'+layer.id">
<label class="checkbox-container">
<input type="checkbox" :checked="layer.visible" @change="toggleExampleLayer(layer)">
<span class="checkmark"></span>
<span class="layer-name">{{ layer.name }}</span>
<img :src="layer.icon" class="layer-icon-preview" />
</label>
</div>
</div>
</div>
<!-- 无人车全选 -->
<div class="layer-group">
<div class="group-title">无人车</div>
<div class="layer-grid-full">
<div class="layer-item">
<label class="checkbox-container">
<input type="checkbox" :checked="getExampleLayerById('no-people-car').visible" @change="toggleExampleLayer(getExampleLayerById('no-people-car'))">
<span class="checkmark"></span>
<span class="layer-name">无人车全选</span>
<img :src="noPeopleCarIcon" class="layer-icon-preview" />
</label>
</div>
</div>
</div>
<!-- 常用车辆 -->
<div class="layer-group">
<div class="group-title">常用车辆</div>
<div class="layer-grid">
<div class="layer-item">
<label class="checkbox-container">
<input type="checkbox" :checked="getLayerById('driving-car').visible" @change="toggleVehicleLayer(getLayerById('driving-car'))">
<span class="checkmark"></span>
<span class="layer-name">驱鸟车</span>
</label>
</div>
<div class="layer-item">
<label class="checkbox-container">
<input type="checkbox" :checked="getLayerById('push-car').visible" @change="toggleVehicleLayer(getLayerById('push-car'))">
<span class="checkmark"></span>
<span class="layer-name">摆渡车</span>
</label>
</div>
<div class="layer-item">
<label class="checkbox-container">
<input type="checkbox" :checked="getLayerById('military-car').visible" @change="toggleVehicleLayer(getLayerById('military-car'))">
<span class="checkmark"></span>
<span class="layer-name">牵引车</span>
</label>
</div>
</div>
</div>
<!-- 其他车辆图层 -->
<div class="layer-group">
<div class="group-title">其他车辆</div>
<div class="layer-grid">
<div class="layer-item" v-for="layer in otherVehicleLayers" :key="'vehicle-'+layer.id">
<label class="checkbox-container">
<input type="checkbox" :checked="layer.visible" @change="toggleVehicleLayer(layer)">
<span class="checkmark"></span>
<span class="layer-name">{{ layer.name }}</span>
</label>
</div>
</div>
</div>
</div>
<div class="panel-content" v-else-if="activeTab === 'road'">
<div class="layer-group">
<div class="group-title">道路图层</div>
<div class="layer-grid-full">
<div class="layer-item">
<label class="checkbox-container">
<input type="checkbox" :checked="!hideRoadLayer" @change="toggleHideRoadLayer" />
<span class="checkmark"></span>
<span class="layer-name">电子围栏</span>
<svg class="layer-icon-preview" width="24" height="24" viewBox="0 0 1024 1024"><path d="M356.246145 681.56286c-68.156286-41.949414-107.246583-103.84102-107.246583-169.805384 0-65.966411 39.090297-127.860063 107.246583-169.809477 12.046361-7.414877 15.800871-23.190165 8.385994-35.236526-7.413853-12.046361-23.191188-15.801894-35.236526-8.387018-39.640836 24.399713-72.539106 56.044434-95.137801 91.515297-23.86657 37.461193-36.481889 79.620385-36.481889 121.917724 0 42.297338 12.615319 84.454484 36.481889 121.914654 22.598694 35.469839 55.496965 67.11456 95.137801 91.51325 4.185322 2.576685 8.821923 3.804652 13.400195 3.804652 8.598842 0 16.998139-4.329609 21.836331-12.190647C372.047016 704.752002 368.291482 688.976714 356.246145 681.56286z" fill="#409eff"/></svg>
</label>
</div>
<!-- 添加自定义路线图层选项 -->
<div class="layer-item">
<label class="checkbox-container">
<input type="checkbox" v-model="showCustomRoadLayer" />
<span class="checkmark"></span>
<span class="layer-name">路线图</span>
<svg class="layer-icon-preview" width="24" height="24" viewBox="0 0 1024 1024"><path d="M356.246145 681.56286c-68.156286-41.949414-107.246583-103.84102-107.246583-169.805384 0-65.966411 39.090297-127.860063 107.246583-169.809477 12.046361-7.414877 15.800871-23.190165 8.385994-35.236526-7.413853-12.046361-23.191188-15.801894-35.236526-8.387018-39.640836 24.399713-72.539106 56.044434-95.137801 91.515297-23.86657 37.461193-36.481889 79.620385-36.481889 121.917724 0 42.297338 12.615319 84.454484 36.481889 121.914654 22.598694 35.469839 55.496965 67.11456 95.137801 91.51325 4.185322 2.576685 8.821923 3.804652 13.400195 3.804652 8.598842 0 16.998139-4.329609 21.836331-12.190647C372.047016 704.752002 368.291482 688.976714 356.246145 681.56286z" fill="#FF5722"/></svg>
</label>
</div>
</div>
</div>
</div>
<div class="panel-content" v-else>
<!-- 文本标签页内容 -->
<div class="layer-group">
<div class="group-title">文本样式</div>
<div class="style-selector">
<div class="style-item">
<div class="style-label">默认样式</div>
<div class="radio-box" :class="{ active: selectedTextStyle === 'default' }" @click="selectTextStyle('default')"></div>
</div>
<div class="style-item">
<div class="style-label">蓝色样式</div>
<div class="radio-box blue" :class="{ active: selectedTextStyle === 'blue' }" @click="selectTextStyle('blue')"></div>
</div>
<div class="style-item">
<div class="style-label">白色样式</div>
<div class="radio-box white" :class="{ active: selectedTextStyle === 'white' }" @click="selectTextStyle('white')"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, watch, computed, onBeforeMount, onUnmounted } from 'vue';
import { Vector as VectorSource } from 'ol/source';
import { Vector as VectorLayer } from 'ol/layer';
import { Style, Icon, Stroke, Fill } from 'ol/style';
import Feature from 'ol/Feature';
import Point from 'ol/geom/Point';
import GeoJSON from 'ol/format/GeoJSON';
//
import car1Icon from '../../../assets/images/Aircraft.png';
import car2Icon from '../../../assets/images/noPeopleCar.png';
import noPeopleCarIcon from '../../../assets/images/noPeopleCar.png';
// props
const props = defineProps({
map: Object
});
//
const showPanel = ref(false);
const activeTab = ref('icon'); //
const selectedTextStyle = ref('white'); //
// tab
const hideRoadLayer = ref(false); //
const showRoadLayer = computed(() => !hideRoadLayer.value); // hideRoadLayer
let roadVectorLayer = null;
// 线
const showCustomRoadLayer = ref(true); //
let customRoadVectorLayer = null;
// -
const exampleVehicleLayers = ref([
{
id: 'car1-layer',
name: '滑入航空器',
visible: true,
icon: car1Icon,
layer: null,
features: [
{ id: 'car1-1', position: [40507699.051041, 4026243.105796], name: '滑入航空器1' },
{ id: 'car1-2', position: [40508097.909698, 4026315.085762], name: '滑入航空器2' }
]
},
{
id: 'car1-layer1',
name: '滑出航空器',
visible: true,
icon: car1Icon,
layer: null,
features: [
{ id: 'car2-1', position: [4.0507e7, 4024000], name: '滑出航空器1' },
]
},
{
id: 'no-people-car',
name: '无人车全选',
visible: true,
icon: noPeopleCarIcon,
layer: null,
features: [
{ id: 'no-people-car-1', position: [40508392.141630, 4026279.431719], name: '无人车1' },
{ id: 'no-people-car-2', position: [40507625.995559, 4025622.462289], name: '无人车2' }
]
}
]);
// -
const vehicleLayers = ref([
{ id: 'slip-in-plane', name: '滑入航空器', visible: true, layer: null },
{ id: 'slip-out-plane', name: '滑出航空器', visible: true, layer: null },
{ id: 'uav', name: '无人车全选', visible: true, layer: null },
{ id: 'driving-car', name: '驱鸟车', visible: true, layer: null },
{ id: 'push-car', name: '摆渡车', visible: true, layer: null },
{ id: 'military-car', name: '牵引车', visible: true, layer: null },
{ id: 'special-car', name: '特勤车全选', visible: false, layer: null },
{ id: 'fire-car', name: '消防车', visible: false, layer: null },
{ id: 'water-car', name: '清水车', visible: false, layer: null },
{ id: 'patrol-car', name: '巡逻车', visible: false, layer: null },
{ id: 'emergency-car', name: '急救车', visible: false, layer: null },
{ id: 'container-car', name: '客梯车', visible: false, layer: null },
{ id: 'small-car', name: '小型客车', visible: false, layer: null },
{ id: 'maintenance-car', name: '维修车', visible: false, layer: null },
{ id: 'tool-car', name: '工具车', visible: false, layer: null },
{ id: 'tour-car', name: '巡游车', visible: false, layer: null },
{ id: 'sewage-car', name: '污水车', visible: false, layer: null },
{ id: 'road-car', name: '道路车', visible: false, layer: null },
{ id: 'garbage-car', name: '垃圾车', visible: false, layer: null },
{ id: 'police-car', name: '警察车', visible: false, layer: null },
{ id: 'forklift', name: '叉车', visible: false, layer: null }
]);
//
const textStyles = ref([
{ id: 'slip-in-plane', name: '滑入航空器', visible: true, layer: null },
{ id: 'slip-out-plane', name: '滑出航空器', visible: true, layer: null },
{ id: 'uav', name: '无人车全选', visible: true, layer: null },
{ id: 'driving-car', name: '驱鸟车', visible: true, layer: null },
{ id: 'push-car', name: '摆渡车', visible: true, layer: null },
{ id: 'military-car', name: '军引车', visible: true, layer: null },
{ id: 'special-car', name: '特勤车全选', visible: false, layer: null },
{ id: 'fire-car', name: '消防车', visible: false, layer: null },
]);
//
const otherVehicleLayers = computed(() => {
const excludedIds = ['uav', 'driving-car', 'push-car', 'military-car', 'slip-in-plane', 'slip-out-plane'];
return vehicleLayers.value.filter(layer => !excludedIds.includes(layer.id));
});
// ID
function getLayerById(id) {
return vehicleLayers.value.find(layer => layer.id === id) || { visible: false };
}
// ID
function getExampleLayerById(id) {
return exampleVehicleLayers.value.find(layer => layer.id === id) || { visible: false };
}
//
const emit = defineEmits(['layerChange']);
//
function toggleLayerPanel() {
showPanel.value = !showPanel.value;
}
//
function toggleExampleLayer(layer) {
layer.visible = !layer.visible;
if (layer.layer) {
layer.layer.setVisible(layer.visible);
}
//
emit('layerChange', {
type: 'exampleLayer',
layer: layer
});
}
//
function initExampleLayers() {
if (!props.map) return;
//
exampleVehicleLayers.value.forEach(layerConfig => {
//
const source = new VectorSource();
//
const style = new Style({
image: new Icon({
src: layerConfig.icon,
scale: 1.5,
anchor: [0.5, 0.5]
})
});
//
layerConfig.features.forEach(vehicle => {
const feature = new Feature({
geometry: new Point(vehicle.position),
name: vehicle.name,
id: vehicle.id
});
feature.setStyle(style);
source.addFeature(feature);
});
//
const vectorLayer = new VectorLayer({
source: source,
visible: layerConfig.visible,
zIndex: 10 //
});
//
layerConfig.layer = vectorLayer;
//
props.map.addLayer(vectorLayer);
//
vectorLayer.setVisible(layerConfig.visible);
console.log(`初始化图层: ${layerConfig.id}, 可见性: ${layerConfig.visible}`);
});
}
//
function toggleVehicleLayer(layer) {
layer.visible = !layer.visible;
if (layer.layer) {
layer.layer.setVisible(layer.visible);
}
//
emit('layerChange', {
type: 'vehicleLayer',
layer: layer
});
}
//
function toggleTextStyle(textStyle) {
textStyle.visible = !textStyle.visible;
//
emit('layerChange', {
type: 'textStyle',
style: textStyle
});
}
//
function selectTextStyle(style) {
selectedTextStyle.value = style;
//
emit('layerChange', {
type: 'selectTextStyle',
style: style
});
}
//
function initLayers() {
if (!props.map) return;
//
initExampleLayers();
}
//
function setLayerVisibility(layerId, visible) {
//
const exampleLayer = exampleVehicleLayers.value.find(layer => layer.id === layerId);
if (exampleLayer) {
exampleLayer.visible = visible;
if (exampleLayer.layer) {
exampleLayer.layer.setVisible(visible);
}
return true;
}
//
const vehicleLayer = vehicleLayers.value.find(layer => layer.id === layerId);
if (vehicleLayer) {
vehicleLayer.visible = visible;
//
emit('layerChange', {
type: 'vehicleLayer',
layer: vehicleLayer
});
return true;
}
return false;
}
//
function toggleHideRoadLayer() {
hideRoadLayer.value = !hideRoadLayer.value;
console.log('toggleHideRoadLayer: hideRoadLayer =', hideRoadLayer.value, 'showRoadLayer =', showRoadLayer.value);
if (showRoadLayer.value) {
addRoadLayer();
} else {
removeRoadLayer();
}
}
//
onMounted(() => {
if (props.map) {
initLayers();
// 线
loadCustomRoadLayer();
// -
if (showRoadLayer.value) {
addRoadLayer();
}
}
});
//
watch(() => props.map, (newMap) => {
if (newMap) {
initLayers();
// 线
loadCustomRoadLayer();
//
if (showRoadLayer.value) {
addRoadLayer();
}
}
});
//
defineExpose({
setLayerVisibility
});
async function loadCustomRoadLayer() {
// 线
removeCustomRoadLayer();
if (!props.map) return;
try {
// 使线
const res = await fetch('./roadTest.json');
const geojson = await res.json();
const source = new VectorSource({
features: new GeoJSON().readFeatures(geojson, {
dataProjection: 'EPSG:4326',
featureProjection: props.map.getView().getProjection()
})
});
customRoadVectorLayer = new VectorLayer({
source,
style: new Style({
stroke: new Stroke({ color: '#888', width: 4 })
}),
zIndex: 2, //
visible: showCustomRoadLayer.value
});
props.map.addLayer(customRoadVectorLayer);
console.log('loadCustomRoadLayer: 已添加自定义路线图层', customRoadVectorLayer);
} catch (e) {
console.error('loadCustomRoadLayer: 加载或添加自定义路线图层失败', e);
}
}
function removeCustomRoadLayer() {
if (!props.map) return;
let removed = false;
// VectorLayer zIndex 2 线
const layers = props.map.getLayers().getArray();
for (let i = layers.length - 1; i >= 0; i--) {
const lyr = layers[i];
if (lyr instanceof VectorLayer && lyr.getZIndex && lyr.getZIndex() === 2) {
props.map.removeLayer(lyr);
removed = true;
console.log('removeCustomRoadLayer: 已移除自定义路线图层', lyr);
}
}
customRoadVectorLayer = null;
if (!removed) {
console.log('removeCustomRoadLayer: 没有找到可移除的自定义路线图层');
}
}
// 线
watch(showCustomRoadLayer, (val) => {
console.log('showCustomRoadLayer变化:', val);
if (val) {
if (customRoadVectorLayer) {
customRoadVectorLayer.setVisible(true);
} else {
loadCustomRoadLayer();
}
} else if (customRoadVectorLayer) {
customRoadVectorLayer.setVisible(false);
}
});
async function addRoadLayer() {
//
removeRoadLayer();
if (!props.map) return;
try {
// 使
const res = await fetch('./dianziweilan.json');
const geojson = await res.json();
const source = new VectorSource({
features: new GeoJSON().readFeatures(geojson, {
dataProjection: 'EPSG:4326',
featureProjection: props.map.getView().getProjection()
})
});
// -
const normalStyle = new Style({
stroke: new Stroke({ color: 'rgba(0, 0, 0, 0.4)', width: 4 }),
fill: new Fill({ color: 'rgba(0, 0, 0, 0.5)' })
});
const flashStyle = new Style({
stroke: new Stroke({ color: 'rgba(255, 0, 0, 0.8)', width: 4 }),
fill: new Fill({ color: 'rgba(255, 0, 0, 0.3)' })
});
roadVectorLayer = new VectorLayer({
source,
style: normalStyle,
zIndex: 1,
className: 'fence-layer'
});
props.map.addLayer(roadVectorLayer);
console.log('addRoadLayer: 已添加电子围栏图层', roadVectorLayer);
//
startFenceFlashing(roadVectorLayer, normalStyle, flashStyle);
} catch (e) {
console.error('addRoadLayer: 加载或添加电子围栏图层失败', e);
}
}
let flashingInterval = null;
//
function startFenceFlashing(layer, normalStyle, flashStyle) {
//
if (flashingInterval) {
clearInterval(flashingInterval);
}
//
let isFlashing = false;
//
flashingInterval = setInterval(() => {
if (!layer) return;
layer.setStyle(isFlashing ? normalStyle : flashStyle);
isFlashing = !isFlashing;
}, 800); // 800
}
//
function stopFenceFlashing() {
if (flashingInterval) {
clearInterval(flashingInterval);
flashingInterval = null;
}
}
//
function removeRoadLayer() {
if (!props.map) return;
stopFenceFlashing();
let removed = false;
// VectorLayer zIndex 1
const layers = props.map.getLayers().getArray();
for (let i = layers.length - 1; i >= 0; i--) {
const lyr = layers[i];
if (lyr instanceof VectorLayer && lyr.getZIndex && lyr.getZIndex() === 1) {
props.map.removeLayer(lyr);
removed = true;
console.log('removeRoadLayer: 已移除道路图层', lyr);
}
}
roadVectorLayer = null;
if (!removed) {
console.log('removeRoadLayer: 没有找到可移除的道路图层');
}
}
watch(showRoadLayer, (val) => {
console.log('showRoadLayer变化:', val);
if (val) addRoadLayer();
else removeRoadLayer();
});
onUnmounted(() => {
removeRoadLayer();
removeCustomRoadLayer();
stopFenceFlashing();
});
</script>
<style scoped>
.layer-switcher {
position: relative;
}
.layer-icon {
width: 40px;
height: 40px;
cursor: pointer;
}
.layer-panel {
position: absolute;
top: 10px;
left: 50px;
width:397px;
background-color: #424851;
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0,0,0,0.4);
z-index: 3100;
overflow: hidden;
color: #ffffff;
}
.panel-tabs {
display: flex;
border-bottom: 1px solid #303850;
}
.tab {
padding: 0 20px;
height: 40px;
line-height: 40px;
font-size: 14px;
text-align: center;
cursor: pointer;
transition: all 0.2s ease;
color: #F0F0F0;
position: relative;
}
.tab:hover {
color: #409eff;
}
.tab.active {
color: #409eff;
}
.tab.active::after {
content: "";
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 100%;
height: 2px;
background-color: #409eff;
}
.panel-content {
padding: 10px;
max-height: 400px;
overflow-y: auto;
}
.layer-group {
margin-bottom: 15px;
}
.group-title {
font-weight: bold;
margin-bottom: 8px;
padding-bottom: 5px;
border-bottom: 1px solid #999999;
color: #ffffff;
}
.layer-grid {
display: grid;
grid-template-columns: auto auto auto;
gap: 5px;
}
.layer-grid-full {
display: grid;
grid-template-columns: 1fr;
gap: 5px;
}
.layer-item {
padding: 6px 0;
}
/* 自定义复选框样式 */
.checkbox-container {
display: flex;
align-items: center;
position: relative;
padding-left: 30px;
cursor: pointer;
font-size: 14px;
user-select: none;
}
.checkbox-container input {
position: absolute;
opacity: 0;
cursor: pointer;
height: 0;
width: 0;
}
.checkmark {
position: absolute;
left: 0;
height: 18px;
width: 18px;
background-color: transparent;
border: 1px solid #999999;
border-radius: 3px;
}
.checkbox-container:hover input ~ .checkmark {
background-color: #666666;
}
.checkbox-container input:checked ~ .checkmark {
background-color: #0096ff;
border-color: #0078cc;
}
.checkmark:after {
content: "";
position: absolute;
display: none;
}
.checkbox-container input:checked ~ .checkmark:after {
display: block;
}
.checkbox-container .checkmark:after {
left: 6px;
top: 2px;
width: 5px;
height: 10px;
border: solid white;
border-width: 0 2px 2px 0;
transform: rotate(45deg);
}
.layer-name {
margin-left: 5px;
color: #ffffff;
}
/* 图层图标预览 */
.layer-icon-preview {
width: 24px;
height: 24px;
margin-left: 8px;
object-fit: contain;
}
/* 滚动条样式 */
.panel-content::-webkit-scrollbar {
width: 6px;
}
.panel-content::-webkit-scrollbar-track {
background: #555555;
}
.panel-content::-webkit-scrollbar-thumb {
background: #999999;
border-radius: 3px;
}
.panel-content::-webkit-scrollbar-thumb:hover {
background: #bbbbbb;
}
/* 文本样式选择器 */
.style-selector {
display: flex;
flex-direction: column;
gap: 15px;
padding: 10px 0;
}
.style-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 5px 10px;
}
.style-label {
font-size: 14px;
color: #ffffff;
}
.radio-box {
width: 20px;
height: 20px;
border: 2px solid #999999;
border-radius: 3px;
cursor: pointer;
position: relative;
}
.radio-box:hover {
border-color: #bbbbbb;
}
.radio-box.active {
border-color: #0096ff;
}
.radio-box.active::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 12px;
height: 12px;
background-color: #0096ff;
border-radius: 1px;
}
.radio-box.blue {
border-color: #0096ff;
}
.radio-box.blue.active::after {
background-color: #0096ff;
}
.radio-box.white {
border-color: #ffffff;
}
.radio-box.white.active::after {
background-color: #ffffff;
}
/* 道路json样式 */
.road-json {
padding: 10px;
background-color: #333;
border-radius: 4px;
margin-top: 10px;
}
.road-json pre {
margin: 0;
padding: 0;
white-space: pre-wrap;
word-break: break-all;
}
</style>

View File

@ -1,7 +1,7 @@
<template>
<div class="map-info">
<input type="text" readonly :value="xyText" />
<input type="text" readonly :value="wgs84Text" />
<!-- <input type="text" readonly :value="xyText" />
<input type="text" readonly :value="wgs84Text" /> -->
<!-- <input type="text" readonly :value="pixelText" /> -->
</div>
</template>
@ -39,10 +39,10 @@ function handleMouseMove(event) {
// 3. WGS84
try {
const [lng, lat] = transform(coordinate, 'EPSG:4528', 'EPSG:4326');
console.log('WGS84坐标:', lng, lat);
// console.log('WGS84:', lng, lat);
wgs84Text.value = `WGS84: 经度=${lng.toFixed(6)}°, 纬度=${lat.toFixed(6)}°`;
} catch (error) {
console.error('坐标转换失败:', error);
// console.error(':', error);
wgs84Text.value = 'WGS84: 转换错误';
}
} else {

View File

@ -10,7 +10,7 @@
<script setup>
import { ref, onMounted } from 'vue';
// import LayerSwitcher from './LayerSwitcher.vue';
import LayerSwitcher from './LayerSwitcher.vue';
// props
const props = defineProps({

View File

@ -0,0 +1,712 @@
<template>
<div class="route-draw-control">
<div class="draw-tools">
<div class="tool-button" @click="startDrawLine" :class="{ active: isDrawing && drawType === 'LineString' }">
<span>绘制路线</span>
</div>
<div class="tool-button" @click="startDrawPolygon" :class="{ active: isDrawing && drawType === 'Polygon' }">
<span>绘制点线面</span>
</div>
<div class="tool-button" @click="clearDraw">
<span>清除</span>
</div>
<div class="tool-button" @click="exportRouteData">
<span>导出数据</span>
</div>
<div class="tool-button" @click="showImportDialog = true">
<span>导入数据</span>
</div>
</div>
<!-- 右侧点线面信息展示面板 -->
<div class="polygon-panel" v-if="showPolygonPanel">
<div class="panel-header">
<span>点线面信息</span>
<span class="close-btn" @click="closePolygonPanel">×</span>
</div>
<div class="panel-content">
<div class="info-item" v-for="(polygon, index) in polygons" :key="index">
<div class="info-header">点线面 {{ index + 1 }}</div>
<div class="info-content">
<p>面积: {{ polygon.area.toFixed(2) }} 平方米</p>
<p>周长: {{ polygon.perimeter.toFixed(2) }} </p>
<p>顶点数: {{ polygon.vertices }}</p>
<button class="focus-btn" @click="focusOnPolygon(polygon)">定位</button>
</div>
</div>
<div class="no-data" v-if="polygons.length === 0">
暂无点线面数据请先绘制点线面
</div>
</div>
</div>
<!-- 路线信息面板 -->
<div class="route-lines-panel" v-if="showRouteLinesPanel">
<div class="panel-header">
<span>路线信息</span>
<span class="close-btn" @click="closeRouteLinesPanel">×</span>
</div>
<div class="panel-content">
<div class="info-item" v-for="(line, index) in routeLines" :key="index">
<div class="info-header">路线 {{ index + 1 }}</div>
<div class="info-content">
<p>长度: {{ line.length.toFixed(2) }} </p>
<p>顶点数: {{ line.vertices }}</p>
<button class="focus-btn" @click="focusOnRoute(line)">定位</button>
</div>
</div>
<div class="no-data" v-if="routeLines.length === 0">
暂无路线数据请先绘制路线
</div>
</div>
</div>
<!-- 导入JSON对话框 -->
<div class="import-dialog" v-if="showImportDialog">
<div class="dialog-content">
<div class="dialog-header">
<h3>导入数据</h3>
<span class="close-btn" @click="showImportDialog = false">×</span>
</div>
<div class="dialog-body">
<textarea v-model="importJsonText" placeholder="请粘贴JSON数据"></textarea>
<div class="file-upload">
<label for="jsonFileInput">或者上传JSON文件</label>
<input type="file" id="jsonFileInput" accept=".json" @change="handleFileUpload">
</div>
</div>
<div class="dialog-footer">
<button @click="showImportDialog = false">取消</button>
<button @click="importRouteData" class="primary-btn">导入</button>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted, watch } from 'vue';
import Draw from 'ol/interaction/Draw';
import { Vector as VectorSource } from 'ol/source';
import { Vector as VectorLayer } from 'ol/layer';
import { Style, Stroke, Fill, Circle } from 'ol/style';
import { getArea, getLength } from 'ol/sphere';
import { LineString, Polygon } from 'ol/geom';
import GeoJSON from 'ol/format/GeoJSON';
import Feature from 'ol/Feature';
// props
const props = defineProps({
map: Object
});
//
const isDrawing = ref(false);
const drawType = ref('');
const showPolygonPanel = ref(false);
const showRouteLinesPanel = ref(false);
const polygons = ref([]);
const routeLines = ref([]);
const showImportDialog = ref(false);
const importJsonText = ref('');
//
let drawInteraction = null;
let vectorSource = null;
let vectorLayer = null;
//
function initDrawLayer() {
if (!props.map) return;
//
vectorSource = new VectorSource();
//
vectorLayer = new VectorLayer({
source: vectorSource,
style: new Style({
fill: new Fill({
color: 'rgba(0, 150, 255, 0.3)'
}),
stroke: new Stroke({
color: '#0096ff',
width: 3
}),
image: new Circle({
radius: 7,
fill: new Fill({
color: '#0096ff'
})
})
})
});
//
props.map.addLayer(vectorLayer);
}
// 线
function startDrawLine() {
clearDraw();
isDrawing.value = true;
drawType.value = 'LineString';
showRouteLinesPanel.value = true;
drawInteraction = new Draw({
source: vectorSource,
type: 'LineString',
style: new Style({
stroke: new Stroke({
color: '#ff0000',
width: 3
}),
image: new Circle({
radius: 5,
fill: new Fill({
color: '#ff0000'
})
})
})
});
//
drawInteraction.on('drawend', function(event) {
const feature = event.feature;
const geometry = feature.getGeometry();
// 线
const length = getLength(geometry);
const vertices = geometry.getCoordinates().length;
//
feature.setProperties({
type: 'route',
length: length,
vertices: vertices
});
// 线
routeLines.value.push({
id: Date.now(),
feature: feature,
length: length,
vertices: vertices,
extent: geometry.getExtent()
});
isDrawing.value = false;
});
props.map.addInteraction(drawInteraction);
}
// 线
function startDrawPolygon() {
clearDraw();
isDrawing.value = true;
drawType.value = 'Polygon';
showPolygonPanel.value = true;
drawInteraction = new Draw({
source: vectorSource,
type: 'Polygon',
style: new Style({
fill: new Fill({
color: 'rgba(255, 165, 0, 0.3)'
}),
stroke: new Stroke({
color: '#ffa500',
width: 3
}),
image: new Circle({
radius: 5,
fill: new Fill({
color: '#ffa500'
})
})
})
});
//
drawInteraction.on('drawend', function(event) {
const feature = event.feature;
const geometry = feature.getGeometry();
//
const area = getArea(geometry);
const perimeter = getLength(geometry.getLinearRing(0));
const vertices = geometry.getLinearRing(0).getCoordinates().length - 1; //
//
feature.setProperties({
type: 'polygon',
area: area,
perimeter: perimeter,
vertices: vertices
});
// 线
polygons.value.push({
id: Date.now(),
feature: feature,
area: area,
perimeter: perimeter,
vertices: vertices,
extent: geometry.getExtent()
});
isDrawing.value = false;
});
props.map.addInteraction(drawInteraction);
}
//
function clearDraw() {
if (drawInteraction) {
props.map.removeInteraction(drawInteraction);
drawInteraction = null;
}
if (vectorSource) {
vectorSource.clear();
}
isDrawing.value = false;
polygons.value = [];
routeLines.value = [];
}
// 线
function closePolygonPanel() {
showPolygonPanel.value = false;
}
// 线
function closeRouteLinesPanel() {
showRouteLinesPanel.value = false;
}
// 线
function focusOnPolygon(polygon) {
if (props.map && polygon.extent) {
props.map.getView().fit(polygon.extent, {
padding: [50, 50, 50, 50],
duration: 1000
});
}
}
// 线
function focusOnRoute(route) {
if (props.map && route.extent) {
props.map.getView().fit(route.extent, {
padding: [50, 50, 50, 50],
duration: 1000
});
}
}
// 线GeoJSON
function exportRouteData() {
if (!vectorSource || vectorSource.getFeatures().length === 0) {
alert('没有可导出的数据,请先绘制路线或点线面');
return;
}
// GeoJSON
const format = new GeoJSON();
//
const features = vectorSource.getFeatures();
// GeoJSON
const geojsonObj = format.writeFeaturesObject(features, {
dataProjection: 'EPSG:4326', // WGS84
featureProjection: props.map.getView().getProjection() //
});
// JSON
const geojsonStr = JSON.stringify(geojsonObj, null, 2);
//
const blob = new Blob([geojsonStr], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = 'roadTest.json'; // roadTest.json
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
console.log('数据已导出为GeoJSON文件名roadTest.json');
alert('文件已下载为roadTest.json请将其复制到项目的public目录下');
}
//
function handleFileUpload(event) {
const file = event.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = (e) => {
importJsonText.value = e.target.result;
};
reader.readAsText(file);
}
// JSON线
function importRouteData() {
if (!importJsonText.value) {
alert('请输入或上传JSON数据');
return;
}
try {
// JSON
const geojsonObj = JSON.parse(importJsonText.value);
// GeoJSON
const format = new GeoJSON();
//
clearDraw();
// GeoJSON
const features = format.readFeatures(geojsonObj, {
dataProjection: 'EPSG:4326', // WGS84
featureProjection: props.map.getView().getProjection() //
});
//
vectorSource.addFeatures(features);
// 线线
features.forEach(feature => {
const geometry = feature.getGeometry();
const props = feature.getProperties();
if (geometry instanceof LineString || props.type === 'route') {
// 线
const length = getLength(geometry);
const vertices = geometry.getCoordinates().length;
routeLines.value.push({
id: Date.now() + Math.random(),
feature: feature,
length: props.length || length,
vertices: props.vertices || vertices,
extent: geometry.getExtent()
});
} else if (geometry instanceof Polygon || props.type === 'polygon') {
// 线
const area = getArea(geometry);
const perimeter = getLength(geometry.getLinearRing(0));
const vertices = geometry.getLinearRing(0).getCoordinates().length - 1;
polygons.value.push({
id: Date.now() + Math.random(),
feature: feature,
area: props.area || area,
perimeter: props.perimeter || perimeter,
vertices: props.vertices || vertices,
extent: geometry.getExtent()
});
}
});
//
if (routeLines.value.length > 0) {
showRouteLinesPanel.value = true;
}
if (polygons.value.length > 0) {
showPolygonPanel.value = true;
}
//
showImportDialog.value = false;
importJsonText.value = '';
//
if (features.length > 0) {
const extent = vectorSource.getExtent();
props.map.getView().fit(extent, {
padding: [50, 50, 50, 50],
duration: 1000
});
}
console.log('成功导入数据,共', features.length, '个特征');
} catch (error) {
console.error('导入数据失败:', error);
alert('导入失败请检查JSON格式是否正确');
}
}
//
onMounted(() => {
if (props.map) {
initDrawLayer();
}
});
//
watch(() => props.map, (newMap) => {
if (newMap) {
initDrawLayer();
}
});
//
onUnmounted(() => {
if (props.map) {
if (drawInteraction) {
props.map.removeInteraction(drawInteraction);
}
if (vectorLayer) {
props.map.removeLayer(vectorLayer);
}
}
});
//
defineExpose({
startDrawLine,
startDrawPolygon,
clearDraw,
exportRouteData,
importRouteData,
showImportDialog
});
</script>
<style scoped>
.route-draw-control {
position: relative;
}
.draw-tools {
position: absolute;
top: 20px;
left: 20px;
z-index: 3000;
background-color: white;
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
padding: 10px;
display: flex;
flex-direction: column;
gap: 8px;
min-width: 120px;
border: 2px solid #0096ff;
}
.tool-button {
padding: 8px 12px;
background-color: #f5f5f5;
border: 1px solid #ddd;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
text-align: center;
transition: all 0.2s;
font-weight: bold;
color: #333;
}
.tool-button:hover {
background-color: #e0e0e0;
transform: scale(1.05);
}
.tool-button.active {
background-color: #0096ff;
color: white;
border-color: #0078cc;
}
.polygon-panel, .route-lines-panel {
position: absolute;
top: 20px;
right: 20px;
width: 300px;
max-height: 80vh;
background-color: white;
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
z-index: 3000;
display: flex;
flex-direction: column;
overflow: hidden;
}
.route-lines-panel {
right: 340px;
}
.panel-header {
padding: 12px 15px;
background-color: #f5f5f5;
border-bottom: 1px solid #ddd;
font-weight: bold;
display: flex;
justify-content: space-between;
align-items: center;
}
.close-btn {
cursor: pointer;
font-size: 20px;
color: #666;
}
.close-btn:hover {
color: #333;
}
.panel-content {
padding: 15px;
overflow-y: auto;
max-height: calc(80vh - 50px);
}
.info-item {
margin-bottom: 15px;
border: 1px solid #eee;
border-radius: 4px;
overflow: hidden;
}
.info-header {
padding: 8px 12px;
background-color: #f9f9f9;
border-bottom: 1px solid #eee;
font-weight: bold;
}
.info-content {
padding: 12px;
}
.info-content p {
margin: 5px 0;
font-size: 14px;
}
.focus-btn {
margin-top: 8px;
padding: 5px 10px;
background-color: #0096ff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
.focus-btn:hover {
background-color: #0078cc;
}
.no-data {
text-align: center;
color: #999;
padding: 20px 0;
}
/* 导入对话框样式 */
.import-dialog {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 5000;
}
.dialog-content {
width: 500px;
background-color: white;
border-radius: 4px;
overflow: hidden;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}
.dialog-header {
padding: 15px;
background-color: #f5f5f5;
border-bottom: 1px solid #ddd;
display: flex;
justify-content: space-between;
align-items: center;
}
.dialog-header h3 {
margin: 0;
font-size: 18px;
}
.dialog-body {
padding: 20px;
}
.dialog-body textarea {
width: 100%;
height: 200px;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px;
resize: none;
font-family: monospace;
margin-bottom: 15px;
}
.file-upload {
margin-top: 10px;
}
.file-upload label {
display: inline-block;
padding: 8px 12px;
background-color: #f5f5f5;
border: 1px solid #ddd;
border-radius: 4px;
cursor: pointer;
}
.file-upload input {
display: none;
}
.dialog-footer {
padding: 15px;
background-color: #f5f5f5;
border-top: 1px solid #ddd;
display: flex;
justify-content: flex-end;
gap: 10px;
}
.dialog-footer button {
padding: 8px 15px;
border: 1px solid #ddd;
border-radius: 4px;
background-color: #f5f5f5;
cursor: pointer;
}
.dialog-footer button.primary-btn {
background-color: #0096ff;
color: white;
border-color: #0078cc;
}
.dialog-footer button.primary-btn:hover {
background-color: #0078cc;
}
</style>

View File

@ -76,7 +76,7 @@ onMounted(() => {
.car-alarm-container {
position: absolute;
left: 20px;
top: 90px;
top: 50px;
display: flex;
align-items: center;
gap:24px;

View File

@ -1,7 +1,11 @@
<template>
<div class="event-list-container">
<div class="event-list-header">
<div class="header-title">车辆列表 ({{ totalCount }})</div>
<div class="header-title">
<img src="../../../assets/images/sub_icon.png" alt="list_bg" class="header-title-icon">
<div class="header-title-text">车辆列表 ({{ totalCount }})</div>
</div>
<div class="header-actions">
<div class="filter-dropdown">
<span class="selected-filter">全部</span>
@ -181,10 +185,9 @@ onMounted(() => {
});
</script>
<style scoped>
<style scoped lang="scss">
.event-list-container {
background: url("../../../assets/images/list_bg.png") no-repeat;
background-size: 100% 100%;
background-color: #27313F;
position: absolute;
right: 20px;
top: 50%;
@ -203,21 +206,27 @@ onMounted(() => {
.header-title {
display: flex;
align-items: center;
font-size: 16px;
line-height: 1.8;
font-weight: bold;
margin-left: 35px;
padding:0 10px;
background:url("../../../assets/images/subheading.png") no-repeat;
background-size:100% 100%;
padding:5px 10px;
color: #fff;
img{
width: 31px;
height: 15px;
margin-right: 5px;
}
}
.header-actions {
display: flex;
justify-content: space-between;
align-items: center;
padding:0 16px;
margin: 20px 0;
margin: 10px 0;
}
.filter-dropdown {

View File

@ -13,7 +13,7 @@
</div>
<img src="../../assets/images/close.png" alt="close" class="close-icon" />
<img src="../../assets/images/close.png" alt="close" class="close-icon" @click="handleLogout" />
</div>
</template>
@ -23,11 +23,14 @@ import { computed } from "vue";
import { useRouter, useRoute } from "vue-router";
import useAppStore from '@/store/modules/app';
import usePermissionStore from '@/store/modules/permission';
import useUserStore from '@/store/modules/user';
import { ElMessageBox } from 'element-plus';
const router = useRouter();
const route = useRoute();
const appStore = useAppStore();
const permissionStore = usePermissionStore();
const userStore = useUserStore();
// Tab
const tabs = [
@ -70,6 +73,19 @@ function handleTabClick(path) {
router.push(path);
}
}
// 退
function handleLogout() {
ElMessageBox.confirm('确定注销并退出系统吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
userStore.logOut().then(() => {
router.push('/login');
});
}).catch(() => {});
}
</script>
<style lang="scss" scoped>

View File

@ -3,7 +3,8 @@ import { createApp } from 'vue'
import Cookies from 'js-cookie'
import ElementPlus from 'element-plus'
import locale from 'element-plus/lib/locale/lang/zh-cn' // 中文语言
// import locale from 'element-plus/es/locale/lang/zh-cn'
import 'element-plus/dist/index.css'
import '@/assets/styles/index.scss' // global css
@ -43,10 +44,14 @@ import TreeSelect from '@/components/TreeSelect'
import DictTag from '@/components/DictTag'
const app = createApp(App)
if (import.meta.env.DEV) {
// 根据环境变量判断是否加载mock数据
// 开发环境或测试环境都加载mock
const shouldUseMock = import.meta.env.DEV || import.meta.env.VITE_USE_MOCK === 'true';
if (shouldUseMock) {
console.log('正在初始化Mock数据...')
try {
// 动态导入mock确保只在开发环境中加载
// 动态导入mock
import('./mock').then(module => {
const setupMock = module.default
setupMock()
@ -58,6 +63,7 @@ if (import.meta.env.DEV) {
console.error('Mock初始化错误:', error)
}
}
// 全局方法挂载
app.config.globalProperties.useDict = useDict
app.config.globalProperties.download = download
@ -87,7 +93,7 @@ directive(app)
// 使用element-plus 并且设置全局的大小
app.use(ElementPlus, {
locale: locale,
// locale:locale,
// 支持 large、default、small
size: Cookies.get('size') || 'default'
})

View File

@ -10,7 +10,7 @@ import dictApi from './system/dict' // 新增
function setupMock() {
// 设置拦截ajax请求的相应时间
Mock.setup({
timeout: '200-600'
timeout: '200-1000'
})
// 增强xhr的send方法
@ -50,14 +50,23 @@ Mock.XHR.prototype.send = function() {
// 用户相关
// 验证码获取
Mock.mock(/\/dev-api\/captchaImage/, 'get', userApi.getCodeImg)
Mock.mock(/\/captchaImage/, 'get', userApi.getCodeImg) // 添加不带前缀的路径
// 用户登录
Mock.mock(/\/dev-api\/login/, 'post', userApi.login)
Mock.mock(/\/login/, 'post', userApi.login) // 添加不带前缀的路径
// 获取用户信息
Mock.mock(/\/dev-api\/getInfo/, 'get', userApi.getInfo)
Mock.mock(/\/getInfo/, 'get', userApi.getInfo) // 添加不带前缀的路径
// 退出登录
Mock.mock(/\/dev-api\/logout/, 'post', userApi.logout)
Mock.mock(/\/logout/, 'post', userApi.logout) // 添加不带前缀的路径
// 获取路由
Mock.mock(/\/dev-api\/getRouters/, 'get', menuApi.getRouters)
Mock.mock(/\/getRouters/, 'get', menuApi.getRouters) // 添加不带前缀的路径
// 字典数据
Mock.mock(/\/dev-api\/system\/dict\/data\/type\/.*/, 'get', dictApi.getDictDataByType)

View File

@ -55,18 +55,18 @@ const menuApi = {
link: null
}
},
{
name: "Menu",
path: "menu",
hidden: false,
component: "system/menu/index",
meta: {
title: "菜单管理",
icon: "clipboard",
noCache: false,
link: null
}
}
// {
// name: "Menu",
// path: "menu",
// hidden: false,
// component: "system/menu/index",
// meta: {
// title: "菜单管理",
// icon: "clipboard",
// noCache: false,
// link: null
// }
// }
]
},
{

View File

@ -54,10 +54,17 @@ router.beforeEach((to, from, next) => {
}
})
}).catch(err => {
useUserStore().logOut().then(() => {
ElMessage.error(err)
next({ path: '/' })
})
// 修改:请求用户信息失败时,不立即登出,而是继续访问页面
console.error('获取用户信息失败,但继续访问页面:', err);
isRelogin.show = false;
// 如果是首次访问根路径,重定向到平台概览页面
if (to.path === '/' || to.path === '/index') {
useAppStore().toggleSideBarHide(true);
next({ path: '/platform', replace: true })
} else {
next({ ...to, replace: true })
}
})
} else {
// 如果是首次访问根路径,重定向到平台概览页面

View File

@ -230,20 +230,6 @@ export const dynamicRoutes = [
}
]
},
{
path: '/monitor/job-log',
component: Layout,
hidden: true,
permissions: ['monitor:job:list'],
children: [
{
path: 'index/:jobId(\\d+)',
component: () => import('@/views/monitor/job/log'),
name: 'JobLog',
meta: { title: '调度日志', activeMenu: '/monitor/job' }
}
]
},
{
path: '/tool/gen-edit',
component: Layout,
@ -261,15 +247,9 @@ export const dynamicRoutes = [
]
const router = createRouter({
history: createWebHistory(),
routes: constantRoutes,
scrollBehavior(to, from, savedPosition) {
if (savedPosition) {
return savedPosition
} else {
return { top: 0 }
}
},
history: createWebHistory('/airport'),
scrollBehavior: () => ({ top: 0 }), // 滚动行为,将 y 改为 top
routes: constantRoutes // 使用 constantRoutes
});
export default router;

View File

@ -17,7 +17,7 @@ const service = axios.create({
// axios中请求配置有baseURL选项表示请求URL公共部分
baseURL: import.meta.env.VITE_APP_BASE_API,
// 超时
timeout: 10000
timeout: 30000
})
// request拦截器
@ -81,7 +81,7 @@ service.interceptors.response.use(res => {
ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
isRelogin.show = false;
useUserStore().logOut().then(() => {
location.href = '/index';
location.href = '/airport/index';
})
}).catch(() => {
isRelogin.show = false;
@ -114,7 +114,17 @@ service.interceptors.response.use(res => {
// 在开发环境中,不显示错误弹窗
if (!import.meta.env.DEV) {
ElMessage({ message: message, type: 'error', duration: 5 * 1000 })
// 修改对于getInfo接口不显示错误提示
const isGetInfoRequest = error.config && (
error.config.url.includes('/getInfo') ||
error.config.url.includes('/system/user/getInfo')
);
if (!isGetInfoRequest) {
ElMessage({ message: message, type: 'error', duration: 5 * 1000 })
} else {
console.warn('用户信息请求失败(已忽略):', message)
}
} else {
console.warn('接口错误(已禁用弹窗):', message)
}

View File

@ -324,7 +324,7 @@ const cardList = [
:deep(.el-tabs__item.is-active) {
color: #409eff;
}
::v-deep .el-tabs__nav-wrap::after {
:deep .el-tabs__nav-wrap::after {
height: 1px;
background-color: #4C4F5F;
}

View File

@ -320,12 +320,12 @@ function handleSelectionChange(selection) {
/** 查看详情按钮操作 */
function handleView(row) {
proxy.$modal.msgSuccess("查看车辆详情功能模拟");
proxy.$modal.msgSuccess("查看车辆详情功能模拟");
}
/** 导出按钮操作 */
function handleExport() {
proxy.$modal.msgSuccess("导出功能模拟");
proxy.$modal.msgSuccess("导出功能模拟");
}
onMounted(() => {
@ -377,11 +377,11 @@ onMounted(() => {
}
//
::v-deep(.el-input__wrapper:hover) {
:deep(.el-input__wrapper:hover) {
box-shadow: none !important;
}
::v-deep(.el-select) {
:deep(.el-select) {
border:none !important;
width:160px !important;
// el-selectborder
@ -389,11 +389,11 @@ onMounted(() => {
--el-border-color: #343744!important;
}
::v-deep(.el-select__wrapper.is-focused) {
:deep(.el-select__wrapper.is-focused) {
box-shadow: none !important;
}
::v-deep(.el-select__wrapper) {
:deep(.el-select__wrapper) {
background: #343744 !important;
color: #96A0B5 !important;
border-radius: 8px !important;
@ -404,7 +404,7 @@ onMounted(() => {
border:none !important;
}
::v-deep(.el-input__wrapper) {
:deep(.el-input__wrapper) {
background: #343744 !important;
color: #96A0B5 !important;
border-radius: 8px !important;
@ -413,7 +413,7 @@ onMounted(() => {
box-shadow: none !important;
}
::v-deep(.el-select__placeholder) {
:deep(.el-select__placeholder) {
color: #96A0B5 !important;
}
.custom-table {

View File

@ -320,11 +320,11 @@ onMounted(() => {
}
//
::v-deep(.el-input__wrapper:hover) {
:deep(.el-input__wrapper:hover) {
box-shadow: none !important;
}
::v-deep(.el-input__wrapper) {
:deep(.el-input__wrapper) {
background: #343744 !important;
color: #96A0B5 !important;
border-radius: 8px !important;

View File

@ -25,13 +25,12 @@
<template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
</el-input>
</el-form-item>
<el-form-item prop="code" v-if="captchaEnabled">
<el-form-item prop="code" v-if="captchaEnabled" class="verification-code-item">
<el-input
v-model="loginForm.code"
size="large"
auto-complete="off"
placeholder="验证码"
style="width: 63%"
@keyup.enter="handleLogin"
>
<template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
@ -229,6 +228,39 @@ getCookie();
}
}
.verification-code-item {
display: flex;
align-items: stretch;
:deep(.el-form-item__content) {
display: flex;
align-items: stretch;
width: 100%;
.el-input {
flex: 1;
margin-right: 10px;
}
}
}
.login-code {
width: 110px;
height: 40px;
background-color: #343744;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
.login-code-img {
height: 38px;
width: 100%;
object-fit: cover;
}
}
.remember-container {
margin-bottom: 20px;
}

View File

@ -1,43 +1,105 @@
<template>
<div class="platform-overview">
<OpenLayersMap />
<div class="platform-overview platform-no-padding">
<OpenLayersMap ref="mapRef" />
<CarAlarm />
<!-- 右侧展开/收起按钮 -->
<img
class="eventlist-toggle-btn"
:class="{ 'btn-opened': showEventList }"
:src="showEventList ? btn_left : btn_right"
:alt="showEventList ? '收起车辆列表' : '展开车辆列表'"
@click="toggleEventList"
/>
<!-- 车辆列表 -->
<Eventlist v-if="showEventList" />
<!-- 绘制工具栏 -->
<!-- <div class="draw-toolbar">
<div class="toolbar-title">绘制工具</div>
<div class="toolbar-buttons">
<button @click="startDrawLine" class="toolbar-button">绘制路线</button>
<button @click="startDrawPolygon" class="toolbar-button">绘制点线面</button>
<button @click="clearDraw" class="toolbar-button clear">清除</button>
<button @click="exportRouteData" class="toolbar-button export">导出数据</button>
<button @click="importRouteData" class="toolbar-button import">导入数据</button>
</div>
</div>-->
</div>
</template>
<script setup>
import { ref } from 'vue';
import { ref, onMounted, onUnmounted } from 'vue';
import OpenLayersMap from '../../components/map/OpenLayersMap.vue';
import CarAlarm from '../../components/map/info/carClarm.vue';
import Eventlist from '../../components/map/info/eventlist.vue';
import btn_left from '../../assets/images/btn_left.png';
import btn_right from '../../assets/images/btn_right.png';
const showEventList = ref(false);
const showEventList = ref(false); //
const mapRef = ref(null);
function toggleEventList() {
showEventList.value = !showEventList.value;
}
function getRouteDrawControlExpose() {
// OpenLayersMaprefRouteDrawControlref
return mapRef.value?.$refs?.routeDrawControlRef;
}
function startDrawLine() {
const routeDraw = getRouteDrawControlExpose();
if (routeDraw && routeDraw.startDrawLine) {
routeDraw.startDrawLine();
}
}
function startDrawPolygon() {
const routeDraw = getRouteDrawControlExpose();
if (routeDraw && routeDraw.startDrawPolygon) {
routeDraw.startDrawPolygon();
}
}
function clearDraw() {
const routeDraw = getRouteDrawControlExpose();
if (routeDraw && routeDraw.clearDraw) {
routeDraw.clearDraw();
}
}
function exportRouteData() {
const routeDraw = getRouteDrawControlExpose();
if (routeDraw && routeDraw.exportRouteData) {
routeDraw.exportRouteData();
}
}
function importRouteData() {
const routeDraw = getRouteDrawControlExpose();
if (routeDraw && routeDraw.showImportDialog) {
// RouteDrawControl
routeDraw.showImportDialog = true;
}
}
onMounted(() => {
document.querySelector('.app-main')?.classList.add('platform-no-padding');
});
onUnmounted(() => {
document.querySelector('.app-main')?.classList.remove('platform-no-padding');
});
</script>
<style scoped>
<style scoped lang="scss">
.platform-overview {
width: 100%;
height: 100%;
height:calc(100vh - 60px);
position: relative;
display: flex;
flex-direction: column;
overflow: hidden;
min-height: 0;
z-index:1;
}
/* 右侧展开/收起按钮样式 */
@ -50,5 +112,95 @@ function toggleEventList() {
height: 80px;
transform: translateY(-50%);
cursor: pointer;
transition: right 0.3s ease;
}
</style>
/* 按钮打开状态 - 移到左侧 */
.eventlist-toggle-btn.btn-opened {
right: 405px;
}
/* 绘制工具栏 */
.draw-toolbar {
position: absolute;
top: 20px;
right: 20px;
background-color: rgba(255, 255, 255, 0.9);
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
z-index: 2000;
width: 200px;
overflow: hidden;
}
.toolbar-title {
padding: 10px;
background-color: #0096ff;
color: white;
font-weight: bold;
text-align: center;
}
.toolbar-buttons {
padding: 10px;
display: flex;
flex-direction: column;
gap: 8px;
}
.toolbar-button {
padding: 8px 12px;
border: 1px solid #ddd;
border-radius: 4px;
background-color: #f5f5f5;
cursor: pointer;
transition: all 0.2s;
}
.toolbar-button:hover {
background-color: #e0e0e0;
}
.toolbar-button.clear {
background-color: #f44336;
color: white;
border-color: #d32f2f;
}
.toolbar-button.clear:hover {
background-color: #d32f2f;
}
.toolbar-button.export {
background-color: #4caf50;
color: white;
border-color: #388e3c;
}
.toolbar-button.export:hover {
background-color: #388e3c;
}
.toolbar-button.import {
background-color: #ff9800;
color: white;
border-color: #f57c00;
}
.toolbar-button.import:hover {
background-color: #f57c00;
}
/* 只影响本页精准去除AppMain的左右padding */
:deep(.platform-no-padding) .app-main {
padding-left: 0 !important;
padding-right: 0 !important;
}
</style>
<style>
.app-main.platform-no-padding {
padding-left: 0 !important;
padding-right: 0 !important;
}
</style>

View File

@ -716,11 +716,11 @@ onMounted(() => {
}
//
::v-deep(.el-input__wrapper:hover) {
:deep(.el-input__wrapper:hover) {
box-shadow: none !important;
}
::v-deep(.el-select) {
:deep(.el-select) {
border:none !important;
width:140px !important;
// el-selectborder
@ -728,11 +728,11 @@ onMounted(() => {
--el-border-color: #343744!important;
}
::v-deep(.el-select__wrapper.is-focused) {
:deep(.el-select__wrapper.is-focused) {
box-shadow: none !important;
}
::v-deep(.el-select__wrapper) {
:deep(.el-select__wrapper) {
background: #343744 !important;
color: #96A0B5 !important;
border-radius: 8px !important;
@ -743,7 +743,7 @@ onMounted(() => {
border:none !important;
}
::v-deep(.el-input__wrapper) {
:deep(.el-input__wrapper) {
background: #343744 !important;
color: #96A0B5 !important;
border-radius: 8px !important;
@ -752,7 +752,7 @@ onMounted(() => {
box-shadow: none !important;
}
::v-deep(.el-select__placeholder) {
:deep(.el-select__placeholder) {
color: #96A0B5 !important;
}
.custom-table {

View File

@ -269,11 +269,11 @@ getList();
}
//
::v-deep(.el-input__wrapper:hover) {
:deep(.el-input__wrapper:hover) {
box-shadow: none !important;
}
::v-deep(.el-select) {
:deep(.el-select) {
border: none !important;
width: 140px !important;
// el-selectborder
@ -281,11 +281,11 @@ getList();
--el-border-color: #343744 !important;
}
::v-deep(.el-select__wrapper.is-focused) {
:deep(.el-select__wrapper.is-focused) {
box-shadow: none !important;
}
::v-deep(.el-select__wrapper) {
:deep(.el-select__wrapper) {
background: #343744 !important;
color: #96A0B5 !important;
border-radius: 8px !important;
@ -295,7 +295,7 @@ getList();
border: none !important;
}
::v-deep(.el-input__wrapper) {
:deep(.el-input__wrapper) {
background: #343744 !important;
color: #96A0B5 !important;
border-radius: 8px !important;
@ -304,7 +304,7 @@ getList();
box-shadow: none !important;
}
::v-deep(.el-select__placeholder) {
:deep(.el-select__placeholder) {
color: #96A0B5 !important;
}

View File

@ -509,11 +509,11 @@ getList();
}
//
::v-deep(.el-input__wrapper:hover) {
:deep(.el-input__wrapper:hover) {
box-shadow: none !important;
}
::v-deep(.el-select) {
:deep(.el-select) {
border:none !important;
width:140px !important;
// el-selectborder
@ -521,11 +521,11 @@ getList();
--el-border-color: #343744!important;
}
::v-deep(.el-select__wrapper.is-focused) {
:deep(.el-select__wrapper.is-focused) {
box-shadow: none !important;
}
::v-deep(.el-select__wrapper) {
:deep(.el-select__wrapper) {
background: #343744 !important;
color: #96A0B5 !important;
border-radius: 8px !important;
@ -536,7 +536,7 @@ getList();
border:none !important;
}
::v-deep(.el-input__wrapper) {
:deep(.el-input__wrapper) {
background: #343744 !important;
color: #96A0B5 !important;
border-radius: 8px !important;
@ -545,7 +545,7 @@ getList();
box-shadow: none !important;
}
::v-deep(.el-select__placeholder) {
:deep(.el-select__placeholder) {
color: #96A0B5 !important;
}
.custom-table {

View File

@ -558,11 +558,11 @@ function getPostOptions() {
}
}
//
::v-deep(.el-input__wrapper:hover) {
:deep(.el-input__wrapper:hover) {
box-shadow: none !important;
}
::v-deep(.el-select) {
:deep(.el-select) {
border:none !important;
width:140px !important;
// el-selectborder
@ -570,11 +570,11 @@ function getPostOptions() {
--el-border-color: #343744!important;
}
::v-deep(.el-select__wrapper.is-focused) {
:deep(.el-select__wrapper.is-focused) {
box-shadow: none !important;
}
::v-deep(.el-select__wrapper) {
:deep(.el-select__wrapper) {
background: #343744 !important;
color: #96A0B5 !important;
border-radius: 8px !important;
@ -585,7 +585,7 @@ function getPostOptions() {
border:none !important;
}
::v-deep(.el-input__wrapper) {
:deep(.el-input__wrapper) {
background: #343744 !important;
color: #96A0B5 !important;
border-radius: 8px !important;
@ -594,7 +594,7 @@ function getPostOptions() {
box-shadow: none !important;
}
::v-deep(.el-select__placeholder) {
:deep(.el-select__placeholder) {
color: #96A0B5 !important;
}
.custom-table {

View File

@ -10,7 +10,8 @@ export default defineConfig(({ mode, command }) => {
// 部署生产环境和开发环境下的URL。
// 默认情况下vite 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
base: VITE_APP_ENV === 'production' ? '/' : '/',
base: VITE_APP_ENV === 'production' ? '/airport/' : '/airport/',
// base: './',
plugins: createVitePlugins(env, command === 'build'),
resolve: {
// https://cn.vitejs.dev/config/#resolve-alias
@ -53,6 +54,6 @@ export default defineConfig(({ mode, command }) => {
}
]
}
}
},
}
})