Browse Source

提交文件

hongrunxia 1 year ago
parent
commit
1636fc1523

File diff suppressed because it is too large
+ 0 - 0
public/font/STSong_Regular.json


+ 3217 - 0
public/json/vent.json

@@ -0,0 +1,3217 @@
+{
+  "type": "FeatureCollection",
+  "features": [
+    {
+      "type": "Feature",
+      "properties": {
+        "adcode": "140000",
+        "name": "山西省",
+        "center": [112.549248, 37.857014],
+        "centroid": [112.304761, 37.618555],
+        "childrenNum": 11,
+        "level": "province",
+        "parent": { "adcode": 100000 },
+        "subFeatureIndex": 3,
+        "acroutes": [100000]
+      },
+      "geometry": {
+        "type": "MultiPolygon",
+        "coordinates": [
+          [
+            [
+              [114.134639, 40.737314],
+              [114.162357, 40.71373],
+              [114.183299, 40.67153],
+              [114.236269, 40.607043],
+              [114.283081, 40.590685],
+              [114.273842, 40.552954],
+              [114.293552, 40.55159],
+              [114.282465, 40.494725],
+              [114.267066, 40.474242],
+              [114.299711, 40.44009],
+              [114.286161, 40.425057],
+              [114.31203, 40.372645],
+              [114.381015, 40.36307],
+              [114.390254, 40.351213],
+              [114.438914, 40.371733],
+              [114.481413, 40.34802],
+              [114.530688, 40.345283],
+              [114.510978, 40.302851],
+              [114.46971, 40.268155],
+              [114.406269, 40.246232],
+              [114.362537, 40.249886],
+              [114.292936, 40.230242],
+              [114.255364, 40.236182],
+              [114.235654, 40.198252],
+              [114.180219, 40.191395],
+              [114.135871, 40.175392],
+              [114.097683, 40.193681],
+              [114.073046, 40.168533],
+              [114.073046, 40.168533],
+              [114.101995, 40.099901],
+              [114.086596, 40.071513],
+              [114.045944, 40.056856],
+              [114.018227, 40.103563],
+              [113.989278, 40.11226],
+              [113.959097, 40.033491],
+              [113.910438, 40.015618],
+              [114.029314, 39.985819],
+              [114.028082, 39.959218],
+              [114.047176, 39.916085],
+              [114.067502, 39.922511],
+              [114.17406, 39.897722],
+              [114.212248, 39.918839],
+              [114.229494, 39.899558],
+              [114.204241, 39.885324],
+              [114.215943, 39.8619],
+              [114.286776, 39.871087],
+              [114.285545, 39.858225],
+              [114.395182, 39.867412],
+              [114.406885, 39.833413],
+              [114.390254, 39.819165],
+              [114.41674, 39.775943],
+              [114.409964, 39.761683],
+              [114.408117, 39.652106],
+              [114.431522, 39.613851],
+              [114.49558, 39.608318],
+              [114.51529, 39.564964],
+              [114.568877, 39.573729],
+              [114.532536, 39.486027],
+              [114.501739, 39.476789],
+              [114.496812, 39.438437],
+              [114.469095, 39.400989],
+              [114.466631, 39.329736],
+              [114.430906, 39.307513],
+              [114.437066, 39.259337],
+              [114.416124, 39.242654],
+              [114.47587, 39.21623],
+              [114.443841, 39.174023],
+              [114.388406, 39.176807],
+              [114.360689, 39.134112],
+              [114.369928, 39.107648],
+              [114.345907, 39.075133],
+              [114.252284, 39.073739],
+              [114.180835, 39.049111],
+              [114.157429, 39.061194],
+              [114.10877, 39.052364],
+              [114.082901, 39.09325],
+              [114.082901, 39.09325],
+              [114.064422, 39.094179],
+              [114.050872, 39.135969],
+              [114.006524, 39.122971],
+              [113.994821, 39.095572],
+              [113.961561, 39.100681],
+              [113.930148, 39.063517],
+              [113.898119, 39.067699],
+              [113.80696, 38.989595],
+              [113.776779, 38.986804],
+              [113.76754, 38.959819],
+              [113.776163, 38.885788],
+              [113.795257, 38.860628],
+              [113.855619, 38.828933],
+              [113.836525, 38.795824],
+              [113.839605, 38.7585],
+              [113.802648, 38.763166],
+              [113.775547, 38.709949],
+              [113.720728, 38.713218],
+              [113.70225, 38.651551],
+              [113.612939, 38.645942],
+              [113.603084, 38.587024],
+              [113.561816, 38.558483],
+              [113.5612, 38.485909],
+              [113.583374, 38.459671],
+              [113.537794, 38.417952],
+              [113.525475, 38.383245],
+              [113.557504, 38.343359],
+              [113.54457, 38.270569],
+              [113.570439, 38.237202],
+              [113.598772, 38.22733],
+              [113.64312, 38.232031],
+              [113.678844, 38.20523],
+              [113.711489, 38.213695],
+              [113.720728, 38.174656],
+              [113.797105, 38.162894],
+              [113.831597, 38.16854],
+              [113.811271, 38.117707],
+              [113.876561, 38.055059],
+              [113.872249, 37.990471],
+              [113.901198, 37.984811],
+              [113.936307, 37.922993],
+              [113.959097, 37.906468],
+              [113.976959, 37.816696],
+              [114.006524, 37.813386],
+              [114.044712, 37.761834],
+              [113.996669, 37.730128],
+              [113.993589, 37.706932],
+              [114.068118, 37.721608],
+              [114.12848, 37.698409],
+              [114.139567, 37.675676],
+              [114.115545, 37.619761],
+              [114.118625, 37.59084],
+              [114.036705, 37.494037],
+              [114.014531, 37.42468],
+              [113.973879, 37.40329],
+              [113.962792, 37.355734],
+              [113.90243, 37.310052],
+              [113.886416, 37.239095],
+              [113.853155, 37.215269],
+              [113.832213, 37.167594],
+              [113.773083, 37.151855],
+              [113.773699, 37.107004],
+              [113.758301, 37.075497],
+              [113.788482, 37.059739],
+              [113.771851, 37.016745],
+              [113.791561, 36.98759],
+              [113.76138, 36.956034],
+              [113.792793, 36.894796],
+              [113.773083, 36.85506],
+              [113.731815, 36.858891],
+              [113.731815, 36.878521],
+              [113.696707, 36.882351],
+              [113.676381, 36.855539],
+              [113.680692, 36.789907],
+              [113.600004, 36.752995],
+              [113.549497, 36.752515],
+              [113.535946, 36.732373],
+              [113.499606, 36.740527],
+              [113.465113, 36.707908],
+              [113.506997, 36.705029],
+              [113.476816, 36.655114],
+              [113.486671, 36.635427],
+              [113.54457, 36.62342],
+              [113.539642, 36.594116],
+              [113.569823, 36.585947],
+              [113.588917, 36.547974],
+              [113.559968, 36.528741],
+              [113.554425, 36.494589],
+              [113.587069, 36.460904],
+              [113.635729, 36.451277],
+              [113.670221, 36.425278],
+              [113.708409, 36.423352],
+              [113.731199, 36.363135],
+              [113.736127, 36.324571],
+              [113.712105, 36.303353],
+              [113.716417, 36.262347],
+              [113.681924, 36.216491],
+              [113.697939, 36.181719],
+              [113.651127, 36.174473],
+              [113.705946, 36.148865],
+              [113.712721, 36.129533],
+              [113.655439, 36.125182],
+              [113.671453, 36.115514],
+              [113.68562, 36.056026],
+              [113.660366, 36.034735],
+              [113.694859, 36.026991],
+              [113.678844, 35.985841],
+              [113.648663, 35.994073],
+              [113.654207, 35.931586],
+              [113.637576, 35.870019],
+              [113.660982, 35.837035],
+              [113.582758, 35.818111],
+              [113.604932, 35.797727],
+              [113.587685, 35.736542],
+              [113.592613, 35.691838],
+              [113.622794, 35.674825],
+              [113.625258, 35.632518],
+              [113.578446, 35.633491],
+              [113.547649, 35.656835],
+              [113.55812, 35.621816],
+              [113.513773, 35.57364],
+              [113.49899, 35.532254],
+              [113.439244, 35.507412],
+              [113.391817, 35.506925],
+              [113.348085, 35.468429],
+              [113.31236, 35.481101],
+              [113.304353, 35.426989],
+              [113.243375, 35.449418],
+              [113.189789, 35.44893],
+              [113.188557, 35.412357],
+              [113.165151, 35.412845],
+              [113.149137, 35.350878],
+              [113.126347, 35.332327],
+              [113.067217, 35.353806],
+              [112.996384, 35.362104],
+              [112.985913, 35.33965],
+              [112.992072, 35.29619],
+              [112.936022, 35.284466],
+              [112.934174, 35.262968],
+              [112.884283, 35.243909],
+              [112.822073, 35.258082],
+              [112.772798, 35.207732],
+              [112.720443, 35.206265],
+              [112.628052, 35.263457],
+              [112.637291, 35.225822],
+              [112.513487, 35.218489],
+              [112.390915, 35.239021],
+              [112.36751, 35.219956],
+              [112.288053, 35.219956],
+              [112.304684, 35.251728],
+              [112.242474, 35.234622],
+              [112.21722, 35.253195],
+              [112.094033, 35.279092],
+              [112.058924, 35.280069],
+              [112.078634, 35.219467],
+              [112.03983, 35.194039],
+              [112.066315, 35.153437],
+              [112.05646, 35.098615],
+              [112.062004, 35.056005],
+              [112.039214, 35.045717],
+              [112.018888, 35.068742],
+              [111.97762, 35.067272],
+              [111.933272, 35.083435],
+              [111.810084, 35.062374],
+              [111.807005, 35.032977],
+              [111.739251, 35.00406],
+              [111.664107, 34.984449],
+              [111.681969, 34.9511],
+              [111.646861, 34.938836],
+              [111.617911, 34.894671],
+              [111.592042, 34.881416],
+              [111.570484, 34.843114],
+              [111.543999, 34.853428],
+              [111.502731, 34.829851],
+              [111.439289, 34.838202],
+              [111.389398, 34.815113],
+              [111.345666, 34.831816],
+              [111.29208, 34.806759],
+              [111.255123, 34.819535],
+              [111.232949, 34.789559],
+              [111.148566, 34.807742],
+              [111.118385, 34.756623],
+              [111.035233, 34.740887],
+              [110.976103, 34.706456],
+              [110.929907, 34.731543],
+              [110.89911, 34.661673],
+              [110.870777, 34.636072],
+              [110.812263, 34.624746],
+              [110.780234, 34.648874],
+              [110.749437, 34.65232],
+              [110.710017, 34.605045],
+              [110.610851, 34.607508],
+              [110.533242, 34.583368],
+              [110.488279, 34.610956],
+              [110.424837, 34.588295],
+              [110.379257, 34.600612],
+              [110.29549, 34.610956],
+              [110.23636, 34.670533],
+              [110.231432, 34.701044],
+              [110.259149, 34.737937],
+              [110.232664, 34.80332],
+              [110.233896, 34.83722],
+              [110.259149, 34.884853],
+              [110.257301, 34.934912],
+              [110.272084, 34.942761],
+              [110.325671, 35.014844],
+              [110.369402, 35.158329],
+              [110.374946, 35.251728],
+              [110.45009, 35.327933],
+              [110.477808, 35.413821],
+              [110.531394, 35.511309],
+              [110.567735, 35.539559],
+              [110.609619, 35.632031],
+              [110.57759, 35.701559],
+              [110.571431, 35.800639],
+              [110.550489, 35.838005],
+              [110.549257, 35.877778],
+              [110.511684, 35.879718],
+              [110.516612, 35.918501],
+              [110.502445, 35.947575],
+              [110.516612, 35.971796],
+              [110.49259, 35.994073],
+              [110.491974, 36.034735],
+              [110.467953, 36.074893],
+              [110.447011, 36.164328],
+              [110.45625, 36.22663],
+              [110.474112, 36.248352],
+              [110.474112, 36.306729],
+              [110.459946, 36.327946],
+              [110.487047, 36.393972],
+              [110.489511, 36.430094],
+              [110.47288, 36.453203],
+              [110.503677, 36.488335],
+              [110.488895, 36.556628],
+              [110.496902, 36.582102],
+              [110.447627, 36.621018],
+              [110.426685, 36.657514],
+              [110.394656, 36.676716],
+              [110.402663, 36.697352],
+              [110.438388, 36.685835],
+              [110.447011, 36.737649],
+              [110.407591, 36.776007],
+              [110.423605, 36.818179],
+              [110.406975, 36.824886],
+              [110.424221, 36.855539],
+              [110.376178, 36.882351],
+              [110.408823, 36.892403],
+              [110.424221, 36.963685],
+              [110.381721, 37.002408],
+              [110.382953, 37.022001],
+              [110.426685, 37.008621],
+              [110.417446, 37.027257],
+              [110.460561, 37.044932],
+              [110.49567, 37.086956],
+              [110.535706, 37.115118],
+              [110.53509, 37.138021],
+              [110.590525, 37.187145],
+              [110.651503, 37.256722],
+              [110.660126, 37.281011],
+              [110.690307, 37.287201],
+              [110.678604, 37.317668],
+              [110.695234, 37.34955],
+              [110.641648, 37.360015],
+              [110.630561, 37.372858],
+              [110.644111, 37.435135],
+              [110.740198, 37.44939],
+              [110.759292, 37.474567],
+              [110.770995, 37.538184],
+              [110.795017, 37.558586],
+              [110.771611, 37.594634],
+              [110.763604, 37.639668],
+              [110.793169, 37.650567],
+              [110.775306, 37.680886],
+              [110.706321, 37.705511],
+              [110.716792, 37.728708],
+              [110.750669, 37.736281],
+              [110.735886, 37.77035],
+              [110.680452, 37.790216],
+              [110.59422, 37.922049],
+              [110.522771, 37.955088],
+              [110.528315, 37.990471],
+              [110.507989, 38.013107],
+              [110.501829, 38.097929],
+              [110.519692, 38.130889],
+              [110.509221, 38.192061],
+              [110.528315, 38.211814],
+              [110.565887, 38.215105],
+              [110.57759, 38.297345],
+              [110.601612, 38.308147],
+              [110.661358, 38.308617],
+              [110.701394, 38.353215],
+              [110.746973, 38.366355],
+              [110.77777, 38.440924],
+              [110.796864, 38.453579],
+              [110.840596, 38.439986],
+              [110.874473, 38.453579],
+              [110.870777, 38.510265],
+              [110.907733, 38.521035],
+              [110.920052, 38.581878],
+              [110.898494, 38.587024],
+              [110.880632, 38.626776],
+              [110.916357, 38.673981],
+              [110.915125, 38.704345],
+              [110.965016, 38.755699],
+              [111.009363, 38.847579],
+              [110.995813, 38.868084],
+              [111.016755, 38.889981],
+              [111.009979, 38.932823],
+              [110.980414, 38.970056],
+              [110.998276, 38.998433],
+              [111.038313, 39.020289],
+              [111.094363, 39.030053],
+              [111.138095, 39.064447],
+              [111.147334, 39.100681],
+              [111.173819, 39.135041],
+              [111.163348, 39.152678],
+              [111.219399, 39.244044],
+              [111.213239, 39.257021],
+              [111.247732, 39.302419],
+              [111.202152, 39.305197],
+              [111.179363, 39.326959],
+              [111.186138, 39.35149],
+              [111.155341, 39.338531],
+              [111.159037, 39.362596],
+              [111.125776, 39.366297],
+              [111.143022, 39.407926],
+              [111.171971, 39.423183],
+              [111.287152, 39.417173],
+              [111.358601, 39.432428],
+              [111.385086, 39.489722],
+              [111.431282, 39.508656],
+              [111.422043, 39.539123],
+              [111.441137, 39.59679],
+              [111.460847, 39.606935],
+              [111.445448, 39.640124],
+              [111.497187, 39.661781],
+              [111.525521, 39.662242],
+              [111.61668, 39.633211],
+              [111.646245, 39.644272],
+              [111.707839, 39.621227],
+              [111.722621, 39.606013],
+              [111.783599, 39.58895],
+              [111.842729, 39.620305],
+              [111.87907, 39.606013],
+              [111.9382, 39.623071],
+              [111.925265, 39.66731],
+              [111.959758, 39.692642],
+              [111.970229, 39.796638],
+              [112.012729, 39.827438],
+              [112.042294, 39.886243],
+              [112.07617, 39.919298],
+              [112.133453, 40.001866],
+              [112.142076, 40.027076],
+              [112.182112, 40.061437],
+              [112.183344, 40.083877],
+              [112.232003, 40.133311],
+              [112.232619, 40.169905],
+              [112.299756, 40.21105],
+              [112.310227, 40.256281],
+              [112.349031, 40.257194],
+              [112.418017, 40.295091],
+              [112.456205, 40.300112],
+              [112.511639, 40.269068],
+              [112.6299, 40.235725],
+              [112.712436, 40.178593],
+              [112.744464, 40.167161],
+              [112.848558, 40.206937],
+              [112.898449, 40.329317],
+              [113.03334, 40.368997],
+              [113.083231, 40.374925],
+              [113.251382, 40.413211],
+              [113.27602, 40.388601],
+              [113.316672, 40.319736],
+              [113.387505, 40.319279],
+              [113.500222, 40.334335],
+              [113.559968, 40.348476],
+              [113.688699, 40.448288],
+              [113.763228, 40.473787],
+              [113.794641, 40.517932],
+              [113.850691, 40.460583],
+              [113.890112, 40.466503],
+              [113.948626, 40.514747],
+              [114.011452, 40.515657],
+              [114.061959, 40.52885],
+              [114.080437, 40.547952],
+              [114.076741, 40.575686],
+              [114.041633, 40.608861],
+              [114.07243, 40.679246],
+              [114.063806, 40.706925],
+              [114.084748, 40.729605],
+              [114.134639, 40.737314]
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "properties": {
+        "adcode": "610000",
+        "name": "陕西省",
+        "center": [108.948024, 34.263161],
+        "centroid": [108.887304, 35.263625],
+        "childrenNum": 10,
+        "level": "province",
+        "parent": { "adcode": 100000 },
+        "subFeatureIndex": 26,
+        "acroutes": [100000]
+      },
+      "geometry": {
+        "type": "MultiPolygon",
+        "coordinates": [
+          [
+            [
+              [110.398352, 33.176862],
+              [110.398352, 33.176862],
+              [110.372482, 33.186379],
+              [110.33799, 33.160331],
+              [110.285635, 33.171352],
+              [110.218497, 33.163336],
+              [110.164911, 33.209415],
+              [110.031252, 33.191888],
+              [109.999223, 33.212419],
+              [109.973353, 33.203907],
+              [109.916687, 33.229942],
+              [109.852013, 33.247961],
+              [109.813209, 33.236449],
+              [109.732521, 33.231443],
+              [109.693101, 33.254468],
+              [109.649985, 33.251465],
+              [109.619804, 33.275484],
+              [109.60687, 33.235949],
+              [109.514479, 33.237951],
+              [109.498464, 33.207412],
+              [109.438718, 33.152314],
+              [109.468283, 33.140288],
+              [109.522486, 33.138785],
+              [109.576073, 33.110216],
+              [109.688174, 33.116733],
+              [109.704188, 33.101694],
+              [109.794731, 33.067095],
+              [109.785492, 32.987316],
+              [109.76455, 32.909474],
+              [109.789804, 32.882339],
+              [109.847702, 32.893395],
+              [109.856941, 32.910479],
+              [109.907448, 32.903947],
+              [109.927158, 32.887364],
+              [109.988752, 32.886359],
+              [110.051578, 32.851676],
+              [110.105164, 32.832569],
+              [110.142121, 32.802895],
+              [110.127338, 32.77774],
+              [110.159367, 32.767173],
+              [110.156903, 32.683093],
+              [110.206179, 32.633212],
+              [110.153824, 32.593388],
+              [110.124259, 32.616579],
+              [110.090382, 32.617083],
+              [110.084223, 32.580782],
+              [110.017701, 32.546989],
+              [109.97089, 32.577756],
+              [109.910528, 32.592884],
+              [109.816905, 32.577252],
+              [109.746072, 32.594901],
+              [109.726978, 32.608513],
+              [109.631507, 32.599943],
+              [109.619804, 32.56767],
+              [109.637051, 32.540935],
+              [109.575457, 32.506622],
+              [109.526797, 32.43341],
+              [109.529877, 32.405625],
+              [109.502776, 32.38895],
+              [109.513247, 32.342444],
+              [109.495385, 32.300468],
+              [109.528645, 32.270112],
+              [109.550203, 32.225065],
+              [109.592703, 32.219495],
+              [109.604406, 32.199241],
+              [109.58716, 32.161251],
+              [109.621652, 32.106519],
+              [109.590855, 32.047696],
+              [109.590855, 32.012688],
+              [109.631507, 31.962436],
+              [109.62042, 31.928412],
+              [109.584696, 31.900472],
+              [109.60379, 31.885737],
+              [109.633971, 31.824738],
+              [109.633971, 31.804396],
+              [109.592087, 31.789136],
+              [109.585928, 31.726546],
+              [109.549587, 31.73011],
+              [109.502776, 31.716365],
+              [109.446109, 31.722983],
+              [109.381436, 31.705165],
+              [109.281654, 31.716874],
+              [109.282885, 31.743343],
+              [109.253936, 31.759628],
+              [109.279806, 31.776418],
+              [109.27611, 31.79931],
+              [109.195422, 31.817618],
+              [109.191111, 31.85575],
+              [109.123357, 31.892851],
+              [109.085785, 31.929428],
+              [108.986619, 31.980205],
+              [108.902235, 31.984774],
+              [108.837561, 32.039072],
+              [108.78767, 32.04871],
+              [108.75133, 32.076098],
+              [108.734084, 32.106519],
+              [108.676801, 32.10297],
+              [108.585026, 32.17189],
+              [108.543758, 32.177969],
+              [108.509882, 32.201266],
+              [108.507418, 32.245819],
+              [108.469846, 32.270618],
+              [108.414411, 32.252399],
+              [108.389773, 32.263533],
+              [108.310933, 32.232152],
+              [108.240716, 32.274666],
+              [108.179738, 32.221521],
+              [108.156948, 32.239239],
+              [108.143398, 32.219495],
+              [108.086731, 32.233165],
+              [108.018362, 32.2119],
+              [108.024521, 32.177462],
+              [107.979558, 32.146051],
+              [107.924739, 32.197215],
+              [107.890247, 32.214432],
+              [107.864377, 32.201266],
+              [107.812022, 32.247844],
+              [107.753508, 32.338399],
+              [107.707929, 32.331826],
+              [107.680827, 32.397035],
+              [107.648183, 32.413709],
+              [107.598291, 32.411688],
+              [107.527458, 32.38238],
+              [107.489886, 32.425328],
+              [107.456625, 32.41775],
+              [107.460937, 32.453612],
+              [107.438763, 32.465732],
+              [107.436299, 32.529835],
+              [107.382097, 32.54043],
+              [107.356843, 32.506622],
+              [107.313727, 32.489965],
+              [107.287858, 32.457147],
+              [107.263836, 32.403099],
+              [107.212097, 32.428864],
+              [107.189924, 32.468256],
+              [107.127098, 32.482393],
+              [107.080286, 32.542448],
+              [107.108004, 32.600951],
+              [107.098765, 32.649338],
+              [107.05996, 32.686115],
+              [107.066736, 32.708779],
+              [107.012533, 32.721367],
+              [106.912751, 32.704247],
+              [106.903512, 32.721367],
+              [106.854853, 32.724388],
+              [106.82344, 32.705254],
+              [106.793259, 32.712807],
+              [106.783404, 32.735967],
+              [106.733513, 32.739491],
+              [106.670071, 32.694678],
+              [106.626955, 32.682086],
+              [106.585687, 32.68813],
+              [106.517934, 32.668485],
+              [106.498224, 32.649338],
+              [106.451412, 32.65992],
+              [106.421231, 32.616579],
+              [106.389203, 32.62666],
+              [106.347935, 32.671003],
+              [106.301123, 32.680071],
+              [106.267863, 32.673522],
+              [106.254928, 32.693671],
+              [106.17424, 32.6977],
+              [106.120037, 32.719856],
+              [106.071378, 32.758114],
+              [106.076305, 32.759121],
+              [106.076921, 32.76365],
+              [106.07261, 32.76365],
+              [106.093552, 32.82402],
+              [106.071378, 32.828546],
+              [106.044277, 32.864747],
+              [106.011632, 32.829552],
+              [105.969132, 32.849162],
+              [105.93156, 32.826032],
+              [105.893371, 32.838603],
+              [105.849024, 32.817985],
+              [105.825002, 32.824523],
+              [105.822538, 32.770192],
+              [105.779423, 32.750061],
+              [105.768952, 32.767676],
+              [105.719061, 32.759624],
+              [105.677793, 32.726402],
+              [105.596489, 32.69921],
+              [105.585402, 32.728919],
+              [105.563844, 32.724891],
+              [105.555221, 32.794343],
+              [105.534279, 32.790822],
+              [105.524424, 32.847654],
+              [105.495475, 32.873292],
+              [105.49917, 32.911986],
+              [105.528119, 32.919019],
+              [105.565692, 32.906962],
+              [105.590329, 32.87681],
+              [105.638373, 32.879323],
+              [105.656851, 32.895405],
+              [105.735691, 32.905454],
+              [105.82685, 32.950663],
+              [105.861959, 32.939112],
+              [105.917393, 32.993841],
+              [105.926632, 33.042517],
+              [105.914929, 33.066092],
+              [105.934639, 33.112221],
+              [105.923552, 33.147805],
+              [105.897067, 33.146803],
+              [105.93156, 33.178365],
+              [105.968516, 33.154318],
+              [105.965436, 33.204407],
+              [105.917393, 33.237951],
+              [105.862574, 33.234447],
+              [105.799133, 33.258471],
+              [105.791741, 33.278486],
+              [105.752937, 33.291994],
+              [105.755401, 33.329004],
+              [105.709822, 33.382991],
+              [105.827466, 33.379993],
+              [105.837937, 33.410971],
+              [105.831162, 33.451926],
+              [105.842248, 33.489866],
+              [105.871198, 33.511325],
+              [105.902611, 33.556222],
+              [105.940183, 33.570684],
+              [105.971596, 33.613058],
+              [106.047356, 33.610067],
+              [106.086776, 33.617045],
+              [106.117573, 33.602591],
+              [106.108334, 33.569686],
+              [106.187174, 33.546746],
+              [106.237681, 33.564201],
+              [106.303587, 33.604585],
+              [106.35163, 33.587137],
+              [106.384891, 33.612061],
+              [106.447101, 33.613058],
+              [106.456956, 33.532779],
+              [106.540108, 33.512822],
+              [106.58076, 33.576169],
+              [106.575832, 33.631497],
+              [106.534564, 33.695254],
+              [106.482825, 33.707203],
+              [106.488369, 33.757969],
+              [106.461883, 33.789807],
+              [106.491448, 33.834559],
+              [106.475434, 33.875809],
+              [106.428007, 33.866368],
+              [106.41076, 33.909093],
+              [106.474202, 33.970659],
+              [106.471738, 34.024244],
+              [106.505615, 34.056479],
+              [106.501919, 34.105055],
+              [106.560434, 34.109514],
+              [106.585071, 34.149641],
+              [106.55797, 34.229837],
+              [106.5321, 34.254079],
+              [106.496376, 34.238248],
+              [106.526557, 34.292159],
+              [106.577064, 34.280786],
+              [106.589383, 34.253584],
+              [106.63373, 34.260014],
+              [106.652825, 34.24369],
+              [106.68239, 34.256057],
+              [106.705179, 34.299575],
+              [106.691013, 34.337635],
+              [106.717498, 34.369255],
+              [106.638042, 34.391481],
+              [106.610941, 34.454177],
+              [106.558586, 34.48822],
+              [106.513622, 34.498085],
+              [106.514238, 34.511894],
+              [106.455108, 34.531617],
+              [106.334384, 34.517811],
+              [106.341159, 34.568093],
+              [106.314058, 34.578934],
+              [106.419384, 34.643458],
+              [106.471122, 34.634102],
+              [106.442173, 34.675455],
+              [106.456956, 34.703996],
+              [106.487137, 34.715311],
+              [106.505615, 34.746789],
+              [106.539492, 34.745805],
+              [106.575216, 34.769897],
+              [106.550579, 34.82936],
+              [106.556122, 34.861285],
+              [106.527789, 34.876507],
+              [106.493296, 34.941289],
+              [106.484673, 34.983959],
+              [106.494528, 35.006021],
+              [106.494528, 35.006021],
+              [106.52163, 35.027587],
+              [106.541956, 35.083925],
+              [106.577064, 35.089312],
+              [106.615252, 35.071191],
+              [106.706411, 35.081966],
+              [106.710723, 35.100574],
+              [106.838222, 35.080007],
+              [106.901664, 35.094698],
+              [106.950323, 35.066782],
+              [106.990975, 35.068252],
+              [107.012533, 35.029547],
+              [107.08275, 35.024156],
+              [107.089526, 34.976604],
+              [107.119707, 34.950119],
+              [107.162206, 34.944233],
+              [107.189308, 34.893198],
+              [107.252749, 34.880925],
+              [107.286626, 34.931968],
+              [107.350068, 34.93393],
+              [107.369162, 34.917738],
+              [107.400575, 34.932949],
+              [107.455394, 34.916757],
+              [107.523763, 34.909886],
+              [107.564415, 34.968757],
+              [107.619849, 34.964834],
+              [107.638943, 34.935402],
+              [107.675284, 34.9511],
+              [107.741805, 34.953553],
+              [107.842203, 34.979056],
+              [107.863145, 34.999158],
+              [107.846515, 35.024646],
+              [107.814486, 35.024646],
+              [107.773218, 35.060904],
+              [107.773218, 35.060904],
+              [107.769523, 35.064333],
+              [107.769523, 35.064333],
+              [107.727639, 35.120157],
+              [107.715936, 35.168114],
+              [107.686371, 35.218],
+              [107.652494, 35.244886],
+              [107.667277, 35.257104],
+              [107.737494, 35.267366],
+              [107.745501, 35.311819],
+              [107.841587, 35.276649],
+              [107.867457, 35.256127],
+              [107.960464, 35.263457],
+              [107.949993, 35.245375],
+              [108.049159, 35.253683],
+              [108.094739, 35.280069],
+              [108.174811, 35.304981],
+              [108.221622, 35.296678],
+              [108.239484, 35.256127],
+              [108.296767, 35.267855],
+              [108.345426, 35.300586],
+              [108.36144, 35.279581],
+              [108.48894, 35.275184],
+              [108.547454, 35.304981],
+              [108.583178, 35.294724],
+              [108.614591, 35.328909],
+              [108.61028, 35.355271],
+              [108.631222, 35.418698],
+              [108.605968, 35.503028],
+              [108.625678, 35.537124],
+              [108.618287, 35.557088],
+              [108.539447, 35.605761],
+              [108.517889, 35.699615],
+              [108.533903, 35.746257],
+              [108.527744, 35.82442],
+              [108.499411, 35.872444],
+              [108.518505, 35.905414],
+              [108.562852, 35.921409],
+              [108.593649, 35.950967],
+              [108.652164, 35.94806],
+              [108.659555, 35.990683],
+              [108.688504, 36.021183],
+              [108.682345, 36.062316],
+              [108.712526, 36.138716],
+              [108.646004, 36.254143],
+              [108.641693, 36.359279],
+              [108.651548, 36.384818],
+              [108.618903, 36.433946],
+              [108.562852, 36.43876],
+              [108.510498, 36.47438],
+              [108.514809, 36.445501],
+              [108.495099, 36.422389],
+              [108.460606, 36.422871],
+              [108.408252, 36.45946],
+              [108.391621, 36.505654],
+              [108.365136, 36.519603],
+              [108.340498, 36.559032],
+              [108.262274, 36.549417],
+              [108.245644, 36.571048],
+              [108.210535, 36.577296],
+              [108.204992, 36.606607],
+              [108.204992, 36.606607],
+              [108.222854, 36.631105],
+              [108.1976, 36.630144],
+              [108.163724, 36.563839],
+              [108.092891, 36.587388],
+              [108.079956, 36.614294],
+              [108.060862, 36.592194],
+              [108.001732, 36.639269],
+              [108.02329, 36.647912],
+              [108.006659, 36.683435],
+              [107.938906, 36.655594],
+              [107.940754, 36.694953],
+              [107.914268, 36.720861],
+              [107.907493, 36.750118],
+              [107.866841, 36.766899],
+              [107.768291, 36.792783],
+              [107.742421, 36.811951],
+              [107.722095, 36.802367],
+              [107.670356, 36.83303],
+              [107.642023, 36.819137],
+              [107.5909, 36.836382],
+              [107.540393, 36.828718],
+              [107.533618, 36.867031],
+              [107.478183, 36.908196],
+              [107.365466, 36.905324],
+              [107.336517, 36.925899],
+              [107.310032, 36.912502],
+              [107.291554, 36.979463],
+              [107.291554, 36.979463],
+              [107.288474, 37.008143],
+              [107.288474, 37.008143],
+              [107.28601, 37.054963],
+              [107.268764, 37.099367],
+              [107.281083, 37.127047],
+              [107.306952, 37.100799],
+              [107.334669, 37.138975],
+              [107.336517, 37.165687],
+              [107.317423, 37.200017],
+              [107.270612, 37.229089],
+              [107.309416, 37.239095],
+              [107.273075, 37.29101],
+              [107.257677, 37.337179],
+              [107.282931, 37.437036],
+              [107.284162, 37.481691],
+              [107.345756, 37.518725],
+              [107.369162, 37.58752],
+              [107.330358, 37.584201],
+              [107.311264, 37.609806],
+              [107.361155, 37.613125],
+              [107.422133, 37.665254],
+              [107.389488, 37.671413],
+              [107.387024, 37.691305],
+              [107.425828, 37.684201],
+              [107.484959, 37.706458],
+              [107.499125, 37.765619],
+              [107.57119, 37.776499],
+              [107.599523, 37.791162],
+              [107.620465, 37.776026],
+              [107.646335, 37.805349],
+              [107.659269, 37.844112],
+              [107.65003, 37.86443],
+              [107.684523, 37.888522],
+              [107.732566, 37.84931],
+              [107.842819, 37.828987],
+              [107.884703, 37.808186],
+              [107.982022, 37.787378],
+              [107.993109, 37.735335],
+              [108.025753, 37.696041],
+              [108.012819, 37.66857],
+              [108.025137, 37.649619],
+              [108.055318, 37.652462],
+              [108.134159, 37.622131],
+              [108.193905, 37.638246],
+              [108.205608, 37.655779],
+              [108.24626, 37.665728],
+              [108.293071, 37.656726],
+              [108.301078, 37.640616],
+              [108.422418, 37.648672],
+              [108.485244, 37.678044],
+              [108.532671, 37.690832],
+              [108.628142, 37.651988],
+              [108.699591, 37.669518],
+              [108.720533, 37.683728],
+              [108.777815, 37.683728],
+              [108.791982, 37.700303],
+              [108.784591, 37.764673],
+              [108.799989, 37.784068],
+              [108.791982, 37.872934],
+              [108.798141, 37.93385],
+              [108.82709, 37.989056],
+              [108.797525, 38.04799],
+              [108.830786, 38.049875],
+              [108.883141, 38.01405],
+              [108.893612, 37.978207],
+              [108.93488, 37.922521],
+              [108.9743, 37.931962],
+              [108.982923, 37.964053],
+              [109.018648, 37.971602],
+              [109.037742, 38.021593],
+              [109.06977, 38.023008],
+              [109.050676, 38.055059],
+              [109.069155, 38.091336],
+              [108.964445, 38.154894],
+              [108.938575, 38.207582],
+              [108.976148, 38.245192],
+              [108.961981, 38.26493],
+              [109.007561, 38.359316],
+              [109.051292, 38.385122],
+              [109.054372, 38.433892],
+              [109.128901, 38.480288],
+              [109.175712, 38.518694],
+              [109.196654, 38.552867],
+              [109.276726, 38.623035],
+              [109.331545, 38.597783],
+              [109.367269, 38.627711],
+              [109.329081, 38.66043],
+              [109.338936, 38.701542],
+              [109.404226, 38.720689],
+              [109.444262, 38.782763],
+              [109.511399, 38.833595],
+              [109.549587, 38.805618],
+              [109.624116, 38.85457],
+              [109.672159, 38.928167],
+              [109.685094, 38.968195],
+              [109.665384, 38.981687],
+              [109.72513, 39.018429],
+              [109.762086, 39.057476],
+              [109.793499, 39.074204],
+              [109.851397, 39.122971],
+              [109.890818, 39.103932],
+              [109.92223, 39.107183],
+              [109.893897, 39.141075],
+              [109.961035, 39.191651],
+              [109.871723, 39.243581],
+              [109.90252, 39.271848],
+              [109.962267, 39.212056],
+              [110.041107, 39.21623],
+              [110.109476, 39.249606],
+              [110.217881, 39.281113],
+              [110.184005, 39.355192],
+              [110.161831, 39.387115],
+              [110.136577, 39.39174],
+              [110.12549, 39.432891],
+              [110.152592, 39.45415],
+              [110.243751, 39.423645],
+              [110.257917, 39.407001],
+              [110.385417, 39.310291],
+              [110.429764, 39.341308],
+              [110.434692, 39.381101],
+              [110.482735, 39.360745],
+              [110.524003, 39.382952],
+              [110.559728, 39.351027],
+              [110.566503, 39.320014],
+              [110.596684, 39.282966],
+              [110.626249, 39.266751],
+              [110.702626, 39.273701],
+              [110.731575, 39.30705],
+              [110.73835, 39.348713],
+              [110.782698, 39.38804],
+              [110.869545, 39.494341],
+              [110.891103, 39.509118],
+              [110.958856, 39.519275],
+              [111.017371, 39.552045],
+              [111.101138, 39.559428],
+              [111.136863, 39.587106],
+              [111.154725, 39.569116],
+              [111.148566, 39.531277],
+              [111.10545, 39.497573],
+              [111.10545, 39.472631],
+              [111.058639, 39.447681],
+              [111.064182, 39.400989],
+              [111.098059, 39.401914],
+              [111.087588, 39.376013],
+              [111.125776, 39.366297],
+              [111.159037, 39.362596],
+              [111.155341, 39.338531],
+              [111.186138, 39.35149],
+              [111.179363, 39.326959],
+              [111.202152, 39.305197],
+              [111.247732, 39.302419],
+              [111.213239, 39.257021],
+              [111.219399, 39.244044],
+              [111.163348, 39.152678],
+              [111.173819, 39.135041],
+              [111.147334, 39.100681],
+              [111.138095, 39.064447],
+              [111.094363, 39.030053],
+              [111.038313, 39.020289],
+              [110.998276, 38.998433],
+              [110.980414, 38.970056],
+              [111.009979, 38.932823],
+              [111.016755, 38.889981],
+              [110.995813, 38.868084],
+              [111.009363, 38.847579],
+              [110.965016, 38.755699],
+              [110.915125, 38.704345],
+              [110.916357, 38.673981],
+              [110.880632, 38.626776],
+              [110.898494, 38.587024],
+              [110.920052, 38.581878],
+              [110.907733, 38.521035],
+              [110.870777, 38.510265],
+              [110.874473, 38.453579],
+              [110.840596, 38.439986],
+              [110.796864, 38.453579],
+              [110.77777, 38.440924],
+              [110.746973, 38.366355],
+              [110.701394, 38.353215],
+              [110.661358, 38.308617],
+              [110.601612, 38.308147],
+              [110.57759, 38.297345],
+              [110.565887, 38.215105],
+              [110.528315, 38.211814],
+              [110.509221, 38.192061],
+              [110.519692, 38.130889],
+              [110.501829, 38.097929],
+              [110.507989, 38.013107],
+              [110.528315, 37.990471],
+              [110.522771, 37.955088],
+              [110.59422, 37.922049],
+              [110.680452, 37.790216],
+              [110.735886, 37.77035],
+              [110.750669, 37.736281],
+              [110.716792, 37.728708],
+              [110.706321, 37.705511],
+              [110.775306, 37.680886],
+              [110.793169, 37.650567],
+              [110.763604, 37.639668],
+              [110.771611, 37.594634],
+              [110.795017, 37.558586],
+              [110.770995, 37.538184],
+              [110.759292, 37.474567],
+              [110.740198, 37.44939],
+              [110.644111, 37.435135],
+              [110.630561, 37.372858],
+              [110.641648, 37.360015],
+              [110.695234, 37.34955],
+              [110.678604, 37.317668],
+              [110.690307, 37.287201],
+              [110.660126, 37.281011],
+              [110.651503, 37.256722],
+              [110.590525, 37.187145],
+              [110.53509, 37.138021],
+              [110.535706, 37.115118],
+              [110.49567, 37.086956],
+              [110.460561, 37.044932],
+              [110.417446, 37.027257],
+              [110.426685, 37.008621],
+              [110.382953, 37.022001],
+              [110.381721, 37.002408],
+              [110.424221, 36.963685],
+              [110.408823, 36.892403],
+              [110.376178, 36.882351],
+              [110.424221, 36.855539],
+              [110.406975, 36.824886],
+              [110.423605, 36.818179],
+              [110.407591, 36.776007],
+              [110.447011, 36.737649],
+              [110.438388, 36.685835],
+              [110.402663, 36.697352],
+              [110.394656, 36.676716],
+              [110.426685, 36.657514],
+              [110.447627, 36.621018],
+              [110.496902, 36.582102],
+              [110.488895, 36.556628],
+              [110.503677, 36.488335],
+              [110.47288, 36.453203],
+              [110.489511, 36.430094],
+              [110.487047, 36.393972],
+              [110.459946, 36.327946],
+              [110.474112, 36.306729],
+              [110.474112, 36.248352],
+              [110.45625, 36.22663],
+              [110.447011, 36.164328],
+              [110.467953, 36.074893],
+              [110.491974, 36.034735],
+              [110.49259, 35.994073],
+              [110.516612, 35.971796],
+              [110.502445, 35.947575],
+              [110.516612, 35.918501],
+              [110.511684, 35.879718],
+              [110.549257, 35.877778],
+              [110.550489, 35.838005],
+              [110.571431, 35.800639],
+              [110.57759, 35.701559],
+              [110.609619, 35.632031],
+              [110.567735, 35.539559],
+              [110.531394, 35.511309],
+              [110.477808, 35.413821],
+              [110.45009, 35.327933],
+              [110.374946, 35.251728],
+              [110.369402, 35.158329],
+              [110.325671, 35.014844],
+              [110.272084, 34.942761],
+              [110.257301, 34.934912],
+              [110.259149, 34.884853],
+              [110.233896, 34.83722],
+              [110.232664, 34.80332],
+              [110.259149, 34.737937],
+              [110.231432, 34.701044],
+              [110.23636, 34.670533],
+              [110.29549, 34.610956],
+              [110.379257, 34.600612],
+              [110.366939, 34.566614],
+              [110.404511, 34.557743],
+              [110.372482, 34.544435],
+              [110.360779, 34.516825],
+              [110.403279, 34.433448],
+              [110.403279, 34.433448],
+              [110.473496, 34.393457],
+              [110.503677, 34.33714],
+              [110.451938, 34.292653],
+              [110.428533, 34.288203],
+              [110.43962, 34.243196],
+              [110.507989, 34.217466],
+              [110.55172, 34.213012],
+              [110.55788, 34.193214],
+              [110.621938, 34.177372],
+              [110.642264, 34.161032],
+              [110.61393, 34.113478],
+              [110.591757, 34.101586],
+              [110.587445, 34.023252],
+              [110.620706, 34.035652],
+              [110.671213, 33.966192],
+              [110.665669, 33.937895],
+              [110.627481, 33.925482],
+              [110.628713, 33.910086],
+              [110.587445, 33.887733],
+              [110.612083, 33.852453],
+              [110.66259, 33.85295],
+              [110.712481, 33.833564],
+              [110.74143, 33.798759],
+              [110.782082, 33.796272],
+              [110.81719, 33.751003],
+              [110.831973, 33.713675],
+              [110.823966, 33.685793],
+              [110.878784, 33.634486],
+              [110.966864, 33.609071],
+              [111.00382, 33.578662],
+              [111.002588, 33.535772],
+              [111.02661, 33.478386],
+              [111.021682, 33.476389],
+              [111.021066, 33.471397],
+              [111.02661, 33.467903],
+              [110.996429, 33.435946],
+              [111.025994, 33.375495],
+              [111.025994, 33.330504],
+              [110.984726, 33.255469],
+              [110.960704, 33.253967],
+              [110.9219, 33.203907],
+              [110.865234, 33.213921],
+              [110.828893, 33.201403],
+              [110.824582, 33.158327],
+              [110.753133, 33.15031],
+              [110.702626, 33.097182],
+              [110.650887, 33.157324],
+              [110.623785, 33.143796],
+              [110.59422, 33.168346],
+              [110.57759, 33.250464],
+              [110.54125, 33.255469],
+              [110.471032, 33.171352],
+              [110.398352, 33.176862]
+            ]
+          ],
+          [
+            [
+              [111.02661, 33.478386],
+              [111.02661, 33.467903],
+              [111.021066, 33.471397],
+              [111.021682, 33.476389],
+              [111.02661, 33.478386]
+            ]
+          ],
+          [
+            [
+              [106.076921, 32.76365],
+              [106.076305, 32.759121],
+              [106.071378, 32.758114],
+              [106.07261, 32.76365],
+              [106.076921, 32.76365]
+            ]
+          ]
+        ]
+      }
+    },
+    {
+      "type": "Feature",
+      "properties": {
+        "adcode": "150000",
+        "name": "内蒙古自治区",
+        "center": [111.670801, 40.818311],
+        "centroid": [114.077404, 44.331072],
+        "childrenNum": 12,
+        "level": "province",
+        "parent": { "adcode": 100000 },
+        "subFeatureIndex": 4,
+        "acroutes": [100000]
+      },
+      "geometry": {
+        "type": "MultiPolygon",
+        "coordinates": [
+          [
+            [
+              [111.125776, 39.366297],
+              [111.087588, 39.376013],
+              [111.098059, 39.401914],
+              [111.064182, 39.400989],
+              [111.058639, 39.447681],
+              [111.10545, 39.472631],
+              [111.10545, 39.497573],
+              [111.148566, 39.531277],
+              [111.154725, 39.569116],
+              [111.136863, 39.587106],
+              [111.101138, 39.559428],
+              [111.017371, 39.552045],
+              [110.958856, 39.519275],
+              [110.891103, 39.509118],
+              [110.869545, 39.494341],
+              [110.782698, 39.38804],
+              [110.73835, 39.348713],
+              [110.731575, 39.30705],
+              [110.702626, 39.273701],
+              [110.626249, 39.266751],
+              [110.596684, 39.282966],
+              [110.566503, 39.320014],
+              [110.559728, 39.351027],
+              [110.524003, 39.382952],
+              [110.482735, 39.360745],
+              [110.434692, 39.381101],
+              [110.429764, 39.341308],
+              [110.385417, 39.310291],
+              [110.257917, 39.407001],
+              [110.243751, 39.423645],
+              [110.152592, 39.45415],
+              [110.12549, 39.432891],
+              [110.136577, 39.39174],
+              [110.161831, 39.387115],
+              [110.184005, 39.355192],
+              [110.217881, 39.281113],
+              [110.109476, 39.249606],
+              [110.041107, 39.21623],
+              [109.962267, 39.212056],
+              [109.90252, 39.271848],
+              [109.871723, 39.243581],
+              [109.961035, 39.191651],
+              [109.893897, 39.141075],
+              [109.92223, 39.107183],
+              [109.890818, 39.103932],
+              [109.851397, 39.122971],
+              [109.793499, 39.074204],
+              [109.762086, 39.057476],
+              [109.72513, 39.018429],
+              [109.665384, 38.981687],
+              [109.685094, 38.968195],
+              [109.672159, 38.928167],
+              [109.624116, 38.85457],
+              [109.549587, 38.805618],
+              [109.511399, 38.833595],
+              [109.444262, 38.782763],
+              [109.404226, 38.720689],
+              [109.338936, 38.701542],
+              [109.329081, 38.66043],
+              [109.367269, 38.627711],
+              [109.331545, 38.597783],
+              [109.276726, 38.623035],
+              [109.196654, 38.552867],
+              [109.175712, 38.518694],
+              [109.128901, 38.480288],
+              [109.054372, 38.433892],
+              [109.051292, 38.385122],
+              [109.007561, 38.359316],
+              [108.961981, 38.26493],
+              [108.976148, 38.245192],
+              [108.938575, 38.207582],
+              [108.964445, 38.154894],
+              [109.069155, 38.091336],
+              [109.050676, 38.055059],
+              [109.06977, 38.023008],
+              [109.037742, 38.021593],
+              [109.018648, 37.971602],
+              [108.982923, 37.964053],
+              [108.9743, 37.931962],
+              [108.93488, 37.922521],
+              [108.893612, 37.978207],
+              [108.883141, 38.01405],
+              [108.830786, 38.049875],
+              [108.797525, 38.04799],
+              [108.82709, 37.989056],
+              [108.798141, 37.93385],
+              [108.791982, 37.872934],
+              [108.799989, 37.784068],
+              [108.784591, 37.764673],
+              [108.791982, 37.700303],
+              [108.777815, 37.683728],
+              [108.720533, 37.683728],
+              [108.699591, 37.669518],
+              [108.628142, 37.651988],
+              [108.532671, 37.690832],
+              [108.485244, 37.678044],
+              [108.422418, 37.648672],
+              [108.301078, 37.640616],
+              [108.293071, 37.656726],
+              [108.24626, 37.665728],
+              [108.205608, 37.655779],
+              [108.193905, 37.638246],
+              [108.134159, 37.622131],
+              [108.055318, 37.652462],
+              [108.025137, 37.649619],
+              [108.012819, 37.66857],
+              [108.025753, 37.696041],
+              [107.993109, 37.735335],
+              [107.982022, 37.787378],
+              [107.884703, 37.808186],
+              [107.842819, 37.828987],
+              [107.732566, 37.84931],
+              [107.684523, 37.888522],
+              [107.65003, 37.86443],
+              [107.560719, 37.893717],
+              [107.49235, 37.944706],
+              [107.448618, 37.933378],
+              [107.411662, 37.948009],
+              [107.440611, 37.995659],
+              [107.3938, 38.014993],
+              [107.33159, 38.086625],
+              [107.240431, 38.111586],
+              [107.19054, 38.153953],
+              [107.138801, 38.161011],
+              [107.119091, 38.134185],
+              [107.071047, 38.138892],
+              [107.051337, 38.122886],
+              [107.010069, 38.120532],
+              [106.942316, 38.132302],
+              [106.858548, 38.156306],
+              [106.779092, 38.171833],
+              [106.737824, 38.197706],
+              [106.654672, 38.22921],
+              [106.627571, 38.232501],
+              [106.555506, 38.263521],
+              [106.482209, 38.319417],
+              [106.599854, 38.389812],
+              [106.647897, 38.470917],
+              [106.66268, 38.601524],
+              [106.709491, 38.718821],
+              [106.756302, 38.748699],
+              [106.837606, 38.847579],
+              [106.954019, 38.941202],
+              [106.971881, 39.026333],
+              [106.96757, 39.054688],
+              [106.933693, 39.076527],
+              [106.878874, 39.091392],
+              [106.859164, 39.107648],
+              [106.825288, 39.19397],
+              [106.795723, 39.214375],
+              [106.790795, 39.241263],
+              [106.806193, 39.277407],
+              [106.806809, 39.318625],
+              [106.781556, 39.371849],
+              [106.751375, 39.381564],
+              [106.683622, 39.357506],
+              [106.643586, 39.357969],
+              [106.602318, 39.37555],
+              [106.556122, 39.322329],
+              [106.525325, 39.308439],
+              [106.511774, 39.272311],
+              [106.402753, 39.291767],
+              [106.280181, 39.262118],
+              [106.29558, 39.167992],
+              [106.285109, 39.146181],
+              [106.251232, 39.131327],
+              [106.192718, 39.142932],
+              [106.170544, 39.163352],
+              [106.145907, 39.153142],
+              [106.096631, 39.084889],
+              [106.078153, 39.026333],
+              [106.087392, 39.006339],
+              [106.060907, 38.96866],
+              [106.021487, 38.953769],
+              [105.97098, 38.909077],
+              [105.992538, 38.857366],
+              [105.909386, 38.791159],
+              [105.908154, 38.737496],
+              [105.88598, 38.716953],
+              [105.894603, 38.696405],
+              [105.852719, 38.641735],
+              [105.874277, 38.593105],
+              [105.856415, 38.569714],
+              [105.863806, 38.53508],
+              [105.836705, 38.476071],
+              [105.850872, 38.443736],
+              [105.827466, 38.432486],
+              [105.835473, 38.387467],
+              [105.821307, 38.366824],
+              [105.86627, 38.296406],
+              [105.842248, 38.240962],
+              [105.802828, 38.220277],
+              [105.775111, 38.186887],
+              [105.76772, 38.121474],
+              [105.780655, 38.084741],
+              [105.840401, 38.004147],
+              [105.799749, 37.939986],
+              [105.80406, 37.862068],
+              [105.760944, 37.799674],
+              [105.677177, 37.771769],
+              [105.622358, 37.777919],
+              [105.616199, 37.722555],
+              [105.598952, 37.699356],
+              [105.467141, 37.695094],
+              [105.4037, 37.710246],
+              [105.315004, 37.702197],
+              [105.221998, 37.677097],
+              [105.187505, 37.657674],
+              [105.111128, 37.633981],
+              [105.027977, 37.580881],
+              [104.866601, 37.566651],
+              [104.805007, 37.539133],
+              [104.623305, 37.522522],
+              [104.433595, 37.515402],
+              [104.419429, 37.511604],
+              [104.407726, 37.464592],
+              [104.322726, 37.44844],
+              [104.287002, 37.428007],
+              [104.237727, 37.411847],
+              [104.183524, 37.406618],
+              [104.089285, 37.465067],
+              [103.935916, 37.572818],
+              [103.874938, 37.604117],
+              [103.841062, 37.64725],
+              [103.683381, 37.777919],
+              [103.627947, 37.797783],
+              [103.40744, 37.860651],
+              [103.362477, 38.037621],
+              [103.368636, 38.08898],
+              [103.53494, 38.156776],
+              [103.507838, 38.280905],
+              [103.465339, 38.353215],
+              [103.416063, 38.404821],
+              [103.85954, 38.64454],
+              [104.011677, 38.85923],
+              [104.044322, 38.895105],
+              [104.173053, 38.94446],
+              [104.196459, 38.9882],
+              [104.190915, 39.042139],
+              [104.207546, 39.083495],
+              [104.171205, 39.160567],
+              [104.047401, 39.297788],
+              [104.073271, 39.351953],
+              [104.089901, 39.419947],
+              [103.955626, 39.456923],
+              [103.85338, 39.461543],
+              [103.728961, 39.430117],
+              [103.595302, 39.386652],
+              [103.428998, 39.353341],
+              [103.344615, 39.331588],
+              [103.259615, 39.263971],
+              [103.188166, 39.215302],
+              [103.133347, 39.192579],
+              [103.007696, 39.099753],
+              [102.883892, 39.120649],
+              [102.616574, 39.171703],
+              [102.579002, 39.183301],
+              [102.45335, 39.255167],
+              [102.3548, 39.231993],
+              [102.276576, 39.188868],
+              [102.050526, 39.141075],
+              [102.012338, 39.127149],
+              [101.902701, 39.111827],
+              [101.833715, 39.08907],
+              [101.926106, 39.000758],
+              [101.955055, 38.985874],
+              [102.045599, 38.904885],
+              [102.075164, 38.891378],
+              [101.941505, 38.808883],
+              [101.873751, 38.733761],
+              [101.777049, 38.66043],
+              [101.672955, 38.6908],
+              [101.601506, 38.65529],
+              [101.562702, 38.713218],
+              [101.412413, 38.764099],
+              [101.331109, 38.777164],
+              [101.307087, 38.80282],
+              [101.34158, 38.822406],
+              [101.33542, 38.847113],
+              [101.24303, 38.860628],
+              [101.237486, 38.907214],
+              [101.198682, 38.943064],
+              [101.228863, 39.020754],
+              [101.117378, 38.975174],
+              [100.969553, 38.946788],
+              [100.961545, 39.005874],
+              [100.901799, 39.030053],
+              [100.875314, 39.002619],
+              [100.835278, 39.025869],
+              [100.829118, 39.075133],
+              [100.864227, 39.106719],
+              [100.842669, 39.199999],
+              [100.842053, 39.405614],
+              [100.707778, 39.404689],
+              [100.606764, 39.387577],
+              [100.498975, 39.400527],
+              [100.500823, 39.481408],
+              [100.44354, 39.485565],
+              [100.326512, 39.509118],
+              [100.301258, 39.572345],
+              [100.314193, 39.606935],
+              [100.250135, 39.685274],
+              [100.128179, 39.702312],
+              [100.040716, 39.757083],
+              [99.958796, 39.769504],
+              [99.904593, 39.785601],
+              [99.822058, 39.860063],
+              [99.672384, 39.888079],
+              [99.469124, 39.875221],
+              [99.440791, 39.885783],
+              [99.459885, 39.898181],
+              [99.491298, 39.884406],
+              [99.533182, 39.891753],
+              [99.714268, 39.972061],
+              [99.751225, 40.006909],
+              [99.841152, 40.013326],
+              [99.927383, 40.063727],
+              [99.955716, 40.150695],
+              [100.007455, 40.20008],
+              [100.169447, 40.277743],
+              [100.169447, 40.541131],
+              [100.242744, 40.618855],
+              [100.237201, 40.716905],
+              [100.224882, 40.727337],
+              [100.107853, 40.875475],
+              [100.057346, 40.908049],
+              [99.985897, 40.909858],
+              [99.673, 40.93292],
+              [99.565827, 40.846961],
+              [99.174705, 40.858278],
+              [99.172858, 40.747289],
+              [99.12543, 40.715091],
+              [99.102025, 40.676522],
+              [99.041662, 40.693767],
+              [98.984996, 40.782644],
+              [98.790975, 40.705564],
+              [98.80699, 40.660181],
+              [98.802678, 40.607043],
+              [98.762642, 40.639748],
+              [98.72199, 40.657911],
+              [98.689345, 40.691952],
+              [98.668403, 40.773128],
+              [98.569853, 40.746836],
+              [98.627751, 40.677884],
+              [98.344419, 40.568413],
+              [98.333332, 40.918903],
+              [98.25018, 40.93925],
+              [98.184891, 40.988056],
+              [98.142391, 41.001607],
+              [97.971776, 41.09774],
+              [97.903407, 41.168057],
+              [97.629314, 41.440498],
+              [97.613915, 41.477276],
+              [97.84674, 41.656379],
+              [97.653335, 41.986856],
+              [97.500582, 42.243894],
+              [97.371235, 42.457076],
+              [97.172903, 42.795257],
+              [97.28254, 42.782081],
+              [97.831958, 42.706047],
+              [98.195362, 42.653251],
+              [98.546447, 42.638284],
+              [98.962822, 42.607018],
+              [99.51224, 42.568244],
+              [99.969267, 42.647969],
+              [100.004376, 42.648849],
+              [100.272309, 42.636523],
+              [100.32528, 42.690213],
+              [100.826655, 42.675255],
+              [100.862995, 42.671295],
+              [101.291689, 42.586312],
+              [101.557775, 42.529887],
+              [101.770274, 42.509597],
+              [101.803534, 42.503861],
+              [101.877447, 42.432345],
+              [102.070236, 42.232374],
+              [102.093642, 42.223512],
+              [102.449039, 42.144133],
+              [102.540814, 42.162323],
+              [102.621502, 42.154338],
+              [102.712045, 42.153007],
+              [103.021862, 42.028212],
+              [103.20726, 41.96283],
+              [103.418527, 41.882233],
+              [103.454868, 41.877332],
+              [103.868779, 41.802427],
+              [104.080046, 41.805104],
+              [104.30856, 41.840782],
+              [104.418813, 41.860397],
+              [104.530298, 41.875104],
+              [104.524138, 41.661745],
+              [104.68921, 41.6452],
+              [104.803775, 41.652355],
+              [104.923267, 41.654143],
+              [105.009498, 41.583007],
+              [105.230621, 41.751103],
+              [105.291599, 41.749763],
+              [105.385221, 41.797073],
+              [105.589713, 41.888471],
+              [105.74185, 41.949033],
+              [106.01348, 42.032213],
+              [106.344855, 42.149457],
+              [106.372572, 42.161436],
+              [106.612789, 42.241679],
+              [106.785867, 42.291281],
+              [107.051337, 42.319166],
+              [107.271844, 42.364285],
+              [107.303872, 42.412465],
+              [107.46648, 42.458842],
+              [107.501589, 42.456635],
+              [107.57427, 42.412907],
+              [107.736262, 42.415116],
+              [107.939522, 42.403628],
+              [107.986949, 42.413349],
+              [108.022058, 42.433229],
+              [108.089195, 42.436321],
+              [108.238252, 42.460167],
+              [108.298614, 42.438529],
+              [108.532671, 42.442945],
+              [108.705134, 42.413349],
+              [108.798757, 42.415116],
+              [108.845569, 42.395673],
+              [108.983539, 42.449128],
+              [109.026039, 42.458401],
+              [109.291509, 42.435879],
+              [109.486761, 42.458842],
+              [109.544044, 42.472528],
+              [109.683862, 42.558988],
+              [109.733753, 42.579262],
+              [109.906216, 42.635643],
+              [110.108244, 42.642687],
+              [110.139657, 42.674815],
+              [110.34846, 42.742098],
+              [110.437156, 42.781203],
+              [110.469801, 42.839156],
+              [110.631177, 42.936061],
+              [110.689691, 43.02144],
+              [110.687227, 43.036314],
+              [110.736502, 43.089657],
+              [110.769763, 43.099272],
+              [110.82027, 43.149067],
+              [111.02045, 43.329998],
+              [111.069725, 43.357852],
+              [111.151029, 43.38004],
+              [111.183674, 43.396132],
+              [111.354289, 43.436125],
+              [111.400485, 43.472618],
+              [111.456535, 43.494329],
+              [111.564325, 43.490422],
+              [111.606209, 43.513863],
+              [111.79407, 43.672068],
+              [111.891388, 43.6738],
+              [111.951135, 43.693275],
+              [111.970845, 43.748205],
+              [111.959758, 43.823382],
+              [111.870447, 43.940279],
+              [111.773128, 44.010479],
+              [111.702295, 44.034147],
+              [111.662875, 44.061247],
+              [111.559397, 44.171238],
+              [111.541535, 44.206855],
+              [111.534144, 44.26217],
+              [111.507042, 44.294305],
+              [111.428818, 44.319573],
+              [111.415883, 44.35724],
+              [111.427586, 44.394455],
+              [111.478709, 44.488884],
+              [111.514434, 44.507666],
+              [111.530448, 44.55033],
+              [111.569868, 44.57634],
+              [111.560629, 44.647062],
+              [111.585267, 44.705789],
+              [111.624687, 44.778477],
+              [111.69244, 44.859983],
+              [111.764505, 44.969325],
+              [111.903707, 45.052252],
+              [112.002874, 45.090713],
+              [112.071243, 45.096206],
+              [112.113743, 45.072965],
+              [112.396459, 45.064512],
+              [112.438959, 45.071697],
+              [112.540589, 45.001072],
+              [112.599719, 44.930783],
+              [112.712436, 44.879494],
+              [112.850406, 44.840466],
+              [112.937869, 44.840042],
+              [113.037652, 44.822641],
+              [113.11526, 44.799714],
+              [113.503918, 44.777628],
+              [113.540874, 44.759358],
+              [113.631417, 44.745333],
+              [113.712105, 44.788247],
+              [113.798953, 44.849377],
+              [113.861778, 44.863377],
+              [113.907358, 44.915104],
+              [114.065038, 44.931206],
+              [114.116777, 44.957045],
+              [114.158045, 44.994301],
+              [114.19069, 45.036607],
+              [114.313262, 45.107189],
+              [114.347139, 45.119436],
+              [114.409348, 45.179371],
+              [114.459855, 45.21353],
+              [114.519602, 45.283893],
+              [114.539928, 45.325985],
+              [114.551014, 45.387383],
+              [114.600906, 45.403773],
+              [114.745035, 45.438217],
+              [114.920578, 45.386122],
+              [114.983404, 45.379397],
+              [115.178041, 45.396209],
+              [115.36467, 45.392427],
+              [115.586408, 45.440317],
+              [115.699741, 45.45963],
+              [115.864197, 45.572853],
+              [115.936878, 45.632727],
+              [116.026805, 45.661177],
+              [116.035428, 45.685013],
+              [116.1155, 45.679577],
+              [116.17463, 45.688775],
+              [116.217746, 45.72221],
+              [116.22329, 45.747273],
+              [116.260862, 45.776082],
+              [116.286731, 45.775247],
+              [116.278108, 45.831152],
+              [116.288579, 45.839074],
+              [116.243, 45.876169],
+              [116.271949, 45.966926],
+              [116.414231, 46.133896],
+              [116.439484, 46.137628],
+              [116.536187, 46.23251],
+              [116.573143, 46.258998],
+              [116.585462, 46.292504],
+              [116.673541, 46.325163],
+              [116.745606, 46.327642],
+              [116.81336, 46.355737],
+              [116.834302, 46.384229],
+              [116.876801, 46.375559],
+              [117.097308, 46.356976],
+              [117.247597, 46.366888],
+              [117.372017, 46.36028],
+              [117.383719, 46.394962],
+              [117.375712, 46.416421],
+              [117.392343, 46.463023],
+              [117.447777, 46.528117],
+              [117.42006, 46.582029],
+              [117.49582, 46.600535],
+              [117.596218, 46.603414],
+              [117.622704, 46.596012],
+              [117.641182, 46.558166],
+              [117.704008, 46.516587],
+              [117.748355, 46.521941],
+              [117.769913, 46.537586],
+              [117.813645, 46.530588],
+              [117.870927, 46.549935],
+              [117.868464, 46.575447],
+              [117.914659, 46.607936],
+              [117.982412, 46.614925],
+              [117.992883, 46.631366],
+              [118.04647, 46.631366],
+              [118.124078, 46.678195],
+              [118.192448, 46.682711],
+              [118.238643, 46.709392],
+              [118.274984, 46.715957],
+              [118.316252, 46.73934],
+              [118.41049, 46.728265],
+              [118.446831, 46.704467],
+              [118.586033, 46.692975],
+              [118.639004, 46.721291],
+              [118.677192, 46.6979],
+              [118.788061, 46.687227],
+              [118.788061, 46.717598],
+              [118.845343, 46.771731],
+              [118.914329, 46.77501],
+              [118.912481, 46.733188],
+              [118.951285, 46.722111],
+              [119.011647, 46.745902],
+              [119.073857, 46.676552],
+              [119.123132, 46.642872],
+              [119.152081, 46.658072],
+              [119.20074, 46.648213],
+              [119.26295, 46.649034],
+              [119.325776, 46.608759],
+              [119.357805, 46.619447],
+              [119.374435, 46.603414],
+              [119.431718, 46.638763],
+              [119.491464, 46.629311],
+              [119.557985, 46.633832],
+              [119.598637, 46.618214],
+              [119.656535, 46.625612],
+              [119.682405, 46.605058],
+              [119.677477, 46.584908],
+              [119.739687, 46.615336],
+              [119.783419, 46.626023],
+              [119.8136, 46.66834],
+              [119.804361, 46.68189],
+              [119.859179, 46.669572],
+              [119.911534, 46.669572],
+              [119.93494, 46.712674],
+              [119.917078, 46.758203],
+              [119.936172, 46.790173],
+              [119.920157, 46.853238],
+              [119.926933, 46.903963],
+              [119.859795, 46.917046],
+              [119.845013, 46.964852],
+              [119.795122, 47.013024],
+              [119.79081, 47.04525],
+              [119.806825, 47.055037],
+              [119.763093, 47.13082],
+              [119.716282, 47.195518],
+              [119.627586, 47.247544],
+              [119.56784, 47.248357],
+              [119.559217, 47.303172],
+              [119.450812, 47.353065],
+              [119.437877, 47.378602],
+              [119.386138, 47.397645],
+              [119.365812, 47.423161],
+              [119.32208, 47.42721],
+              [119.365812, 47.47739],
+              [119.205052, 47.520249],
+              [119.152081, 47.540453],
+              [119.134219, 47.664335],
+              [118.773278, 47.771034],
+              [118.568171, 47.992187],
+              [118.441903, 47.995791],
+              [118.422193, 48.01461],
+              [118.37415, 48.016612],
+              [118.351976, 48.006203],
+              [118.284839, 48.011007],
+              [118.238027, 48.031422],
+              [118.238643, 48.041826],
+              [118.150564, 48.036224],
+              [118.124694, 48.047427],
+              [118.107448, 48.031021],
+              [118.052014, 48.01421],
+              [117.96147, 48.011007],
+              [117.886942, 48.025418],
+              [117.813645, 48.016212],
+              [117.529081, 47.782697],
+              [117.519226, 47.761782],
+              [117.493357, 47.758563],
+              [117.384335, 47.641356],
+              [117.094844, 47.8241],
+              [116.879265, 47.893968],
+              [116.791186, 47.89758],
+              [116.669846, 47.890758],
+              [116.453035, 47.837358],
+              [116.26579, 47.876711],
+              [116.130283, 47.823296],
+              [116.111189, 47.811642],
+              [115.968291, 47.689721],
+              [115.939342, 47.683275],
+              [115.580249, 47.921649],
+              [115.539597, 48.104607],
+              [115.545141, 48.134971],
+              [115.529126, 48.155336],
+              [115.81061, 48.257042],
+              [115.822929, 48.259432],
+              [115.799523, 48.514982],
+              [115.83032, 48.560156],
+              [116.069305, 48.811437],
+              [116.077928, 48.822471],
+              [116.048363, 48.873274],
+              [116.428397, 49.430659],
+              [116.717889, 49.847288],
+              [116.736367, 49.847674],
+              [117.068974, 49.695389],
+              [117.278394, 49.636512],
+              [117.485349, 49.633024],
+              [117.638102, 49.574847],
+              [117.809333, 49.521263],
+              [117.849369, 49.551557],
+              [117.866, 49.591532],
+              [117.950999, 49.596187],
+              [117.995963, 49.623332],
+              [118.011362, 49.614803],
+              [118.082811, 49.616741],
+              [118.129622, 49.669446],
+              [118.156723, 49.660149],
+              [118.211542, 49.690744],
+              [118.220781, 49.729831],
+              [118.284223, 49.743755],
+              [118.315636, 49.766953],
+              [118.384005, 49.783958],
+              [118.398787, 49.802502],
+              [118.385853, 49.827217],
+              [118.443751, 49.835709],
+              [118.483787, 49.830691],
+              [118.485019, 49.866194],
+              [118.531214, 49.887791],
+              [118.574946, 49.931342],
+              [118.605127, 49.926719],
+              [118.672264, 49.955991],
+              [118.739402, 49.946364],
+              [118.761576, 49.959456],
+              [118.791757, 49.955606],
+              [118.964836, 49.988708],
+              [118.982082, 49.979087],
+              [119.090487, 49.985629],
+              [119.12498, 50.019095],
+              [119.163168, 50.027554],
+              [119.193965, 50.069826],
+              [119.190269, 50.087877],
+              [119.236465, 50.075204],
+              [119.290052, 50.121655],
+              [119.309762, 50.161161],
+              [119.350414, 50.166145],
+              [119.339327, 50.192206],
+              [119.358421, 50.197953],
+              [119.319001, 50.220933],
+              [119.339943, 50.244668],
+              [119.35103, 50.303953],
+              [119.381827, 50.324208],
+              [119.358421, 50.358965],
+              [119.322696, 50.352474],
+              [119.277117, 50.366218],
+              [119.259871, 50.345218],
+              [119.232153, 50.365455],
+              [119.188422, 50.347509],
+              [119.155777, 50.364691],
+              [119.176719, 50.378814],
+              [119.125596, 50.389118],
+              [119.165016, 50.422683],
+              [119.217371, 50.414675],
+              [119.22353, 50.441363],
+              [119.250631, 50.448604],
+              [119.262334, 50.490124],
+              [119.264182, 50.536933],
+              [119.295595, 50.573814],
+              [119.281428, 50.601551],
+              [119.298059, 50.616743],
+              [119.361501, 50.632689],
+              [119.394145, 50.667219],
+              [119.385522, 50.682769],
+              [119.430486, 50.684286],
+              [119.450196, 50.695281],
+              [119.506862, 50.763846],
+              [119.496391, 50.771795],
+              [119.515485, 50.814165],
+              [119.498855, 50.827776],
+              [119.491464, 50.87878],
+              [119.569688, 50.933879],
+              [119.598637, 50.984767],
+              [119.630666, 51.00925],
+              [119.678093, 51.016404],
+              [119.726753, 51.051028],
+              [119.719361, 51.075099],
+              [119.764325, 51.092017],
+              [119.752622, 51.117193],
+              [119.771716, 51.124331],
+              [119.788346, 51.174636],
+              [119.760629, 51.212516],
+              [119.784035, 51.22601],
+              [119.821607, 51.21439],
+              [119.797586, 51.243622],
+              [119.828383, 51.263099],
+              [119.811136, 51.281071],
+              [119.885049, 51.302777],
+              [119.883817, 51.336813],
+              [119.946643, 51.360736],
+              [119.914614, 51.374187],
+              [119.910918, 51.390994],
+              [119.97128, 51.40033],
+              [119.982983, 51.445112],
+              [120.002693, 51.459283],
+              [119.982367, 51.482396],
+              [119.985447, 51.505125],
+              [120.017476, 51.52114],
+              [120.052584, 51.560967],
+              [120.035954, 51.583657],
+              [120.05936, 51.634203],
+              [120.100628, 51.649058],
+              [120.087077, 51.678013],
+              [120.172693, 51.679868],
+              [120.226279, 51.717703],
+              [120.294649, 51.752171],
+              [120.317438, 51.785873],
+              [120.363634, 51.789945],
+              [120.40675, 51.81659],
+              [120.40059, 51.833605],
+              [120.480046, 51.855049],
+              [120.481278, 51.885719],
+              [120.549032, 51.882394],
+              [120.548416, 51.907877],
+              [120.656821, 51.926333],
+              [120.66298, 51.958061],
+              [120.704864, 51.983501],
+              [120.717799, 52.015556],
+              [120.691929, 52.026973],
+              [120.690698, 52.047221],
+              [120.717183, 52.072978],
+              [120.753523, 52.085483],
+              [120.76769, 52.10938],
+              [120.760299, 52.136937],
+              [120.786784, 52.15787],
+              [120.745516, 52.20594],
+              [120.755371, 52.258355],
+              [120.715951, 52.261286],
+              [120.695625, 52.290214],
+              [120.653741, 52.302658],
+              [120.627256, 52.323878],
+              [120.62356, 52.361172],
+              [120.653741, 52.371038],
+              [120.64943, 52.3904],
+              [120.688234, 52.427637],
+              [120.68269, 52.464479],
+              [120.706712, 52.492909],
+              [120.687002, 52.511489],
+              [120.734429, 52.536977],
+              [120.690698, 52.547532],
+              [120.658669, 52.56718],
+              [120.62664, 52.570818],
+              [120.605082, 52.589364],
+              [120.56135, 52.595544],
+              [120.483742, 52.630066],
+              [120.462184, 52.64532],
+              [120.396895, 52.616261],
+              [120.289721, 52.623527],
+              [120.194866, 52.578819],
+              [120.125265, 52.586819],
+              [120.07599, 52.586092],
+              [120.049505, 52.598453],
+              [120.035338, 52.646409],
+              [120.071063, 52.70628],
+              [120.031642, 52.773674],
+              [120.101244, 52.788877],
+              [120.14128, 52.813119],
+              [120.181316, 52.806969],
+              [120.222584, 52.84277],
+              [120.297112, 52.869872],
+              [120.295265, 52.891542],
+              [120.350699, 52.906343],
+              [120.363018, 52.94134],
+              [120.411061, 52.957927],
+              [120.452945, 53.01017],
+              [120.529321, 53.045803],
+              [120.562582, 53.082845],
+              [120.643886, 53.106923],
+              [120.659901, 53.137091],
+              [120.687002, 53.142476],
+              [120.690698, 53.174771],
+              [120.736277, 53.204892],
+              [120.821893, 53.241797],
+              [120.838523, 53.239648],
+              [120.820661, 53.269007],
+              [120.867472, 53.278669],
+              [120.882871, 53.294411],
+              [120.936457, 53.28833],
+              [120.950624, 53.29763],
+              [121.055334, 53.29155],
+              [121.098449, 53.306929],
+              [121.129246, 53.277238],
+              [121.155732, 53.285468],
+              [121.227797, 53.280459],
+              [121.308485, 53.301565],
+              [121.336818, 53.325877],
+              [121.416274, 53.319443],
+              [121.499426, 53.337314],
+              [121.504969, 53.323018],
+              [121.575802, 53.29155],
+              [121.615222, 53.258984],
+              [121.642324, 53.262564],
+              [121.679896, 53.240722],
+              [121.67928, 53.199515],
+              [121.660186, 53.195213],
+              [121.665114, 53.170467],
+              [121.722396, 53.145706],
+              [121.753193, 53.147501],
+              [121.784606, 53.104408],
+              [121.775367, 53.089674],
+              [121.817867, 53.061631],
+              [121.785838, 53.018451],
+              [121.715621, 52.997926],
+              [121.677432, 52.948192],
+              [121.66265, 52.912478],
+              [121.610295, 52.892264],
+              [121.604136, 52.872401],
+              [121.620766, 52.853251],
+              [121.591201, 52.824693],
+              [121.537614, 52.801542],
+              [121.511129, 52.779104],
+              [121.476636, 52.772225],
+              [121.455078, 52.73528],
+              [121.373158, 52.683067],
+              [121.309717, 52.676173],
+              [121.29247, 52.651855],
+              [121.237036, 52.619167],
+              [121.182217, 52.59918],
+              [121.225333, 52.577364],
+              [121.280151, 52.586819],
+              [121.323883, 52.573727],
+              [121.353448, 52.534793],
+              [121.411963, 52.52205],
+              [121.416274, 52.499468],
+              [121.474172, 52.482706],
+              [121.495114, 52.484892],
+              [121.519136, 52.456821],
+              [121.565331, 52.460468],
+              [121.590585, 52.443326],
+              [121.63986, 52.44442],
+              [121.678664, 52.419973],
+              [121.658338, 52.3904],
+              [121.715621, 52.342894],
+              [121.714389, 52.318025],
+              [121.769207, 52.308147],
+              [121.841272, 52.282526],
+              [121.901018, 52.280695],
+              [121.94783, 52.298266],
+              [121.976779, 52.343626],
+              [122.035909, 52.377615],
+              [122.040837, 52.413038],
+              [122.091344, 52.427272],
+              [122.080873, 52.440407],
+              [122.107358, 52.452445],
+              [122.142467, 52.495096],
+              [122.140003, 52.510032],
+              [122.168952, 52.513674],
+              [122.178191, 52.48963],
+              [122.207756, 52.469218],
+              [122.310618, 52.475416],
+              [122.326016, 52.459374],
+              [122.342031, 52.414133],
+              [122.367284, 52.413768],
+              [122.378987, 52.395512],
+              [122.419023, 52.375057],
+              [122.447356, 52.394052],
+              [122.484313, 52.341432],
+              [122.478153, 52.29607],
+              [122.560689, 52.282526],
+              [122.585943, 52.266413],
+              [122.67895, 52.276667],
+              [122.710979, 52.256157],
+              [122.76087, 52.26678],
+              [122.787355, 52.252494],
+              [122.766413, 52.232705],
+              [122.769493, 52.179893],
+              [122.73808, 52.153464],
+              [122.690653, 52.140243],
+              [122.629059, 52.13657],
+              [122.643841, 52.111585],
+              [122.625363, 52.067459],
+              [122.650616, 52.058997],
+              [122.664783, 51.99861],
+              [122.683877, 51.974654],
+              [122.726377, 51.978709],
+              [122.729457, 51.919321],
+              [122.706051, 51.890151],
+              [122.725761, 51.87833],
+              [122.732536, 51.832495],
+              [122.771957, 51.779579],
+              [122.749167, 51.746613],
+              [122.778732, 51.698048],
+              [122.816304, 51.655371],
+              [122.820616, 51.633088],
+              [122.85634, 51.606707],
+              [122.832935, 51.581797],
+              [122.874202, 51.561339],
+              [122.880362, 51.537894],
+              [122.858804, 51.524864],
+              [122.880362, 51.511085],
+              [122.854492, 51.477551],
+              [122.871123, 51.455181],
+              [122.900072, 51.445112],
+              [122.903768, 51.415262],
+              [122.946267, 51.405183],
+              [122.965977, 51.386886],
+              [122.965977, 51.345786],
+              [123.002934, 51.31213],
+              [123.069455, 51.321108],
+              [123.127969, 51.297913],
+              [123.231447, 51.279199],
+              [123.231447, 51.268716],
+              [123.294273, 51.254111],
+              [123.339853, 51.27246],
+              [123.376809, 51.266844],
+              [123.414381, 51.278825],
+              [123.440251, 51.270963],
+              [123.46304, 51.286686],
+              [123.582533, 51.294545],
+              [123.582533, 51.306893],
+              [123.661989, 51.319237],
+              [123.660141, 51.342795],
+              [123.711264, 51.398089],
+              [123.794416, 51.361109],
+              [123.842459, 51.367462],
+              [123.887423, 51.320734],
+              [123.926227, 51.300532],
+              [123.939777, 51.313253],
+              [123.994596, 51.322604],
+              [124.071588, 51.320734],
+              [124.090067, 51.3413],
+              [124.128255, 51.347281],
+              [124.192313, 51.33943],
+              [124.239124, 51.344664],
+              [124.271769, 51.308389],
+              [124.297638, 51.298661],
+              [124.339522, 51.293422],
+              [124.406659, 51.272086],
+              [124.430065, 51.301281],
+              [124.426985, 51.331953],
+              [124.443616, 51.35812],
+              [124.478108, 51.36223],
+              [124.490427, 51.380537],
+              [124.555717, 51.375307],
+              [124.58713, 51.363725],
+              [124.62655, 51.327465],
+              [124.693687, 51.3327],
+              [124.752817, 51.35812],
+              [124.76452, 51.38726],
+              [124.783614, 51.392115],
+              [124.864302, 51.37979],
+              [124.885244, 51.40817],
+              [124.942527, 51.447349],
+              [124.917889, 51.474196],
+              [124.928976, 51.498419],
+              [124.983795, 51.508478],
+              [125.004737, 51.529332],
+              [125.047236, 51.529704],
+              [125.073106, 51.553526],
+              [125.060171, 51.59667],
+              [125.098975, 51.658341],
+              [125.12854, 51.659083],
+              [125.130388, 51.635317],
+              [125.175968, 51.639403],
+              [125.214772, 51.627888],
+              [125.228938, 51.640517],
+              [125.289301, 51.633831],
+              [125.316402, 51.610052],
+              [125.35151, 51.623801],
+              [125.38046, 51.585516],
+              [125.424807, 51.562827],
+              [125.528285, 51.488359],
+              [125.559082, 51.461521],
+              [125.595422, 51.416755],
+              [125.60035, 51.413396],
+              [125.600966, 51.410409],
+              [125.62314, 51.398089],
+              [125.623756, 51.387633],
+              [125.626219, 51.380163],
+              [125.700132, 51.327465],
+              [125.740784, 51.27583],
+              [125.76111, 51.261976],
+              [125.761726, 51.226385],
+              [125.819008, 51.227134],
+              [125.850421, 51.21364],
+              [125.864588, 51.146487],
+              [125.909551, 51.138977],
+              [125.946508, 51.108176],
+              [125.970529, 51.123955],
+              [125.993935, 51.119072],
+              [125.976073, 51.084498],
+              [126.059225, 51.043503],
+              [126.033971, 51.011132],
+              [126.041978, 50.981753],
+              [126.068464, 50.967434],
+              [126.042594, 50.92558],
+              [126.02042, 50.927466],
+              [125.996399, 50.906715],
+              [125.997631, 50.872738],
+              [125.961906, 50.901054],
+              [125.939732, 50.85423],
+              [125.913247, 50.825885],
+              [125.878138, 50.816812],
+              [125.890457, 50.805845],
+              [125.836255, 50.793363],
+              [125.846726, 50.769524],
+              [125.828863, 50.756654],
+              [125.804226, 50.773309],
+              [125.758646, 50.746809],
+              [125.795603, 50.738856],
+              [125.78082, 50.725598],
+              [125.825784, 50.70362],
+              [125.789443, 50.679735],
+              [125.804226, 50.658874],
+              [125.793139, 50.643316],
+              [125.814697, 50.62092],
+              [125.807921, 50.60383],
+              [125.829479, 50.56165],
+              [125.794987, 50.532748],
+              [125.770349, 50.531227],
+              [125.754335, 50.506874],
+              [125.740784, 50.523237],
+              [125.699516, 50.487078],
+              [125.654553, 50.471082],
+              [125.627451, 50.443268],
+              [125.580024, 50.449366],
+              [125.562162, 50.438314],
+              [125.583104, 50.409717],
+              [125.567089, 50.402852],
+              [125.536292, 50.420014],
+              [125.522126, 50.404759],
+              [125.546763, 50.358965],
+              [125.520278, 50.3498],
+              [125.530749, 50.331085],
+              [125.463611, 50.295925],
+              [125.466075, 50.266861],
+              [125.442053, 50.260357],
+              [125.448829, 50.216338],
+              [125.417416, 50.195654],
+              [125.39093, 50.199868],
+              [125.382923, 50.172278],
+              [125.335496, 50.161161],
+              [125.376148, 50.137385],
+              [125.311474, 50.140453],
+              [125.27883, 50.127411],
+              [125.258504, 50.103618],
+              [125.287453, 50.093636],
+              [125.283757, 50.070211],
+              [125.328105, 50.065985],
+              [125.315786, 50.04562],
+              [125.289916, 50.057917],
+              [125.25296, 50.041393],
+              [125.283757, 50.036012],
+              [125.297924, 50.014481],
+              [125.278214, 49.996402],
+              [125.241873, 49.987938],
+              [125.231402, 49.957531],
+              [125.190134, 49.959841],
+              [125.199373, 49.935194],
+              [125.225859, 49.922481],
+              [125.212924, 49.907452],
+              [125.245569, 49.87198],
+              [125.225243, 49.867351],
+              [125.239409, 49.844587],
+              [125.177815, 49.829533],
+              [125.222779, 49.799026],
+              [125.221547, 49.754969],
+              [125.204301, 49.734086],
+              [125.225243, 49.726349],
+              [125.219699, 49.669058],
+              [125.185207, 49.634574],
+              [125.189518, 49.652401],
+              [125.164881, 49.669446],
+              [125.132236, 49.672157],
+              [125.127308, 49.655113],
+              [125.15441, 49.616741],
+              [125.16796, 49.629923],
+              [125.205533, 49.593859],
+              [125.23017, 49.595411],
+              [125.233866, 49.536801],
+              [125.211076, 49.539908],
+              [125.228323, 49.487063],
+              [125.270822, 49.454395],
+              [125.256656, 49.437275],
+              [125.25604, 49.395227],
+              [125.277598, 49.379644],
+              [125.256656, 49.359769],
+              [125.261583, 49.322336],
+              [125.214772, 49.277066],
+              [125.233866, 49.255587],
+              [125.219699, 49.189139],
+              [125.187671, 49.186792],
+              [125.158721, 49.144921],
+              [125.117453, 49.126127],
+              [125.034302, 49.157056],
+              [125.039845, 49.17623],
+              [124.983179, 49.162535],
+              [124.906802, 49.184054],
+              [124.860607, 49.166448],
+              [124.847672, 49.129651],
+              [124.809484, 49.115943],
+              [124.828578, 49.077933],
+              [124.808252, 49.020666],
+              [124.756513, 48.967262],
+              [124.744194, 48.920487],
+              [124.709086, 48.920487],
+              [124.715861, 48.885475],
+              [124.697383, 48.841775],
+              [124.654267, 48.83429],
+              [124.644412, 48.80789],
+              [124.656115, 48.783842],
+              [124.612383, 48.747945],
+              [124.624702, 48.701755],
+              [124.601912, 48.632587],
+              [124.579122, 48.596582],
+              [124.520608, 48.556195],
+              [124.548941, 48.535593],
+              [124.533543, 48.515379],
+              [124.555717, 48.467784],
+              [124.507674, 48.445558],
+              [124.52492, 48.426897],
+              [124.51876, 48.378027],
+              [124.547094, 48.35775],
+              [124.540934, 48.335476],
+              [124.579738, 48.297269],
+              [124.558796, 48.268197],
+              [124.579122, 48.262221],
+              [124.547094, 48.200829],
+              [124.512601, 48.164518],
+              [124.529847, 48.146951],
+              [124.505826, 48.124985],
+              [124.478108, 48.123387],
+              [124.46579, 48.098213],
+              [124.415899, 48.08782],
+              [124.430065, 48.12099],
+              [124.471333, 48.133373],
+              [124.467637, 48.178886],
+              [124.418978, 48.181679],
+              [124.412819, 48.219175],
+              [124.422058, 48.245884],
+              [124.365392, 48.283731],
+              [124.353689, 48.315978],
+              [124.317964, 48.35099],
+              [124.331515, 48.380015],
+              [124.309957, 48.413393],
+              [124.330283, 48.435633],
+              [124.302566, 48.456673],
+              [124.314269, 48.503881],
+              [124.25945, 48.536385],
+              [124.136878, 48.463023],
+              [124.07898, 48.43603],
+              [124.019234, 48.39313],
+              [123.862785, 48.271782],
+              [123.746373, 48.197638],
+              [123.705105, 48.152142],
+              [123.579453, 48.045427],
+              [123.537569, 48.021816],
+              [123.300432, 47.953723],
+              [123.256085, 47.876711],
+              [123.214201, 47.824502],
+              [123.161846, 47.781892],
+              [123.041122, 47.746492],
+              [122.926557, 47.697777],
+              [122.848949, 47.67441],
+              [122.765181, 47.614333],
+              [122.59395, 47.54732],
+              [122.543443, 47.495589],
+              [122.507103, 47.401291],
+              [122.418407, 47.350632],
+              [122.441197, 47.310476],
+              [122.462755, 47.27841],
+              [122.498479, 47.255262],
+              [122.531124, 47.198771],
+              [122.582863, 47.158092],
+              [122.615508, 47.124306],
+              [122.679566, 47.094164],
+              [122.710363, 47.093349],
+              [122.821232, 47.065636],
+              [122.852645, 47.072158],
+              [122.845869, 47.046881],
+              [122.778116, 47.002822],
+              [122.77442, 46.973837],
+              [122.798442, 46.9575],
+              [122.791051, 46.941567],
+              [122.83971, 46.937072],
+              [122.895144, 46.960359],
+              [122.893913, 46.895376],
+              [122.906847, 46.80738],
+              [122.996774, 46.761483],
+              [123.00355, 46.730726],
+              [123.026339, 46.718829],
+              [123.076846, 46.745082],
+              [123.103332, 46.734828],
+              [123.163694, 46.74016],
+              [123.198802, 46.803283],
+              [123.22344, 46.821305],
+              [123.221592, 46.850373],
+              [123.295505, 46.865105],
+              [123.341084, 46.826628],
+              [123.374345, 46.837683],
+              [123.40699, 46.906416],
+              [123.404526, 46.935438],
+              [123.360179, 46.970978],
+              [123.304128, 46.964852],
+              [123.301664, 46.999965],
+              [123.337389, 46.988943],
+              [123.42362, 46.934212],
+              [123.487678, 46.959951],
+              [123.52833, 46.944836],
+              [123.483366, 46.84587],
+              [123.506772, 46.827038],
+              [123.562823, 46.82581],
+              [123.575757, 46.845461],
+              [123.576989, 46.891286],
+              [123.605322, 46.891286],
+              [123.599163, 46.868378],
+              [123.625648, 46.847508],
+              [123.580069, 46.827447],
+              [123.629344, 46.813524],
+              [123.631808, 46.728675],
+              [123.603475, 46.68928],
+              [123.474743, 46.686817],
+              [123.366338, 46.677784],
+              [123.318295, 46.662179],
+              [123.276411, 46.660947],
+              [123.279491, 46.616981],
+              [123.228368, 46.588198],
+              [123.18094, 46.614103],
+              [123.098404, 46.603002],
+              [123.077462, 46.622324],
+              [123.04605, 46.617803],
+              [123.052825, 46.579972],
+              [123.002318, 46.574624],
+              [123.010325, 46.524823],
+              [123.011557, 46.434984],
+              [123.089781, 46.347888],
+              [123.142136, 46.298293],
+              [123.178476, 46.248239],
+              [123.128585, 46.210565],
+              [123.127354, 46.174523],
+              [123.102716, 46.172037],
+              [123.112571, 46.130163],
+              [123.070071, 46.123527],
+              [123.04605, 46.099878],
+              [122.792898, 46.073313],
+              [122.828623, 45.912406],
+              [122.80029, 45.856583],
+              [122.772572, 45.856583],
+              [122.752246, 45.834905],
+              [122.792283, 45.766063],
+              [122.751015, 45.735996],
+              [122.741775, 45.705077],
+              [122.671558, 45.70048],
+              [122.650001, 45.731401],
+              [122.640761, 45.771072],
+              [122.603189, 45.778169],
+              [122.556378, 45.82156],
+              [122.522501, 45.786933],
+              [122.504639, 45.786933],
+              [122.496016, 45.85825],
+              [122.446125, 45.916986],
+              [122.362357, 45.917403],
+              [122.372828, 45.856166],
+              [122.337719, 45.859917],
+              [122.301379, 45.813218],
+              [122.253952, 45.7982],
+              [122.236705, 45.831569],
+              [122.200981, 45.857],
+              [122.091344, 45.882002],
+              [122.085184, 45.912406],
+              [122.040221, 45.959022],
+              [121.92812, 45.988552],
+              [121.923808, 46.004767],
+              [121.864062, 46.002272],
+              [121.843736, 46.024301],
+              [121.819098, 46.023054],
+              [121.761816, 45.998947],
+              [121.809243, 45.961102],
+              [121.821562, 45.918235],
+              [121.805548, 45.900746],
+              [121.817251, 45.875336],
+              [121.769823, 45.84366],
+              [121.766744, 45.830318],
+              [121.754425, 45.794862],
+              [121.697142, 45.76314],
+              [121.657106, 45.770238],
+              [121.644172, 45.752284],
+              [121.666345, 45.727641],
+              [121.713773, 45.701734],
+              [121.811091, 45.687103],
+              [121.812323, 45.704659],
+              [121.867142, 45.719703],
+              [121.934279, 45.71051],
+              [121.970004, 45.692956],
+              [122.003264, 45.623102],
+              [121.995873, 45.59882],
+              [121.966308, 45.596308],
+              [121.993409, 45.552741],
+              [122.002648, 45.507882],
+              [122.064242, 45.472641],
+              [122.168336, 45.439897],
+              [122.180039, 45.409655],
+              [122.146778, 45.374352],
+              [122.147394, 45.295682],
+              [122.239169, 45.276313],
+              [122.22993, 45.206784],
+              [122.192358, 45.180636],
+              [122.143082, 45.183167],
+              [122.109822, 45.142236],
+              [122.119677, 45.068739],
+              [122.098735, 45.02138],
+              [122.074713, 45.006573],
+              [122.087032, 44.95281],
+              [122.079025, 44.914256],
+              [122.04946, 44.912985],
+              [122.098119, 44.81882],
+              [122.099967, 44.7823],
+              [122.168952, 44.770405],
+              [122.142467, 44.753833],
+              [122.110438, 44.767856],
+              [122.10243, 44.736406],
+              [122.152322, 44.744057],
+              [122.161561, 44.728328],
+              [122.117213, 44.701961],
+              [122.103046, 44.67388],
+              [122.113517, 44.615546],
+              [122.13138, 44.577619],
+              [122.196053, 44.559712],
+              [122.224386, 44.526016],
+              [122.228082, 44.480345],
+              [122.28598, 44.477783],
+              [122.294604, 44.41113],
+              [122.291524, 44.310152],
+              [122.271198, 44.255741],
+              [122.319241, 44.233018],
+              [122.483081, 44.236877],
+              [122.515726, 44.251025],
+              [122.641993, 44.283595],
+              [122.675254, 44.285738],
+              [122.702971, 44.319145],
+              [122.76087, 44.369648],
+              [122.85634, 44.398304],
+              [123.025108, 44.493153],
+              [123.06576, 44.505959],
+              [123.12489, 44.5098],
+              [123.137209, 44.486322],
+              [123.125506, 44.455147],
+              [123.142136, 44.428228],
+              [123.114419, 44.40258],
+              [123.128585, 44.367081],
+              [123.196955, 44.34483],
+              [123.277027, 44.25274],
+              [123.286882, 44.211574],
+              [123.323838, 44.179823],
+              [123.386664, 44.161794],
+              [123.362642, 44.133452],
+              [123.350939, 44.092633],
+              [123.32815, 44.084035],
+              [123.331229, 44.028984],
+              [123.365722, 44.013922],
+              [123.400831, 43.979481],
+              [123.37065, 43.970006],
+              [123.397135, 43.954929],
+              [123.467968, 43.853599],
+              [123.461809, 43.822518],
+              [123.498149, 43.771114],
+              [123.48275, 43.737396],
+              [123.520323, 43.708419],
+              [123.518475, 43.682024],
+              [123.536953, 43.633964],
+              [123.510468, 43.624867],
+              [123.5117, 43.592801],
+              [123.421157, 43.598435],
+              [123.434091, 43.575461],
+              [123.461193, 43.568523],
+              [123.452569, 43.545971],
+              [123.360179, 43.567223],
+              [123.304744, 43.550742],
+              [123.329998, 43.519071],
+              [123.315831, 43.492159],
+              [123.36449, 43.483475],
+              [123.382968, 43.469143],
+              [123.419925, 43.410046],
+              [123.442098, 43.437863],
+              [123.486446, 43.44525],
+              [123.519707, 43.402219],
+              [123.54496, 43.415262],
+              [123.608402, 43.366119],
+              [123.703873, 43.37047],
+              [123.698329, 43.272071],
+              [123.664453, 43.264663],
+              [123.676771, 43.223684],
+              [123.645974, 43.208855],
+              [123.666916, 43.179623],
+              [123.636119, 43.141644],
+              [123.631192, 43.088346],
+              [123.580685, 43.036314],
+              [123.572678, 43.003498],
+              [123.536337, 43.007],
+              [123.474743, 43.042438],
+              [123.434707, 43.027565],
+              [123.323222, 43.000872],
+              [123.259165, 42.993431],
+              [123.18402, 42.925983],
+              [123.188947, 42.895739],
+              [123.169853, 42.859777],
+              [123.227752, 42.831695],
+              [123.118114, 42.801405],
+              [123.058368, 42.768903],
+              [122.980144, 42.777689],
+              [122.945651, 42.753524],
+              [122.925941, 42.772417],
+              [122.887137, 42.770221],
+              [122.883442, 42.751766],
+              [122.848949, 42.712203],
+              [122.786123, 42.757479],
+              [122.73808, 42.77066],
+              [122.733152, 42.786034],
+              [122.653696, 42.78252],
+              [122.624747, 42.773296],
+              [122.580399, 42.789987],
+              [122.576088, 42.819405],
+              [122.556378, 42.827745],
+              [122.436886, 42.843105],
+              [122.35127, 42.830378],
+              [122.371596, 42.776371],
+              [122.439349, 42.770221],
+              [122.460907, 42.755282],
+              [122.396234, 42.707366],
+              [122.396234, 42.684054],
+              [122.338951, 42.669975],
+              [122.324785, 42.684934],
+              [122.261343, 42.695931],
+              [122.204676, 42.732867],
+              [122.204676, 42.685374],
+              [122.160945, 42.684934],
+              [122.072865, 42.710444],
+              [122.062394, 42.723635],
+              [122.018663, 42.69901],
+              [121.939207, 42.688453],
+              [121.94167, 42.666014],
+              [121.915801, 42.656332],
+              [121.921344, 42.605697],
+              [121.889931, 42.556784],
+              [121.844352, 42.522389],
+              [121.831417, 42.533856],
+              [121.817867, 42.504303],
+              [121.803084, 42.514891],
+              [121.747649, 42.484887],
+              [121.69899, 42.438529],
+              [121.66573, 42.437204],
+              [121.604136, 42.495037],
+              [121.607831, 42.516214],
+              [121.570875, 42.487093],
+              [121.506201, 42.482239],
+              [121.4791, 42.49636],
+              [121.434752, 42.475176],
+              [121.386093, 42.474294],
+              [121.304789, 42.435879],
+              [121.314644, 42.42837],
+              [121.285079, 42.387717],
+              [121.218558, 42.371802],
+              [121.184681, 42.333324],
+              [121.133558, 42.300135],
+              [121.120623, 42.280656],
+              [121.087978, 42.278885],
+              [121.070732, 42.254083],
+              [121.028848, 42.242565],
+              [120.992508, 42.264714],
+              [120.933994, 42.27977],
+              [120.883487, 42.269585],
+              [120.883487, 42.242565],
+              [120.8299, 42.252755],
+              [120.820661, 42.227943],
+              [120.79048, 42.218636],
+              [120.745516, 42.223512],
+              [120.72211, 42.203565],
+              [120.624792, 42.154338],
+              [120.58414, 42.167203],
+              [120.56751, 42.152119],
+              [120.466496, 42.105516],
+              [120.493597, 42.073539],
+              [120.450481, 42.057101],
+              [120.456641, 42.016208],
+              [120.399358, 41.984631],
+              [120.373489, 41.994862],
+              [120.309431, 41.951704],
+              [120.318054, 41.93746],
+              [120.271859, 41.925439],
+              [120.260156, 41.904062],
+              [120.290337, 41.897381],
+              [120.286641, 41.880005],
+              [120.251533, 41.884016],
+              [120.215808, 41.853265],
+              [120.188707, 41.848361],
+              [120.183164, 41.826513],
+              [120.127113, 41.77253],
+              [120.1382, 41.729221],
+              [120.096316, 41.697056],
+              [120.035954, 41.708226],
+              [120.024867, 41.737707],
+              [120.050737, 41.776101],
+              [120.041498, 41.818932],
+              [120.023019, 41.816701],
+              [119.989759, 41.899163],
+              [119.954034, 41.923212],
+              [119.950954, 41.974399],
+              [119.924469, 41.98908],
+              [119.921389, 42.014429],
+              [119.897368, 42.030879],
+              [119.87581, 42.077982],
+              [119.845629, 42.097079],
+              [119.837622, 42.135257],
+              [119.854868, 42.170308],
+              [119.841933, 42.215534],
+              [119.744615, 42.211545],
+              [119.679941, 42.240793],
+              [119.617115, 42.252755],
+              [119.609108, 42.276671],
+              [119.557985, 42.289068],
+              [119.539507, 42.297922],
+              [119.571536, 42.335536],
+              [119.572152, 42.359421],
+              [119.540123, 42.363401],
+              [119.502551, 42.388159],
+              [119.482841, 42.347037],
+              [119.432949, 42.317396],
+              [119.34795, 42.300578],
+              [119.280197, 42.260728],
+              [119.274037, 42.239021],
+              [119.237697, 42.200905],
+              [119.277733, 42.185387],
+              [119.286972, 42.154781],
+              [119.30853, 42.147239],
+              [119.314689, 42.119723],
+              [119.352261, 42.118391],
+              [119.384906, 42.08953],
+              [119.375667, 42.023322],
+              [119.324544, 41.969505],
+              [119.323928, 41.937014],
+              [119.340559, 41.926774],
+              [119.323312, 41.889807],
+              [119.334399, 41.871539],
+              [119.312841, 41.80555],
+              [119.292515, 41.790827],
+              [119.317769, 41.764049],
+              [119.319001, 41.727435],
+              [119.299907, 41.705545],
+              [119.307914, 41.657273],
+              [119.342406, 41.617914],
+              [119.415703, 41.590169],
+              [119.420015, 41.567785],
+              [119.362116, 41.566442],
+              [119.361501, 41.545841],
+              [119.406464, 41.503276],
+              [119.401537, 41.472343],
+              [119.378131, 41.459787],
+              [119.376283, 41.422102],
+              [119.309762, 41.405944],
+              [119.330704, 41.385293],
+              [119.296211, 41.325097],
+              [119.239545, 41.31431],
+              [119.211827, 41.308016],
+              [119.197661, 41.282837],
+              [119.168712, 41.294978],
+              [119.092951, 41.293629],
+              [118.980234, 41.305769],
+              [118.949437, 41.317906],
+              [118.890923, 41.300823],
+              [118.844727, 41.342622],
+              [118.843496, 41.374516],
+              [118.770199, 41.352956],
+              [118.741866, 41.324198],
+              [118.677192, 41.35026],
+              [118.629765, 41.346666],
+              [118.528135, 41.355202],
+              [118.412338, 41.331838],
+              [118.380309, 41.312062],
+              [118.348896, 41.342622],
+              [118.361215, 41.384844],
+              [118.348896, 41.428384],
+              [118.327338, 41.450816],
+              [118.271904, 41.471446],
+              [118.315636, 41.512688],
+              [118.302701, 41.55256],
+              [118.215237, 41.59554],
+              [118.206614, 41.650566],
+              [118.159187, 41.67605],
+              [118.155491, 41.712694],
+              [118.132702, 41.733241],
+              [118.140093, 41.784134],
+              [118.178281, 41.814917],
+              [118.236179, 41.80778],
+              [118.247266, 41.773869],
+              [118.29223, 41.772976],
+              [118.335346, 41.845241],
+              [118.340273, 41.87243],
+              [118.268824, 41.930336],
+              [118.306396, 41.940131],
+              [118.313788, 41.98819],
+              [118.291614, 42.007759],
+              [118.239875, 42.024655],
+              [118.286686, 42.033991],
+              [118.296541, 42.057545],
+              [118.27252, 42.083312],
+              [118.239259, 42.092639],
+              [118.212774, 42.081091],
+              [118.220165, 42.058434],
+              [118.194296, 42.031324],
+              [118.116687, 42.037102],
+              [118.155491, 42.081091],
+              [118.097593, 42.105072],
+              [118.089586, 42.12283],
+              [118.106216, 42.172082],
+              [118.033535, 42.199132],
+              [117.977485, 42.229716],
+              [117.974405, 42.25054],
+              [118.047702, 42.280656],
+              [118.060021, 42.298364],
+              [118.008898, 42.346595],
+              [118.024296, 42.385064],
+              [117.997811, 42.416884],
+              [117.874007, 42.510038],
+              [117.856761, 42.539148],
+              [117.797631, 42.585431],
+              [117.801326, 42.612744],
+              [117.779768, 42.61847],
+              [117.708935, 42.588515],
+              [117.667051, 42.582347],
+              [117.60053, 42.603054],
+              [117.537088, 42.603054],
+              [117.530313, 42.590278],
+              [117.475494, 42.602613],
+              [117.435458, 42.585431],
+              [117.434226, 42.557224],
+              [117.387415, 42.517537],
+              [117.410205, 42.519743],
+              [117.413284, 42.471645],
+              [117.390495, 42.461933],
+              [117.332596, 42.46105],
+              [117.275314, 42.481797],
+              [117.188467, 42.468114],
+              [117.135496, 42.468996],
+              [117.09546, 42.484004],
+              [117.080061, 42.463699],
+              [117.01662, 42.456193],
+              [117.009228, 42.44957],
+              [117.005533, 42.43367],
+              [116.99075, 42.425719],
+              [116.974736, 42.426603],
+              [116.97104, 42.427486],
+              [116.944555, 42.415116],
+              [116.936547, 42.410256],
+              [116.921765, 42.403628],
+              [116.910062, 42.395231],
+              [116.910678, 42.394789],
+              [116.886656, 42.366496],
+              [116.897743, 42.297479],
+              [116.918685, 42.229716],
+              [116.903287, 42.190708],
+              [116.789338, 42.200462],
+              [116.825062, 42.155669],
+              [116.850316, 42.156556],
+              [116.890352, 42.092639],
+              [116.879881, 42.018431],
+              [116.796113, 41.977958],
+              [116.748686, 41.984186],
+              [116.727744, 41.951259],
+              [116.66923, 41.947698],
+              [116.639049, 41.929891],
+              [116.597165, 41.935679],
+              [116.553433, 41.928555],
+              [116.510933, 41.974399],
+              [116.4826, 41.975734],
+              [116.453651, 41.945917],
+              [116.393289, 41.942802],
+              [116.414231, 41.982407],
+              [116.373579, 42.009983],
+              [116.310137, 41.997086],
+              [116.298434, 41.96817],
+              [116.223906, 41.932562],
+              [116.212819, 41.885352],
+              [116.194341, 41.861734],
+              [116.122892, 41.861734],
+              [116.106877, 41.831419],
+              [116.129051, 41.805996],
+              [116.09887, 41.776547],
+              [116.034196, 41.782795],
+              [116.007095, 41.79752],
+              [116.007095, 41.797966],
+              [116.007095, 41.79752],
+              [116.007095, 41.797966],
+              [115.994776, 41.828743],
+              [115.954124, 41.874213],
+              [115.916552, 41.945027],
+              [115.85311, 41.927665],
+              [115.834632, 41.93835],
+              [115.811226, 41.912525],
+              [115.726227, 41.870202],
+              [115.688038, 41.867528],
+              [115.654162, 41.829189],
+              [115.57409, 41.80555],
+              [115.519887, 41.76762],
+              [115.488474, 41.760924],
+              [115.42996, 41.728775],
+              [115.346808, 41.712247],
+              [115.319091, 41.691693],
+              [115.360975, 41.661297],
+              [115.345576, 41.635807],
+              [115.377605, 41.603148],
+              [115.310468, 41.592854],
+              [115.290142, 41.622835],
+              [115.26612, 41.616124],
+              [115.256881, 41.580768],
+              [115.20391, 41.571367],
+              [115.195287, 41.602253],
+              [115.0992, 41.62373],
+              [115.056085, 41.602253],
+              [115.016049, 41.615229],
+              [114.860832, 41.60091],
+              [114.895325, 41.636255],
+              [114.902716, 41.695715],
+              [114.89594, 41.76762],
+              [114.868839, 41.813579],
+              [114.922426, 41.825175],
+              [114.939056, 41.846132],
+              [114.923658, 41.871093],
+              [114.915035, 41.960605],
+              [114.9021, 42.015763],
+              [114.860832, 42.054879],
+              [114.86268, 42.097967],
+              [114.825723, 42.139695],
+              [114.79431, 42.149457],
+              [114.789383, 42.130819],
+              [114.75489, 42.115727],
+              [114.675434, 42.12061],
+              [114.647717, 42.109512],
+              [114.560254, 42.132595],
+              [114.510978, 42.110844],
+              [114.502355, 42.06732],
+              [114.480181, 42.064654],
+              [114.467863, 42.025989],
+              [114.511594, 41.981962],
+              [114.478334, 41.951704],
+              [114.419203, 41.942356],
+              [114.352066, 41.953484],
+              [114.343443, 41.926774],
+              [114.282465, 41.863517],
+              [114.200545, 41.789934],
+              [114.215328, 41.75646],
+              [114.206704, 41.7386],
+              [114.237501, 41.698843],
+              [114.215328, 41.68499],
+              [114.259059, 41.623282],
+              [114.226414, 41.616572],
+              [114.221487, 41.582111],
+              [114.230726, 41.513584],
+              [114.101379, 41.537779],
+              [114.032394, 41.529715],
+              [113.976959, 41.505966],
+              [113.953553, 41.483553],
+              [113.933227, 41.487139],
+              [113.919677, 41.454404],
+              [113.877793, 41.431076],
+              [113.871017, 41.413126],
+              [113.94493, 41.392477],
+              [113.92522, 41.325546],
+              [113.899351, 41.316108],
+              [113.914749, 41.294529],
+              [113.95109, 41.282837],
+              [113.971416, 41.239649],
+              [113.992357, 41.269794],
+              [114.016379, 41.231999],
+              [113.996669, 41.19238],
+              [113.960945, 41.171211],
+              [113.920293, 41.172112],
+              [113.877793, 41.115777],
+              [113.819279, 41.09774],
+              [113.868554, 41.06887],
+              [113.973263, 40.983087],
+              [113.994821, 40.938798],
+              [114.057647, 40.925234],
+              [114.041633, 40.917546],
+              [114.055183, 40.867782],
+              [114.073661, 40.857372],
+              [114.044712, 40.830661],
+              [114.080437, 40.790348],
+              [114.104458, 40.797597],
+              [114.103227, 40.770861],
+              [114.134639, 40.737314],
+              [114.084748, 40.729605],
+              [114.063806, 40.706925],
+              [114.07243, 40.679246],
+              [114.041633, 40.608861],
+              [114.076741, 40.575686],
+              [114.080437, 40.547952],
+              [114.061959, 40.52885],
+              [114.011452, 40.515657],
+              [113.948626, 40.514747],
+              [113.890112, 40.466503],
+              [113.850691, 40.460583],
+              [113.794641, 40.517932],
+              [113.763228, 40.473787],
+              [113.688699, 40.448288],
+              [113.559968, 40.348476],
+              [113.500222, 40.334335],
+              [113.387505, 40.319279],
+              [113.316672, 40.319736],
+              [113.27602, 40.388601],
+              [113.251382, 40.413211],
+              [113.083231, 40.374925],
+              [113.03334, 40.368997],
+              [112.898449, 40.329317],
+              [112.848558, 40.206937],
+              [112.744464, 40.167161],
+              [112.712436, 40.178593],
+              [112.6299, 40.235725],
+              [112.511639, 40.269068],
+              [112.456205, 40.300112],
+              [112.418017, 40.295091],
+              [112.349031, 40.257194],
+              [112.310227, 40.256281],
+              [112.299756, 40.21105],
+              [112.232619, 40.169905],
+              [112.232003, 40.133311],
+              [112.183344, 40.083877],
+              [112.182112, 40.061437],
+              [112.142076, 40.027076],
+              [112.133453, 40.001866],
+              [112.07617, 39.919298],
+              [112.042294, 39.886243],
+              [112.012729, 39.827438],
+              [111.970229, 39.796638],
+              [111.959758, 39.692642],
+              [111.925265, 39.66731],
+              [111.9382, 39.623071],
+              [111.87907, 39.606013],
+              [111.842729, 39.620305],
+              [111.783599, 39.58895],
+              [111.722621, 39.606013],
+              [111.707839, 39.621227],
+              [111.646245, 39.644272],
+              [111.61668, 39.633211],
+              [111.525521, 39.662242],
+              [111.497187, 39.661781],
+              [111.445448, 39.640124],
+              [111.460847, 39.606935],
+              [111.441137, 39.59679],
+              [111.422043, 39.539123],
+              [111.431282, 39.508656],
+              [111.385086, 39.489722],
+              [111.358601, 39.432428],
+              [111.287152, 39.417173],
+              [111.171971, 39.423183],
+              [111.143022, 39.407926],
+              [111.125776, 39.366297]
+            ]
+          ]
+        ]
+      }
+    }
+  ]
+}

BIN
public/model/glft/compass.glb


BIN
public/texture/alarm.png


BIN
public/texture/compass.png


BIN
public/texture/earth.jpg


BIN
src/assets/images/company/hang.png


BIN
src/assets/images/company/home/select-bg.png


BIN
src/assets/images/company/home/unselect-bg.png


BIN
src/assets/images/company/people.png


BIN
src/assets/images/home-container/device/wasichoucaig.png


+ 953 - 0
src/views/vent/home/clique/components/3Dmap/3dMap.ts

@@ -0,0 +1,953 @@
+import * as THREE from 'three';
+import * as d3 from 'd3';
+import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
+import { CSS2DRenderer, CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js';
+import gsap from 'gsap';
+import { gradientColors } from '/@/utils/threejs/util';
+import * as dat from 'dat.gui';
+import { FontLoader } from 'three/examples/jsm/loaders/FontLoader.js';
+import { TextGeometry } from 'three/examples/jsm/geometries/TextGeometry.js';
+
+const gui = new dat.GUI();
+gui.domElement.style = 'position:absolute;top:100px;left:10px;z-index:99999999999999';
+
+class earthtMap {
+  container: HTMLCanvasElement | null; //canvas 容器
+  labelRenderer: CSS2DRenderer | null = null;
+  camera: THREE.PerspectiveCamera | null = null; // 相机
+  scene: THREE.Scene | null = null;
+  renderer: THREE.WebGLRenderer | null = null;
+  controller: OrbitControls | null = null;
+  map = new THREE.Object3D();
+  provinceArr = <THREE.Mesh[]>[];
+  locationCylinderMeshArr = <THREE.Mesh[]>[];
+  locationCylinderGroup = new THREE.Object3D();
+  locationNameBgArr = <THREE.Mesh[]>[];
+  locationNameArr = <THREE.Mesh[]>[];
+  raycaster = new THREE.Raycaster();
+  mouse = new THREE.Vector2();
+  tooltip: HTMLElement | null; //canvas 容器
+  detailModalCSS2Obj: CSS2DObject | null = null;
+  mapConfig = {
+    deep: 0.2,
+  };
+  projection = d3.geoMercator().center([109.741193, 42.290162]).scale(90).translate([-1, -6]); // 根据地球贴图做轻微调整
+  cameraPosArr = [{ x: 0, y: -2.0, z: 4.8 }];
+  mapEdgeLightObj = {
+    mapEdgePoints: <number[][]>[],
+    lightOpacityGeometry: new THREE.BufferGeometry(), // 单独把geometry提出来,动画用
+    lightSpeed: 3, // 边缘流光参数
+    lightCurrentPos: 0,
+    lightOpacitys: null,
+  };
+  fontMaterial3 = new THREE.MeshBasicMaterial({ color: 0x00dbff, transparent: true, opacity: 0.5 });
+  fontMaterial0 = new THREE.MeshBasicMaterial({ color: 0xffffff });
+  fontMaterial1 = new THREE.MeshBasicMaterial({ color: 0xf7ff00 });
+  fontMaterial2 = new THREE.MeshBasicMaterial({ color: 0xf7ff00, transparent: true, opacity: 0, depthTest: true, depthWrite: true });
+  playerStartClickTime = new Date().getTime();
+  constructor(canvasSelector, tooltip) {
+    this.container = document.getElementById(canvasSelector) as HTMLCanvasElement;
+    this.tooltip = document.getElementById(tooltip) as HTMLElement;
+  }
+
+  init() {
+    this.setScene();
+    this.setCamera();
+    this.setRenderer(); // 创建渲染器对象
+    this.setController(); // 创建控件对象
+    this.loadMapData();
+    this.loadMapData1();
+    this.addCompass();
+    this.setEarth();
+    this.setLight();
+    this.setRaycaster();
+    // this.animate();
+  }
+
+  setScene() {
+    //  创建场景对象Scene
+    this.scene = new THREE.Scene();
+    this.scene.rotateZ(Math.PI);
+  }
+
+  setCamera() {
+    // 第二参数就是 长度和宽度比 默认采用浏览器  返回以像素为单位的窗口的内部宽度和高度
+    this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 500);
+
+    this.camera.position.set(0.3909238439719087, -16.078364444489004, 3.748569090055743); // 0, -5, 1
+    this.camera.lookAt(this.scene.position);
+    // this.camera.lookAt(new THREE.Vector3(0, 1, 0)); // 0, 0, 0
+  }
+
+  setRenderer() {
+    if (!this.container) return;
+    this.renderer = new THREE.WebGLRenderer({
+      antialias: true,
+      // alpha: true,
+      // precision: 'mediump',
+      // logarithmicDepthBuffer: true, // 是否使用对数深度缓存
+    });
+    this.renderer.sortObjects = true;
+    this.renderer.setSize(this.container.clientWidth, this.container.clientHeight);
+    this.renderer.setPixelRatio(window.devicePixelRatio);
+    // this.renderer.sortObjects = false;  // 是否需要对对象排序
+    this.container.appendChild(this.renderer.domElement);
+    this.renderer.outputColorSpace = THREE.SRGBColorSpace;
+    // this.renderer.toneMapping = THREE.ACESFilmicToneMapping;
+
+    this.labelRenderer = new CSS2DRenderer();
+    this.labelRenderer.setSize(this.container.clientWidth, this.container.clientHeight);
+    this.labelRenderer.domElement.style.position = 'absolute';
+    this.labelRenderer.domElement.style.top = '0';
+    this.labelRenderer.domElement.style.pointerEvents = 'none';
+    this.container.appendChild(this.labelRenderer.domElement);
+  }
+
+  setController() {
+    if (this.camera && this.renderer && this.renderer.domElement) {
+      this.controller = new OrbitControls(this.camera, this.renderer.domElement);
+      // this.controller.minDistance = 2;
+      // this.controller.minDistance = 0.5;
+      // this.controller.maxDistance = 35.5; // 5.5
+
+      // 阻尼(惯性)
+      // this.controller.enableDamping = true;
+      // this.controller.dampingFactor = 0.04;
+
+      this.controller.minAzimuthAngle = -0.1;
+      this.controller.maxAzimuthAngle = 0.1;
+
+      this.controller.minPolarAngle = 0.01;
+      this.controller.maxPolarAngle = Math.PI - 0.01;
+
+      // 修改相机的lookAt是不会影响THREE.OrbitControls的target的
+      // this.controller.target = new THREE.Vector3(-0.9915, -1.5075, -1.8432);
+      this.controller.target = new THREE.Vector3(0, 0, -1);
+    }
+  }
+
+  // 辅助线
+  addHelper() {
+    // let helper = new THREE.CameraHelper(this.camera);
+    // this.scene.add(helper);
+
+    //轴辅助 (每一个轴的长度)
+    const axisHelper = new THREE.AxisHelper(150); // 红线是X轴,绿线是Y轴,蓝线是Z轴
+    // this.scene.add(axisHelper);
+
+    const gridHelper = new THREE.GridHelper(100, 30, 0x2c2c2c, 0x888888);
+    // this.scene.add(gridHelper);
+  }
+
+  setLight() {
+    const ambientLight = new THREE.AmbientLight(0x999999, 2);
+    this.scene?.add(ambientLight);
+    // // 平行光
+    const directionalLight = new THREE.DirectionalLight(0xffffff, 2.0);
+    this.scene?.add(directionalLight);
+
+    // 聚光光源 - 照模型
+    const spotLight = new THREE.SpotLight(0xffffff, 2);
+    spotLight.position.set(0.62, 10.0, 2.78);
+    spotLight.castShadow = true;
+    this.scene?.add(spotLight);
+    // 聚光光源辅助线
+    // const spotLightHelper = new THREE.SpotLightHelper(spotLight);
+    // this.scene?.add(spotLightHelper);
+    // 点光源 - 照模型
+    const test = new THREE.PointLight('#ffffff', 1.2, 20);
+    test.position.set(-0.39, -0.93, 0.64);
+    this.scene?.add(test);
+    // const testHelperMap = new THREE.PointLightHelper(test);
+    // this.scene?.add(testHelperMap);
+
+    // 点光源 - 蓝色照地球
+    const pointLightMap = new THREE.PointLight('#4161ff', 1.4, 20);
+    pointLightMap.position.set(-0.18, -1.19, 1.5);
+    this.scene?.add(pointLightMap);
+    // const spotLightHelperMap = new THREE.PointLightHelper(pointLightMap);
+    // this.scene?.add(spotLightHelperMap);
+  }
+  // 加载地图数据
+  loadMapData() {
+    const loader = new THREE.FileLoader();
+    loader.load('/json/vent3.json', async (data: string) => {
+      const jsondata = JSON.parse(data);
+      await this.addMapGeometry(jsondata);
+    });
+  }
+  loadMapData1() {
+    const loader = new THREE.FileLoader();
+    loader.load('/json/vent2.json', (data: string) => {
+      const jsondata = JSON.parse(data);
+      this.addMapGeometry1(jsondata);
+    });
+  }
+
+  addCompass() {}
+
+  addMapGeometry1(jsondata) {
+    // 墨卡托投影转换
+
+    jsondata.features.forEach((elem) => {
+      // 定一个省份3D对象
+      const province = new THREE.Object3D();
+      // 每个的 坐标 数组
+      const coordinates = elem.geometry.coordinates;
+      // 循环坐标数组
+      coordinates.forEach((multiPolygon) => {
+        multiPolygon.forEach((polygon) => {
+          const shape = new THREE.Shape();
+          const lineMaterial = new THREE.LineBasicMaterial({
+            color: '#A2A2A2',
+            transparent: true,
+            opacity: 0.3,
+            linewidth: 1,
+            linecap: 'round', //ignored by WebGLRenderer
+            linejoin: 'round', //ignored by WebGLRenderer
+          });
+          // const lineGeometry = new THREE.Geometry();
+          // for (let i = 0; i < polygon.length; i++) {
+          //   const [x, y] = projection(polygon[i]);
+          //   if (i === 0) {
+          //     shape.moveTo(x, -y);
+          //   }
+          //   shape.lineTo(x, -y);
+          //   lineGeometry.vertices.push(new THREE.Vector3(x, -y, 3));
+          // }
+          const lineGeometry = new THREE.BufferGeometry();
+          const pointsArray = <any[]>[];
+          for (let i = 0; i < polygon.length; i++) {
+            const [x, y] = this.projection(polygon[i]);
+            if (i === 0) {
+              shape.moveTo(x, -y);
+            }
+            shape.lineTo(x, -y);
+            pointsArray.push(new THREE.Vector3(x, -y, 0.1));
+          }
+          // console.log(pointsArray);
+          lineGeometry.setFromPoints(pointsArray);
+
+          const extrudeSettings = {
+            depth: 0.01,
+            bevelEnabled: false, // 对挤出的形状应用是否斜角
+          };
+
+          const geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings);
+          const material = new THREE.MeshPhongMaterial({
+            color: '#3962DE',
+            transparent: true,
+            opacity: 0.1,
+            side: THREE.FrontSide,
+            // depthTest: true,
+          });
+          const material1 = new THREE.MeshLambertMaterial({
+            color: '#3BB2ED',
+            transparent: true,
+            opacity: 0.4,
+            side: THREE.FrontSide,
+            // wireframe: true
+          });
+          const mesh = new THREE.Mesh(geometry, [material, material1]);
+          const line = new THREE.Line(lineGeometry, lineMaterial);
+
+          // console.log(elem.properties);
+          province.add(mesh);
+          province.add(line);
+        });
+      });
+      // province.scale.set(5, 5, 0);
+      // province.position.set(0, 0, 0);
+      // console.log(province);
+      this.scene?.add(province);
+    });
+  }
+  // 地图模型
+  async addMapGeometry(jsondata) {
+    const _self = this;
+    const loader = new FontLoader();
+    const font = await loader.loadAsync('/font/STSong_Regular.json');
+    jsondata.features.forEach((elem) => {
+      // 定一个省份3D对象
+      const province = new THREE.Object3D();
+      // 每个的 坐标 数组
+      const coordinates = elem.geometry.coordinates;
+      // 循环坐标数组
+      coordinates.forEach((multiPolygon) => {
+        multiPolygon.forEach(async (polygon) => {
+          const shape = new THREE.Shape();
+          const lineMaterial = new THREE.LineBasicMaterial({
+            color: '#3EFFED',
+            // linewidth: 1,
+            linecap: 'round', //ignored by WebGLRenderer
+            linejoin: 'round', //ignored by WebGLRenderer
+          });
+          // const lineGeometry = new THREE.Geometry();
+          // for (let i = 0; i < polygon.length; i++) {
+          //   const [x, y] = projection(polygon[i]);
+          //   if (i === 0) {
+          //     shape.moveTo(x, -y);
+          //   }
+          //   shape.lineTo(x, -y);
+          //   lineGeometry.vertices.push(new THREE.Vector3(x, -y, 3));
+          // }
+          const lineGeometry = new THREE.BufferGeometry();
+          const pointsArray = <any[]>[];
+          for (let i = 0; i < polygon.length; i++) {
+            const [x, y] = this.projection(polygon[i]);
+            if (i === 0) {
+              shape.moveTo(x, -y);
+            }
+            shape.lineTo(x, -y);
+            pointsArray.push(new THREE.Vector3(x, -y, this.mapConfig.deep));
+
+            // 做边缘流光效果,把所有点保存下来
+            this.mapEdgeLightObj.mapEdgePoints.push([x, -y, this.mapConfig.deep]);
+          }
+          // console.log(pointsArray);
+          lineGeometry.setFromPoints(pointsArray);
+
+          const extrudeSettings = {
+            depth: this.mapConfig.deep,
+            bevelEnabled: true, // 对挤出的形状应用是否斜角
+            bevelSegments: 0,
+            bevelThickness: 0.1,
+          };
+
+          const geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings);
+          const material = new THREE.MeshPhongMaterial({
+            color: '#3962DE',
+            transparent: true,
+            opacity: 0.4,
+            side: THREE.FrontSide,
+            // depthTest: true,
+          });
+          let material1 = new THREE.MeshBasicMaterial({
+            polygonOffset: true,
+            polygonOffsetFactor: 1,
+            polygonOffsetUnits: 1,
+            metalness: 1,
+            roughness: 1,
+            color: '#3EC9FF',
+            transparent: true,
+            opacity: 0.6,
+            side: THREE.FrontSide,
+            // wireframe: true
+          });
+          material1 = this.createSideShaderMaterial(material1);
+          const mesh = new THREE.Mesh(geometry, [material, material1]);
+          mesh.name = 'locationShape';
+          const line = new THREE.Line(lineGeometry, lineMaterial);
+          // 将省份的属性 加进来
+          province['properties'] = elem.properties;
+
+          // 将城市信息放到模型中,后续做动画用
+          if (elem.properties.centroid) {
+            const [x, y] = this.projection(elem.properties.centroid); // uv映射坐标
+            province['properties']['_centroid'] = [x, y];
+
+            const textGeometry = new TextGeometry(province['properties']['name'], {
+              font: font,
+              size: 0.05, //字体大小
+              height: 0.005, //字体高度curveSegments: 12,
+              bevelEnabled: true,
+              bevelSize: 0.001,
+              bevelOffset: 0,
+              bevelSegments: 0,
+            });
+            const textMesh = new THREE.Mesh(textGeometry, this.fontMaterial3);
+            textMesh.scale.set(1, 1, 1);
+            textMesh.position.set(x, -y, this.mapConfig.deep + 0.01);
+            textMesh.rotateZ(-Math.PI);
+            province.add(textMesh);
+          }
+          this.provinceArr.push(mesh);
+          // console.log(elem.properties);
+          province.add(mesh);
+          province.add(line);
+        });
+      });
+      // province.scale.set(5, 5, 0);
+      // province.position.set(0, 0, 0);
+      // console.log(province);
+      this.map?.add(province);
+    });
+    this.setMapEdgeLight();
+    this.scene?.add(this.map);
+    setTimeout(() => {
+      _self.resetCameraTween();
+      // _self.setMaterial();
+    }, 1500);
+  }
+
+  setMapEdgeLight() {
+    // console.log(this.mapEdgeLightObj.mapEdgePoints);
+    const positions = new Float32Array(this.mapEdgeLightObj.mapEdgePoints.flat(1)); // 数组深度遍历扁平化
+    // console.log(positions);
+    this.mapEdgeLightObj.lightOpacityGeometry = new THREE.BufferGeometry();
+    // 设置顶点
+    this.mapEdgeLightObj.lightOpacityGeometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
+    // 设置 粒子透明度为 0
+    this.mapEdgeLightObj.lightOpacitys = new Float32Array(positions.length).map(() => 0);
+    this.mapEdgeLightObj.lightOpacityGeometry.setAttribute('aOpacity', new THREE.BufferAttribute(this.mapEdgeLightObj.lightOpacitys, 1));
+
+    // 顶点着色器
+    const vertexShader = `
+          attribute float aOpacity;
+          uniform float uSize;
+          varying float vOpacity;
+
+          void main(){
+              gl_Position = projectionMatrix*modelViewMatrix*vec4(position,1.0);
+              gl_PointSize = uSize;
+
+              vOpacity=aOpacity;
+          }
+          `;
+    // 片段着色器
+    const fragmentShader = `
+          varying float vOpacity;
+          uniform vec3 uColor;
+
+          float invert(float n){
+              return 1.-n;
+          }
+
+          void main(){
+            if(vOpacity <=0.2){
+                discard;
+            }
+            vec2 uv=vec2(gl_PointCoord.x,invert(gl_PointCoord.y));
+            vec2 cUv=2.*uv-1.;
+            vec4 color=vec4(1./length(cUv));
+            color*=vOpacity;
+            color.rgb*=uColor;
+            gl_FragColor=color;
+          }
+          `;
+
+    const material = new THREE.ShaderMaterial({
+      vertexShader: vertexShader,
+      fragmentShader: fragmentShader,
+      transparent: true, // 设置透明
+      // blending: THREE.AdditiveBlending,
+      uniforms: {
+        uSize: {
+          value: 5.0,
+        },
+        uColor: {
+          value: new THREE.Color('#FAFFB7'), // 光点颜色 fffb85
+        },
+      },
+    });
+    // material.blending = THREE.AdditiveBlending;
+    const opacityPointsMesh = new THREE.Points(this.mapEdgeLightObj.lightOpacityGeometry, material);
+    this.scene?.add(opacityPointsMesh);
+  }
+
+  setTooltip(detailModalId) {
+    const _self = this;
+    const tooltipDom = document.getElementById(detailModalId) as HTMLElement;
+    this.detailModalCSS2Obj = new CSS2DObject(tooltipDom);
+    tooltipDom.addEventListener('click', (event: Event) => {
+      event.stopPropagation();
+    });
+    this.detailModalCSS2Obj.visible = false;
+    this.scene?.add(this.detailModalCSS2Obj);
+    const elements = tooltipDom.getElementsByClassName('close');
+    if (elements[0]) {
+      this.detailModalCSS2Obj.element.style.pointerEvents = 'auto';
+      elements[0].addEventListener('click', (event: Event) => {
+        event.stopPropagation();
+        console.log('---------------->', event, _self);
+        _self.detailModalCSS2Obj.visible = false;
+      });
+    }
+  }
+
+  async setTag(locationInfo: any[]) {
+    const loader = new FontLoader();
+    const font = await loader.loadAsync('/font/STSong_Regular.json');
+    const locationTexture = new THREE.TextureLoader().load('/texture/location4.png');
+
+    const colors = gradientColors('#FFDE00', '#F500FF', locationInfo.length, 1);
+    locationInfo.forEach((item, index) => {
+      const locationGroup = new THREE.Group();
+
+      const [x, y] = this.projection(item['value']);
+
+      const geometry = new THREE.CylinderGeometry(0.1, 0.0, 0.3, 3);
+
+      if (Math.random() * 10 > 5) {
+        const material = new THREE.MeshPhongMaterial({
+          // ShaderMaterial
+          // color: colors[index],
+          color: 0xff1f00,
+          side: THREE.DoubleSide,
+          // blending: THREE.AdditiveBlending,
+          transparent: true,
+          opacity: 0.8,
+        });
+        const cylinder = new THREE.Mesh(geometry, material);
+        cylinder.position.set(x, -y, this.mapConfig.deep + 0.08);
+        cylinder.rotateX(Math.PI / 2);
+        cylinder.scale.set(0.4, 0.4, 0.4);
+        cylinder['userData']['code'] = item['code'];
+        this.locationCylinderMeshArr.push(cylinder);
+        locationGroup.add(cylinder);
+      }
+
+      const circleGeometry = new THREE.PlaneGeometry(0.06, 0.06);
+      const circleMaterial = new THREE.MeshBasicMaterial({ map: locationTexture, side: THREE.DoubleSide, transparent: true });
+      const plane = new THREE.Mesh(circleGeometry, circleMaterial);
+      // plane['userData']['code'] = item['code'];
+      plane.position.set(x, -y, this.mapConfig.deep + 0.02);
+      plane.renderOrder = 999;
+      locationGroup.add(plane);
+
+      // 地名
+      const textGeometry = new TextGeometry(item['name'], {
+        font: font,
+        size: 0.05, //字体大小
+        height: 0.005, //字体高度curveSegments: 12,
+        bevelEnabled: true,
+        bevelSize: 0.001,
+        bevelOffset: 0,
+        bevelSegments: 0,
+      });
+      const textMesh = new THREE.Mesh(textGeometry, this.fontMaterial0);
+      textMesh.name = item['code'];
+      textMesh.scale.set(0.5, 0.5, 0.5);
+      textMesh.position.set(x - 0.1, -y + 0.01, this.mapConfig.deep + 0.035);
+      textMesh.rotateX(-Math.PI / 3);
+      textMesh.rotateZ(-Math.PI);
+      this.locationNameArr.push(textMesh);
+      locationGroup.add(textMesh);
+
+      textGeometry.computeBoundingBox();
+      const { max, min } = textGeometry.boundingBox;
+      const boxGeometry = new THREE.PlaneGeometry(Math.abs(max.x - min.x), Math.abs(max.y - min.y));
+      const boxMesh = new THREE.Mesh(boxGeometry, this.fontMaterial2);
+      boxMesh.rotateX(-Math.PI / 3);
+      boxMesh.rotateZ(-Math.PI);
+      boxMesh.position.set(x - Math.abs(max.x - min.x) + 0.018, -y + 0.01, this.mapConfig.deep + 0.03);
+      boxMesh.renderOrder = 1;
+      boxMesh['userData']['code'] = item['code'];
+
+      this.locationNameBgArr.push(boxMesh);
+
+      locationGroup.add(boxMesh);
+      this.locationCylinderGroup.add(locationGroup);
+      this.scene?.add(this.locationCylinderGroup);
+    });
+  }
+
+  animationLocation() {
+    this.locationCylinderMeshArr.forEach((mesh) => {
+      // console.log(mesh);
+      mesh.rotation.y -= 0.05;
+    });
+  }
+
+  makeTextSprite(message, parameters) {
+    if (parameters === undefined) parameters = {};
+
+    const fontface = parameters['fontface'];
+    const fontsize = parameters['fontsize'];
+    const fontColor = parameters['fontColor'];
+    const borderThickness = parameters['borderThickness'];
+    const borderColor = parameters['borderColor'];
+    const backgroundColor = parameters['backgroundColor'];
+
+    // var spriteAlignment = THREE.SpriteAlignment.topLeft;
+
+    const canvas = document.createElement('canvas');
+    const context = <CanvasRenderingContext2D>canvas.getContext('2d');
+    context.font = 'Bold ' + fontsize + 'px ' + fontface;
+
+    // get size data (height depends only on font size)
+    const metrics = context?.measureText(message);
+    const textWidth = metrics?.width;
+
+    // background color
+    context.fillStyle = 'rgba(' + backgroundColor.r + ',' + backgroundColor.g + ',' + backgroundColor.b + ',' + backgroundColor.a + ')';
+    // border color
+    context.strokeStyle = 'rgba(' + borderColor.r + ',' + borderColor.g + ',' + borderColor.b + ',' + borderColor.a + ')';
+
+    context.lineWidth = borderThickness;
+    // const painting = {
+    //   width: textWidth * 1.4 + borderThickness * 2,
+    //   height: fontsize * 1.4 + borderThickness * 2,
+    //   round: parameters['round'],
+    // };
+    const painting = {
+      width: textWidth,
+      height: fontsize * 1.4 + borderThickness * 2,
+      round: parameters['round'],
+    };
+    // 1.4 is extra height factor for text below baseline: g,j,p,q.
+    // context.fillRect(0, 0, painting.width, painting.height)
+    this.roundRect(context, borderThickness / 2, borderThickness / 2, painting.width, painting.height, painting.round);
+
+    // text color
+    context.fillStyle = 'rgba(' + fontColor.r + ',' + fontColor.g + ',' + fontColor.b + ',' + fontColor.a + ')';
+    context.textAlign = 'center';
+    context.textBaseline = 'middle';
+
+    context.fillText(message, painting.width / 2, painting.height / 2);
+
+    // canvas contents will be used for a texture
+    const texture = new THREE.Texture(canvas);
+    texture.needsUpdate = true;
+    const spriteMaterial = new THREE.SpriteMaterial({
+      map: texture,
+      depthTest: false, // 解决精灵谍影问题
+      // blending: THREE.AdditiveBlending,
+      // transparent: true,
+      // alignment: spriteAlignment
+    });
+    const sprite = new THREE.Sprite(spriteMaterial);
+    // sprite.scale.set(1, 1, 1);
+    return sprite;
+  }
+
+  // 城市 - 名称显示 - 样式
+  roundRect(ctx, x, y, w, h, r) {
+    ctx.beginPath();
+    ctx.moveTo(x + r, y);
+    ctx.lineTo(x + w - r, y);
+    ctx.quadraticCurveTo(x + w, y, x + w, y + r);
+    ctx.lineTo(x + w, y + h - r);
+    ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h);
+    ctx.lineTo(x + r, y + h);
+    ctx.quadraticCurveTo(x, y + h, x, y + h - r);
+    ctx.lineTo(x, y + r);
+    ctx.quadraticCurveTo(x, y, x + r, y);
+    ctx.closePath();
+    ctx.fill();
+    ctx.stroke();
+  }
+  // 地球贴图纹理
+  setEarth() {
+    const geometry = new THREE.PlaneGeometry(15.0, 15.0);
+    const texture = new THREE.TextureLoader().load('/texture/earth.jpg');
+    const bumpTexture = new THREE.TextureLoader().load('/texture/earth.jpg');
+    texture.encoding = THREE.sRGBEncoding;
+    const material = new THREE.MeshPhongMaterial({
+      map: texture, // 贴图
+      bumpMap: bumpTexture,
+      // normalMap: bumpTexture,
+      bumpScale: 1,
+      // specularMap: bumpTexture,
+      // specular: 0xffffff,
+      // shininess: 1,
+      // color: '#000000',
+      side: THREE.FrontSide,
+    });
+    const earthPlane = new THREE.Mesh(geometry, material);
+    this.scene?.add(earthPlane);
+  }
+  // 射线
+  setRaycaster() {
+    const _self = this;
+    let intersects = <any[]>[];
+    const eventAction = (event, object3DArr) => {
+      this.mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
+      this.mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
+      (this.raycaster as THREE.Raycaster).setFromCamera(this.mouse, this.camera as THREE.Camera);
+      intersects = this.raycaster?.intersectObjects(object3DArr, true) as THREE.Intersection[];
+    };
+
+    const onMouseMove = (event) => {
+      this.locationNameArr.forEach((item: THREE.Mesh) => {
+        if (item.material == this.fontMaterial1) {
+          item.material = this.fontMaterial0;
+          item.scale.set(0.5, 0.5, 0.5);
+        }
+      });
+      eventAction(event, this.locationNameBgArr);
+
+      if (this.detailModalCSS2Obj && !this.detailModalCSS2Obj.visible && intersects.length > 0 && this.detailModalCSS2Obj) {
+        const intersectObj = intersects[0].object as THREE.Mesh;
+        const point = intersects[0].point;
+        this.detailModalCSS2Obj.position.set(point.x, point.y, point.z);
+        this.detailModalCSS2Obj.applyMatrix4(this.scene.matrix);
+
+        if (intersectObj['userData'] && intersectObj['userData']['code']) {
+          const textMesh = this.locationCylinderGroup.getObjectByName(intersectObj['userData']['code']) as THREE.Mesh;
+          if (textMesh) {
+            textMesh.material = this.fontMaterial1;
+            textMesh.scale.set(1, 1, 1);
+          }
+        }
+      }
+    };
+
+    // 点击地图事件
+    const onClick = (event: Event) => {
+      event.preventDefault();
+      eventAction(event, [...this.provinceArr, ...this.locationNameBgArr]);
+      if (new Date().getTime() - this.playerStartClickTime < 400) {
+        // 双击
+        if (intersects.length > 0) {
+          const point = intersects[0].point;
+          const boxMaxY = new THREE.Box3().setFromObject(intersects[0].object).max.y;
+          this.mapClickAnimation(point, boxMaxY);
+        }
+      } else {
+        if (intersects.length > 0 && this.detailModalCSS2Obj) {
+          const detailMesh = intersects.find((item) => item?.object['userData'] && item.object['userData']['code']);
+          if (detailMesh) {
+            // 发送消息
+            this.detailModalCSS2Obj.visible = true;
+          }
+        }
+      }
+      console.log(this.camera, this.controller);
+      this.playerStartClickTime = new Date().getTime();
+    };
+
+    window.addEventListener('mousemove', onMouseMove, false);
+    window.addEventListener('click', onClick, false);
+  }
+  mapClickAnimation(pos, boxMaxY) {
+    const _self = this;
+    const distance = boxMaxY;
+    const angel = 90;
+    if (!this.controller || !this.camera) return;
+
+    //关闭控制器
+    this.controller.enabled = false;
+
+    const begin = {
+      x: this.camera.position.x,
+      y: this.camera.position.y,
+      z: this.camera.position.z,
+      x1: this.controller.target.x,
+      y1: this.controller.target.y,
+      z1: this.controller.target.z,
+    };
+    const end = {
+      x: pos.x,
+      y: pos.y + Math.cos(angel) * distance,
+      z: pos.z + Math.sin(angel) * distance,
+      x1: pos.x,
+      y1: pos.y,
+      z1: pos.z,
+    };
+
+    gsap.fromTo(
+      begin,
+      { ...begin },
+      {
+        ...end,
+        time: 500,
+        onUpdate(obj) {
+          if (_self.camera && _self.controller) {
+            _self.camera.position.x = obj.x;
+            _self.camera.position.y = obj.y;
+            _self.camera.position.z = obj.z;
+
+            _self.controller.target.set(obj.x1, obj.y1, obj.z1);
+            // 控制器更新
+            _self.controller.update();
+          }
+        },
+        onUpdateParams: [begin],
+        onComplete() {
+          if (_self.controller) _self.controller.enabled = true;
+        },
+      }
+    );
+  }
+  resetCameraTween() {
+    // eslint-disable-next-line @typescript-eslint/no-this-alias
+    const self = this;
+    if (this.controller && this.camera && this.cameraPosArr) {
+      //关闭控制器
+      this.controller.enabled = false;
+
+      const begin = {
+        x: this.camera.position.x,
+        y: this.camera.position.y,
+        z: this.camera.position.z,
+        x1: this.controller.target.x,
+        y1: this.controller.target.y,
+        z1: this.controller.target.z,
+      };
+      const end = {
+        x: 0.20986936323918032,
+        y: -0.7192585185669363,
+        z: 1.3178315065115611,
+        x1: 0.1943010027503315,
+        y1: 0.6831035409655225,
+        z1: -0.551271738125278,
+      };
+
+      gsap.fromTo(
+        begin,
+        { ...begin },
+        {
+          ...end,
+          duration: 1,
+          ease: 'easeOutBounce',
+          onUpdate(obj) {
+            self.camera.position.x = obj.x;
+            self.camera.position.y = obj.y;
+            self.camera.position.z = obj.z;
+
+            self.controller.target.x = obj.x1;
+            self.controller.target.y = obj.y1;
+            self.controller.target.z = obj.z1;
+
+            // self.camera.lookAt(0, 0, 0);
+
+            // 控制器更新
+            self.controller.update();
+          },
+          onUpdateParams: [begin],
+          onComplete() {
+            self.controller.enabled = true;
+          },
+        }
+      );
+    }
+  }
+
+  createSideShaderMaterial(material) {
+    material.onBeforeCompile = function (shader) {
+      // console.log(shader.fragmentShader);
+      shader.vertexShader = shader.vertexShader.replace(
+        `void main() {`,
+        `
+        varying vec4 vPosition; 
+        void main() {
+      `
+      );
+      shader.vertexShader = shader.vertexShader.replace(
+        `#include <fog_vertex>`,
+        `#include <fog_vertex> 
+         vPosition=modelMatrix * vec4( transformed, 1.0 );
+        `
+      );
+
+      shader.fragmentShader = shader.fragmentShader.replace(
+        `void main() {`,
+
+        `varying vec4 vPosition;
+         void main() {`
+      );
+
+      shader.fragmentShader = shader.fragmentShader.replace(
+        `#include <specularmap_fragment>`,
+        `
+        #include <specularmap_fragment>
+        float z = vPosition.z;
+        float s = step(5.0,z);
+        vec3 bottomColor =  vec3(.0,1.0,1.0);
+      
+        diffuseColor.rgb = mix(bottomColor,diffuseColor.rgb,s);
+        float r =  abs(z  * (1.0  - s * 2.0) + s * 4.0) ;
+        diffuseColor.rgb *= pow(r, 0.5 + 2.0 * s);
+      `
+      );
+    };
+
+    return material;
+  }
+
+  setMaterial() {
+    const locationShape = this.map.getObjectByName('locationShape');
+    if (!locationShape) return;
+    locationShape.geometry.computeBoundingBox();
+    const { max, min } = locationShape.geometry.boundingBox;
+    const distance = max.y - min.y + 2;
+
+    locationShape.material[0].onBeforeCompile = (shader) => {
+      shader.uniforms.uDistance = {
+        value: distance,
+      };
+      shader.uniforms.uTopColor = {
+        value: new THREE.Color(0xaaaeff),
+      };
+      this.addGrad(shader);
+    };
+  }
+
+  addGrad = (shader) => {
+    shader.vertexShader = shader.vertexShader.replace(
+      '#include <common>',
+      `
+      varying vec3 vPosition;
+      #include <common>
+    `
+    );
+    shader.vertexShader = shader.vertexShader.replace(
+      '#include <fog_vertex>',
+      `
+      #include <fog_vertex>
+      vPosition = position;
+     `
+    );
+    shader.fragmentShader = shader.fragmentShader.replace(
+      '#include <common>',
+      `
+      uniform vec3 uTopColor;
+      uniform float uDistance;
+      varying vec3 vPosition;
+      #include <common>
+      `
+    );
+
+    shader.fragmentShader = shader.fragmentShader.replace(
+      '#include <dithering_fragment>',
+      `
+      #include <dithering_fragment>
+
+      vec4 distGradColor = gl_FragColor;
+      // 设置混合的百分比
+      float gradMix = (vPosition.y + (uDistance / 2.0)) / uDistance / 5.0;
+      // 设置混合颜色
+      vec3 colorMix = mix(distGradColor.xyz, uTopColor, gradMix);
+      gl_FragColor = vec4(colorMix, 1.0);
+   
+      `
+    );
+  };
+
+  // 动画 - 城市边缘流光
+  animationCityEdgeLight() {
+    if (this.mapEdgeLightObj.lightOpacitys && this.mapEdgeLightObj.mapEdgePoints) {
+      if (this.mapEdgeLightObj.lightCurrentPos > this.mapEdgeLightObj.mapEdgePoints.length) {
+        this.mapEdgeLightObj.lightCurrentPos = 0;
+      }
+
+      this.mapEdgeLightObj.lightCurrentPos += this.mapEdgeLightObj.lightSpeed;
+      for (let i = 0; i < this.mapEdgeLightObj.lightSpeed; i++) {
+        this.mapEdgeLightObj.lightOpacitys[(this.mapEdgeLightObj.lightCurrentPos - i) % this.mapEdgeLightObj.mapEdgePoints.length] = 0;
+      }
+
+      for (let i = 0; i < 100; i++) {
+        this.mapEdgeLightObj.lightOpacitys[(this.mapEdgeLightObj.lightCurrentPos + i) % this.mapEdgeLightObj.mapEdgePoints.length] =
+          i / 50 > 2 ? 2 : i / 50;
+      }
+
+      if (this.mapEdgeLightObj.lightOpacityGeometry) {
+        this.mapEdgeLightObj.lightOpacityGeometry.attributes.aOpacity.needsUpdate = true;
+      }
+    }
+  }
+
+  // 动画
+  animate() {
+    requestAnimationFrame(this.animate.bind(this));
+    this.animationCityEdgeLight();
+    this.animationLocation();
+    this.controller?.update();
+    this.camera?.updateProjectionMatrix();
+    this.renderer?.render(this.scene, this.camera);
+    this.labelRenderer?.render(this.scene, this.camera);
+  }
+}
+
+export default earthtMap;

+ 125 - 0
src/views/vent/home/clique/components/3Dmap/index.vue

@@ -0,0 +1,125 @@
+<template>
+  <div class="map-box">
+    <div id="container"></div>
+    <div id="tooltip"></div>
+    <div id="compass"></div>
+    <dialogModal />
+  </div>
+</template>
+]
+<script lang="ts" setup>
+  import { onMounted, ref } from 'vue';
+  import earthtMap from './3dMap';
+  import dialogModal from '../dialog-modal.vue';
+
+  let map: earthtMap | null = null;
+
+  const locationInfo = [
+    {
+      name: '保德矿',
+      code: 'bd',
+      value: [111.102548, 38.951875],
+    },
+    {
+      name: '锦界矿',
+      code: 'jj',
+      value: [110.174801, 38.742404],
+    },
+    {
+      name: '榆家梁矿',
+      code: 'yjl',
+      value: [110.526055, 39.044234],
+    },
+    {
+      name: '大柳塔矿',
+      code: 'dlt',
+      value: [110.245165, 39.259314],
+    },
+    // {
+    //   name: '神东煤炭集团',
+    //   value: [110.216401, 39.276499],
+    // },
+    {
+      name: '上湾矿',
+      code: 'sw',
+      value: [110.191364, 39.290282],
+    },
+    {
+      name: '哈拉沟矿',
+      code: 'hlg',
+      value: [110.207022, 39.308751],
+    },
+    {
+      name: '补连塔矿',
+      code: 'blt',
+      value: [110.173867, 39.358305],
+    },
+    {
+      name: '石圪台矿',
+      code: 'sgt',
+      value: [110.136362, 39.418578],
+    },
+
+    {
+      name: '寸草塔矿',
+      code: 'cct',
+      value: [110.107954, 39.436366],
+    },
+    {
+      name: '乌兰木伦矿',
+      code: 'wlml',
+      value: [110.102314, 39.456531],
+    },
+
+    {
+      name: '布尔台矿',
+      code: 'bet',
+      value: [110.066138, 39.480941],
+    },
+    {
+      name: '寸草塔二矿',
+      code: 'ccte',
+      value: [110.059497, 39.505482],
+    },
+    {
+      name: '柳塔矿',
+      code: 'lt',
+      value: [110.094463, 39.536514],
+    },
+  ];
+
+  onMounted(async () => {
+    map = new earthtMap('container', 'tooltip');
+    map.init();
+    map.animate();
+    await map.setTag(locationInfo);
+    map.setTooltip('detailModal');
+  });
+</script>
+<style lang="less" scoped>
+  .map-box {
+    width: 100%;
+    height: 100%;
+    position: relative;
+    top: 0;
+    #container {
+      width: 100%;
+      height: 100%;
+    }
+
+    #tooltip {
+      width: 100%;
+      height: 100%;
+    }
+    #compass {
+      width: 90px;
+      height: 90px;
+      position: absolute;
+      top: 90px;
+      left: 1340px;
+      background: url(/texture/compass.png);
+      background-size: contain;
+      z-index: 999;
+    }
+  }
+</style>

+ 216 - 0
src/views/vent/home/clique/index1.vue

@@ -0,0 +1,216 @@
+<template>
+  <div class="company-home">
+    <div class="top-bg">
+      <div class="main-title">{{ mainTitle }}</div>
+    </div>
+    <mapComponent @open-detail="showDetail" />
+    <div class="company-content">
+      <div class="area-content">
+        <div class="left-area">
+          <!-- 矿井通风状态监测 -->
+          <div class="area-card">
+            <mineWind />
+          </div>
+          <!-- 一通三防风险分析与预警 -->
+          <div class="area-card1">
+            <riskWarn />
+          </div>
+        </div>
+        <div class="center-area">
+          <!-- 地图底图 -->
+          <!-- <div class="center-bg">
+            <div class="bg-map">
+              <iconLight />
+            </div>
+          </div> -->
+          <!-- 榆家梁矿 -->
+          <!-- <div class="area-card2">
+            
+          </div> -->
+          <!-- 文件共享中心 -->
+          <div class="area-card3">
+            <fileShare />
+          </div>
+        </div>
+        <div class="right-area">
+          <!-- 关键场景通防综合监测 -->
+          <div class="area-card">
+            <sceneKey />
+          </div>
+          <!-- 通风巷道长度统计 -->
+          <div class="area-card1">
+            <windRoad />
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script lang="ts" setup>
+  import { ref } from 'vue';
+  import mineWind from './components/mine-wind.vue';
+  import riskWarn from './components/risk-warn.vue';
+  import fileShare from './components/file-share.vue';
+  import mapComponent from './components/3Dmap/index.vue';
+  import windRoad from './components/wind-road.vue';
+  import sceneKey from './components/scene-key.vue';
+  import iconLight from './components/icon-light.vue';
+  // import mapComponent from './components/3Dmap/index.vue';
+
+  let mainTitle = ref('国家能源神东煤炭集团');
+  function showDetail(code) {
+    if (code) {
+      // isShowDialog.value = true;
+    }
+  }
+</script>
+<style lang="less" scoped>
+  @font-face {
+    font-family: 'douyuFont';
+    src: url('../../../../assets/font/douyuFont.otf');
+  }
+
+  // @font-face {
+  //   font-family: 'yjsz';
+  //   src: url('../../../../assets/font/yjsz.TTF');
+  // }
+  .company-home {
+    width: 100%;
+    height: 100%;
+    position: relative;
+    background: url('../../../../assets/images/company/home-pageBg.png') no-repeat center;
+    background-size: 100% 100%;
+
+    .top-bg {
+      width: 100%;
+      height: 97px;
+      background: url('../../../../assets/images/company/top-bg.png') no-repeat center;
+      position: absolute;
+      z-index: 1;
+      .main-title {
+        height: 96px;
+        color: #fff;
+        font-family: 'douyuFont';
+        font-size: 20px;
+        letter-spacing: 2px;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+      }
+    }
+
+    .company-content {
+      position: absolute;
+      left: 0;
+      top: 0;
+      width: 100%;
+      height: 100%;
+      background: url('../../../../assets/images/company/content-bg.png') no-repeat;
+      background-size: 100% 100%;
+      pointer-events: none;
+
+      .area-content {
+        position: absolute;
+        top: 45px;
+        width: 100%;
+        height: calc(100% - 45px);
+        padding: 0px 20px 20px 20px;
+        box-sizing: border-box;
+        display: flex;
+        justify-content: space-between;
+        // pointer-events: none;
+        .left-area {
+          width: 23%;
+          height: 100%;
+          margin-right: 15px;
+          display: flex;
+          flex-direction: column;
+          justify-content: space-between;
+          align-items: center;
+          // pointer-events: auto;
+          .area-card {
+            width: 100%;
+            height: calc(60% - 15px);
+            margin-bottom: 15px;
+            background: url('../../../../assets/images/company/area-card.png') no-repeat;
+            background-size: 100% 100%;
+          }
+
+          .area-card1 {
+            width: 100%;
+            height: 40%;
+            background: url('../../../../assets/images/company/area-card1.png') no-repeat;
+            background-size: 100% 100%;
+          }
+        }
+
+        .center-area {
+          width: calc(54% - 30px);
+          height: 100%;
+          position: relative;
+          .center-bg {
+            position: absolute;
+            bottom: 269px;
+            left: 50%;
+            transform: translate(-50%, 0);
+            height: calc(100% - 325px);
+            width: 100%;
+            background: url('../../../../assets/images/company/home-dz.png') no-repeat center;
+            background-position: 50% 90%;
+            .bg-map {
+              width: 100%;
+              height: 100%;
+              background: url('../../../../assets/images/company/home-map.png') no-repeat center;
+              background-size: 100% 100%;
+            }
+          }
+          .area-card2 {
+            position: absolute;
+            right: 0;
+            top: 62px;
+            width: 568px;
+            height: 437px;
+            background: url('../../../../assets/images/company/area-card2.png') no-repeat;
+            background-size: 100% 100%;
+            // pointer-events: auto;
+          }
+
+          .area-card3 {
+            position: absolute;
+            right: 0;
+            bottom: 0px;
+            width: 100%;
+            height: 269px;
+            background: url('../../../../assets/images/company/area-card3.png') no-repeat;
+            background-size: 100% 100%;
+          }
+        }
+
+        .right-area {
+          width: 23%;
+          height: 100%;
+          margin-left: 15px;
+          display: flex;
+          flex-direction: column;
+          justify-content: space-between;
+          align-items: center;
+          // pointer-events: auto;
+          .area-card {
+            width: 100%;
+            height: calc(60% - 15px);
+            margin-bottom: 15px;
+            background: url('../../../../assets/images/company/area-card.png') no-repeat;
+            background-size: 100% 100%;
+          }
+
+          .area-card1 {
+            width: 100%;
+            height: 40%;
+            background: url('../../../../assets/images/company/area-card1.png') no-repeat;
+            background-size: 100% 100%;
+          }
+        }
+      }
+    }
+  }
+</style>

+ 557 - 0
src/views/vent/monitorManager/gateMonitor/gate.threejs.xr.ts

@@ -0,0 +1,557 @@
+import * as THREE from 'three';
+import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js';
+import { getTextCanvas, renderVideo } from '/@/utils/threejs/util';
+import UseThree from '../../../../utils/threejs/useThree';
+import { drawHot } from '/@/utils/threejs/util';
+import { useAppStore } from '/@/store/modules/app';
+
+// import * as dat from 'dat.gui';
+// const gui = new dat.GUI();
+// gui.domElement.style = 'position:absolute;top:100px;left:10px;z-index:99999999999999';
+
+class FmXR {
+  modelName = 'fmXr';
+  model; //
+  group;
+  isLRAnimation = true; // 是否开启左右摇摆动画
+  direction = 1; // 摇摆方向
+  animationTimer: NodeJS.Timeout | null = null; // 摇摆开启定时器
+  player1;
+  player2;
+  deviceDetailCSS3D;
+  playerStartClickTime1 = new Date().getTime();
+  playerStartClickTime2 = new Date().getTime();
+
+  fmClock = new THREE.Clock();
+  mixers: THREE.AnimationMixer | undefined;
+  appStore = useAppStore();
+
+  backDamperOpenMesh;
+  backDamperClosedMesh;
+  frontDamperOpenMesh;
+  frontDamperClosedMesh;
+
+  clipActionArr = {
+    frontDoor: null as unknown as THREE.AnimationAction,
+    backDoor: null as unknown as THREE.AnimationAction,
+  };
+
+  constructor(model) {
+    this.model = model;
+  }
+
+  addLight() {
+    const directionalLight = new THREE.DirectionalLight(0xffffff, 1.5);
+    directionalLight.position.set(344, 690, 344);
+    this.group?.add(directionalLight);
+    directionalLight.target = this.group as THREE.Object3D;
+
+    const pointLight2 = new THREE.PointLight(0xffeeee, 1, 300);
+    pointLight2.position.set(-4, 10, 1.8);
+    pointLight2.shadow.bias = 0.05;
+    this.group?.add(pointLight2);
+
+    const pointLight3 = new THREE.PointLight(0xffeeee, 1, 200);
+    pointLight3.position.set(-0.5, -0.5, 0.75);
+    pointLight3.shadow.bias = 0.05;
+    this.group?.add(pointLight3);
+
+    // const pointLight4 = new THREE.PointLight(0xffeeee, 1, 150);
+    // pointLight4.position.set(4.3, 1, -0.9);
+    // pointLight4.shadow.bias = 0.05;
+    // this.group?.add(pointLight4);
+
+    // const pointLight5 = new THREE.PointLight(0xffeeee, 1, 150);
+    // pointLight5.position.set(4.3, 1, -0.9);
+    // pointLight5.shadow.bias = 0.05;
+    // this.group?.add(pointLight5);
+
+    // const pointLight6 = new THREE.PointLight(0xffeeee, 1, 150);
+    // pointLight6.position.set(-4.4, 1, -0.9);
+    // pointLight6.shadow.bias = 0.05;
+    // this.group?.add(pointLight6);
+
+    // const pointLightHelper2 = new THREE.PointLightHelper(pointLight2, 1);
+    // this.model.scene?.add(pointLightHelper2);
+
+    // gui.add(pointLight2.position, 'x', -300, 300);
+    // gui.add(pointLight2.position, 'y', -300, 300);
+    // gui.add(pointLight2.position, 'z', -300, 300);
+
+    // gui.add(pointLight3.position, 'x', -300, 300);
+    // gui.add(pointLight3.position, 'y', -300, 300);
+    // gui.add(pointLight3.position, 'z', -300, 300);
+  }
+  // 重置摄像头
+  resetCamera() {
+    this.model.camera.far = 274;
+    this.model.orbitControls?.update();
+    this.model.camera.updateProjectionMatrix();
+  }
+  // 设置模型位置
+  setModalPosition() {
+    this.group?.scale.set(22, 22, 22);
+    this.group?.position.set(-20, 20, 9);
+  }
+
+  /* 添加监控数据 */
+  addMonitorText(selectData) {
+    if (!this.group) {
+      return;
+    }
+    const textArr = [
+      {
+        text: `远程控制自动风门`,
+        font: 'normal 30px Arial',
+        color: '#00FF00',
+        strokeStyle: '#007400',
+        x: 120,
+        y: 100,
+      },
+      {
+        text: `净通行高度(m):`,
+        font: 'normal 30px Arial',
+        color: '#00FF00',
+        strokeStyle: '#007400',
+        x: 0,
+        y: 155,
+      },
+      {
+        text: `${selectData.fclearheight ? selectData.fclearheight : '-'}`,
+        font: 'normal 30px Arial',
+        color: '#00FF00',
+        strokeStyle: '#007400',
+        x: 290,
+        y: 155,
+      },
+      {
+        text: `净通行宽度(m): `,
+        font: 'normal 30px Arial',
+        color: '#00FF00',
+        strokeStyle: '#007400',
+        x: 0,
+        y: 215,
+      },
+      {
+        text: ` ${selectData.fclearwidth ? selectData.fclearwidth : '-'}`,
+        font: 'normal 30px Arial',
+        color: '#00FF00',
+        strokeStyle: '#007400',
+        x: 280,
+        y: 215,
+      },
+      {
+        text: `故障诊断:`,
+        font: 'normal 30px Arial',
+        color: '#00FF00',
+        strokeStyle: '#007400',
+        x: 0,
+        y: 275,
+      },
+      {
+        text: `${selectData.warnLevel_str ? selectData.warnLevel_str : '-'}`,
+        font: 'normal 30px Arial',
+        color: '#00FF00',
+        strokeStyle: '#007400',
+        x: 280,
+        y: 275,
+      },
+      {
+        text: History_Type['type'] == 'remote' ? `国能神东煤炭集团监制` : '煤炭科学技术研究院有限公司研制',
+        font: 'normal 28px Arial',
+        color: '#00FF00',
+        strokeStyle: '#007400',
+        x: History_Type['type'] == 'remote' ? 80 : 20,
+        y: 325,
+      },
+    ];
+
+    //
+    getTextCanvas(526, 346, textArr, '').then((canvas: HTMLCanvasElement) => {
+      const textMap = new THREE.CanvasTexture(canvas); // 关键一步
+      textMap.colorSpace = THREE.SRGBColorSpace;
+      const textMaterial = new THREE.MeshBasicMaterial({
+        // 关于材质并未讲解 实操即可熟悉                 这里是漫反射类似纸张的材质,对应的就有高光类似金属的材质.
+        map: textMap, // 设置纹理贴图
+        transparent: true,
+        side: THREE.FrontSide, // 这里是双面渲染的意思
+      });
+      textMaterial.blending = THREE.CustomBlending;
+      const monitorPlane = this.group.getObjectByName('monitorText');
+      if (monitorPlane) {
+        monitorPlane.material = textMaterial;
+      } else {
+        const planeGeometry = new THREE.PlaneGeometry(526, 346); // 平面3维几何体PlaneGeometry
+        const planeMesh = new THREE.Mesh(planeGeometry, textMaterial);
+        planeMesh.name = 'monitorText';
+        planeMesh.scale.set(0.002, 0.002, 0.002);
+        planeMesh.position.set(3.685, 0.09, -0.41);
+        this.group.add(planeMesh);
+      }
+      textMap.dispose();
+    });
+  }
+
+  /** 添加热点 */
+  drawHots() {
+    const hotPositions = [
+      { x: -0.37, y: 0.26, z: -0.32 },
+      { x: 0.28, y: -0.2, z: -0.43 },
+      { x: 0.55, y: -0.22, z: -0.38 },
+    ];
+    for (let i = 0; i < 3; i++) {
+      const hotPoint = drawHot(0.1);
+      const position = hotPositions[i];
+      hotPoint.scale.set(0.1, 0.1, 0.1);
+      hotPoint.position.set(position.x, position.y, position.z);
+      hotPoint.name = 'hotPoint' + i;
+      this.group?.add(hotPoint);
+    }
+  }
+
+  /* 风门动画 */
+  render() {
+    if (!this.model) {
+      return;
+    }
+    if (this.isLRAnimation && this.group) {
+      // 左右摇摆动画
+      if (Math.abs(this.group.rotation.y) >= 0.2) {
+        this.direction = -this.direction;
+        this.group.rotation.y += 0.00002 * 30 * this.direction;
+      } else {
+        this.group.rotation.y += 0.00002 * 30 * this.direction;
+      }
+    }
+
+    if (this.mixers && this.fmClock.running) {
+      this.mixers.update(2);
+    }
+  }
+
+  /* 点击风窗,风窗全屏 */
+  mousedownModel(intersects: THREE.Intersection<THREE.Object3D<THREE.Event>>[]) {
+    this.isLRAnimation = false;
+    if (this.animationTimer) {
+      clearTimeout(this.animationTimer);
+      this.animationTimer = null;
+    }
+
+    // 判断是否点击到视频
+    intersects.find((intersect) => {
+      const mesh = intersect.object;
+      // if (mesh.name === 'player1') {
+      //   if (new Date().getTime() - this.playerStartClickTime1 < 400) {
+      //     // 双击,视频放大
+      //     if (this.player1) {
+      //       this.player1.requestPictureInPicture();
+      //     }
+      //   }
+      //   this.playerStartClickTime1 = new Date().getTime();
+      //   return true;
+      // } else if (mesh.name === 'player2') {
+      //   if (new Date().getTime() - this.playerStartClickTime2 < 400) {
+      //     // 双击,视频放大
+      //     if (this.player2) {
+      //       this.player2.requestPictureInPicture();
+      //     }
+      //   }
+      //   this.playerStartClickTime2 = new Date().getTime();
+      //   return true;
+      // } else if (mesh.name.startsWith('hotPoint')) {
+      //   if (this.deviceDetailCSS3D) {
+      //     this.deviceDetailCSS3D.position.set(mesh.position.x + 0.035, mesh.position.y + 0.68, mesh.position.z + 0.02);
+      //     console.log('[ deviceDetailCSS3D.position ] >', this.deviceDetailCSS3D.position);
+      //     this.deviceDetailCSS3D.visible = true;
+      //     return true;
+      //   }
+      // } else {
+      //   if (this.deviceDetailCSS3D) this.deviceDetailCSS3D.visible = false;
+      //   console.log('[ 点击事件 ] >');
+      // }
+      return false;
+    });
+  }
+
+  mouseUpModel() {
+    // 10s后开始摆动
+    if (!this.animationTimer && !this.isLRAnimation) {
+      this.animationTimer = setTimeout(() => {
+        this.isLRAnimation = true;
+      }, 10000);
+    }
+  }
+
+  /* 提取风门序列帧,初始化前后门动画 */
+  initAnimation() {
+    debugger;
+    const fmGroup = this.group?.getObjectByName('fmXr-door');
+    if (fmGroup) {
+      const tracks = fmGroup.animations[0].tracks;
+      const fontTracks: any[] = [],
+        backTracks: any[] = [];
+      for (let i = 0; i < tracks.length; i++) {
+        const track = tracks[i];
+        if (track.name.startsWith('qianmen')) {
+          fontTracks.push(track);
+        } else if (track.name.startsWith('houmen')) {
+          backTracks.push(track);
+        }
+      }
+
+      this.mixers = new THREE.AnimationMixer(fmGroup);
+
+      const frontDoor = new THREE.AnimationClip('frontDoor', 4, fontTracks);
+      const frontClipAction = this.mixers.clipAction(frontDoor, fmGroup);
+      frontClipAction.clampWhenFinished = true;
+      frontClipAction.loop = THREE.LoopOnce;
+      this.clipActionArr.frontDoor = frontClipAction;
+
+      const backDoor = new THREE.AnimationClip('backDoor', 4, backTracks);
+      const backClipAction = this.mixers.clipAction(backDoor, fmGroup);
+      backClipAction.clampWhenFinished = true;
+      backClipAction.loop = THREE.LoopOnce;
+      this.clipActionArr.backDoor = backClipAction;
+    }
+  }
+
+  deviceDetailCard(position = { x: 0, y: 0, z: 0 }) {
+    const element = document.getElementById('deviceCard') as HTMLElement;
+    if (element) {
+      this.deviceDetailCSS3D = new CSS2DObject(element);
+      this.deviceDetailCSS3D.name = 'deviceCard';
+      this.deviceDetailCSS3D.position.set(position.x, position.y, position.z);
+      this.deviceDetailCSS3D.visible = false;
+      // this.model.scene.add(this.deviceDetailCSS3D);
+      this.group.add(this.deviceDetailCSS3D);
+    }
+  }
+
+  // 播放动画
+  play(handlerState, timeScale = 0.01) {
+    if (this.clipActionArr.frontDoor && this.clipActionArr.backDoor) {
+      let handler = () => {};
+      switch (handlerState) {
+        case 1: // 打开前门
+          handler = () => {
+            this.clipActionArr.frontDoor.paused = true;
+            this.clipActionArr.frontDoor.reset();
+            this.clipActionArr.frontDoor.time = 1.2;
+            this.clipActionArr.frontDoor.timeScale = timeScale;
+            // this.clipActionArr.frontDoor.clampWhenFinished = true;
+            this.clipActionArr.frontDoor.play();
+            this.fmClock.start();
+
+            // 显示打开前门文字
+            if (this.frontDamperOpenMesh) this.frontDamperOpenMesh.visible = true;
+            if (this.frontDamperClosedMesh) this.frontDamperClosedMesh.visible = false;
+          };
+          break;
+        case 2: // 关闭前门
+          handler = () => {
+            this.clipActionArr.frontDoor.paused = true;
+            this.clipActionArr.frontDoor.reset(); //
+            this.clipActionArr.frontDoor.time = 3;
+            this.clipActionArr.frontDoor.timeScale = -timeScale;
+            // this.clipActionArr.frontDoor.clampWhenFinished = true;
+            this.clipActionArr.frontDoor.play();
+            this.fmClock.start();
+
+            if (this.frontDamperOpenMesh) this.frontDamperOpenMesh.visible = false;
+            if (this.frontDamperClosedMesh) this.frontDamperClosedMesh.visible = true;
+          };
+          break;
+        case 3: // 打开后门
+          handler = () => {
+            this.clipActionArr.backDoor.paused = true;
+            this.clipActionArr.backDoor.reset();
+            this.clipActionArr.backDoor.time = 1.2;
+            this.clipActionArr.backDoor.timeScale = timeScale;
+            // this.clipActionArr.backDoor.clampWhenFinished = true;
+            this.clipActionArr.backDoor.play();
+            this.fmClock.start();
+
+            if (this.backDamperOpenMesh) this.backDamperOpenMesh.visible = true;
+            if (this.backDamperClosedMesh) this.backDamperClosedMesh.visible = false;
+          };
+          break;
+        case 4: // 关闭后门
+          handler = () => {
+            this.clipActionArr.backDoor.paused = true;
+            this.clipActionArr.backDoor.reset();
+            this.clipActionArr.backDoor.time = 3;
+            this.clipActionArr.backDoor.timeScale = -timeScale;
+            // this.clipActionArr.backDoor.clampWhenFinished = true;
+            this.clipActionArr.backDoor.play();
+            this.fmClock.start();
+
+            if (this.backDamperOpenMesh) this.backDamperOpenMesh.visible = false;
+            if (this.backDamperClosedMesh) this.backDamperClosedMesh.visible = true;
+          };
+          break;
+        // case 5: // 打开前后门
+        //   handler = () => {
+        //     this.clipActionArr.backDoor.paused = true;
+        //     this.clipActionArr.frontDoor.paused = true;
+
+        //     this.clipActionArr.frontDoor.reset();
+        //     this.clipActionArr.frontDoor.time = 0;
+        //     this.clipActionArr.frontDoor.timeScale = 0.01;
+        //     this.clipActionArr.frontDoor.clampWhenFinished = true;
+        //     this.clipActionArr.frontDoor.play();
+
+        //     this.clipActionArr.backDoor.reset();
+        //     this.clipActionArr.backDoor.time = 0;
+        //     this.clipActionArr.backDoor.timeScale = 0.01;
+        //     this.clipActionArr.backDoor.clampWhenFinished = true;
+        //     this.clipActionArr.backDoor.play();
+        //     this.frontClock.start();
+        //     this.backClock.start();
+        //   };
+        //   break;
+        // case 6: // 关闭前后门
+        //   handler = () => {
+        //     debugger;
+        //     this.clipActionArr.backDoor.paused = true;
+        //     this.clipActionArr.frontDoor.paused = true;
+
+        //     this.clipActionArr.frontDoor.reset();
+        //     this.clipActionArr.frontDoor.time = 4;
+        //     this.clipActionArr.frontDoor.timeScale = -0.01;
+        //     this.clipActionArr.frontDoor.clampWhenFinished = true;
+        //     this.clipActionArr.frontDoor.play();
+        //     this.clipActionArr.backDoor.reset();
+        //     this.clipActionArr.backDoor.time = 4;
+        //     this.clipActionArr.backDoor.timeScale = -0.01;
+        //     this.clipActionArr.backDoor.clampWhenFinished = true;
+        //     this.clipActionArr.backDoor.play();
+        //     this.frontClock.start();
+        //     this.backClock.start();
+        //   };
+        //   break;
+        default:
+      }
+
+      handler();
+      // model.clock.start();
+      // const honglvdeng = group.getObjectByName('honglvdeng');
+      // const material = honglvdeng.material;
+      // setTimeout(() => {
+      //   if (handlerState === 2 || handlerState === 4 || handlerState === 6) {
+      //     material.color = new THREE.Color(0x00ff00);
+      //   } else {
+      //     material.color = new THREE.Color(0xff0000);
+      //   }
+      // }, 1000);
+    }
+  }
+
+  async initCamera(dom1) {
+    const videoPlayer1 = dom1;
+    this.player1 = dom1;
+    let monitorPlane: THREE.Mesh | null = null;
+    if (!videoPlayer1) {
+      const textArr = [
+        {
+          text: `无信号输入`,
+          font: 'normal 40px Arial',
+          color: '#009900',
+          strokeStyle: '#002200',
+          x: 170,
+          y: 40,
+        },
+      ];
+      const canvas = await getTextCanvas(320, 180, '', 'noSinge.png');
+
+      let textMaterial: THREE.MeshBasicMaterial | null = null;
+      if (canvas) {
+        const textMap = new THREE.CanvasTexture(canvas); // 关键一步
+        textMaterial = new THREE.MeshBasicMaterial({
+          map: textMap, // 设置纹理贴图
+          transparent: true,
+          side: THREE.DoubleSide, // 这里是双面渲染的意思
+        });
+        textMaterial.blending = THREE.CustomBlending;
+
+        const planeGeometry = new THREE.PlaneGeometry(100, 100); // 平面3维几何体PlaneGeometry
+        monitorPlane = new THREE.Mesh(planeGeometry, textMaterial);
+
+        textMaterial.dispose();
+        planeGeometry.dispose();
+        textMap.dispose();
+      }
+    }
+    const player1 = this.group.getObjectByName('player1');
+    if (player1) {
+      this.model.clearMesh(player1);
+      this.group.remove(player1);
+    }
+    const noPlayer1 = this.group.getObjectByName('noPlayer1');
+    if (noPlayer1) {
+      this.model.clearMesh(noPlayer1);
+      this.group.remove(noPlayer1);
+    }
+    if (!videoPlayer1 && videoPlayer1 === null) {
+      if (monitorPlane && !this.group.getObjectByName('noPlayer1')) {
+        const planeMesh = monitorPlane.clone();
+        planeMesh.name = 'noPlayer1';
+        planeMesh.scale.set(0.0085, 0.0055, 0.012);
+        planeMesh.position.set(-3.64, 0.01, -0.41);
+        this.group?.add(planeMesh.clone());
+      }
+    } else if (videoPlayer1) {
+      try {
+        const mesh = renderVideo(this.group, videoPlayer1, 'player1');
+        if (mesh) {
+          mesh?.scale.set(-0.0275, 0.028, 1);
+          mesh?.position.set(-3.643, 0.02, -0.4);
+          mesh.rotation.y = -Math.PI;
+          this.group.add(mesh);
+        }
+      } catch (error) {
+        console.log('视频信号异常');
+      }
+    }
+  }
+
+  mountedThree(playerDom) {
+    this.group = new THREE.Object3D();
+    this.group.name = this.modelName;
+    return new Promise((resolve) => {
+      this.model.setGLTFModel(['fmXr-door', 'fmXr-wire', 'fmXr-wall'], this.group).then(() => {
+        this.setModalPosition();
+        // 初始化左右摇摆动画;
+        this.initAnimation();
+        // this.drawHots();
+        this.addLight();
+        // this.deviceDetailCard();
+        this.model.animate();
+
+        resolve(this.model);
+        this.initCamera(playerDom);
+      });
+    });
+  }
+
+  destroy() {
+    if (this.model) {
+      if (this.mixers) {
+        this.mixers.uncacheClip(this.clipActionArr.frontDoor.getClip());
+        this.mixers.uncacheClip(this.clipActionArr.backDoor.getClip());
+        this.mixers.uncacheAction(this.clipActionArr.frontDoor.getClip(), this.group);
+        this.mixers.uncacheAction(this.clipActionArr.backDoor.getClip(), this.group);
+        this.mixers.uncacheRoot(this.group);
+
+        if (this.model.animations[0]) this.model.animations[0].tracks = [];
+      }
+      this.model.clearGroup(this.group);
+      this.clipActionArr.backDoor = undefined;
+      this.clipActionArr.frontDoor = undefined;
+
+      this.mixers = undefined;
+
+      // document.getElementById('damper3D').parentElement.remove(document.getElementById('damper3D'))
+    }
+  }
+}
+export default FmXR;

+ 226 - 0
src/views/vent/monitorManager/groutMonitor/components/groutHome1.vue

@@ -0,0 +1,226 @@
+<template>
+  <div class="monitor-container">
+    <div class="header-box">
+      <div class="header-container">
+        <div class="device-detail">
+          <div class="device-title">&nbsp</div>
+          <div class="device-val">是否带电</div>
+          <div class="device-val">是否运行</div>
+          <div class="device-val">故障</div>
+        </div>
+        <div v-for="(device, key) in deviceMonitorList" class="device-detail" :key="key">
+          <div class="device-title">{{ device.title }}</div>
+          <div v-for="(detailItem, index) in device.dataList" :key="detailItem.code" class="device-val">
+            <span v-if="index == 0" :style="{ color: monitorData[detailItem.code] != 1 ? '#BFBFBF' : '#10BC79' }">{{
+              monitorData[detailItem.code] == 0 ? '不带电' : monitorData[detailItem.code] == 1 ? '带电' : '-'
+            }}</span>
+            <span v-if="index == 1" :style="{ color: monitorData[detailItem.code] != 1 ? '#BFBFBF' : '#10BC79' }">{{
+              monitorData[detailItem.code] == 0 ? '未运行' : monitorData[detailItem.code] == 1 ? '运行' : '-'
+            }}</span>
+            <span
+              v-if="index == 2"
+              :style="{ color: monitorData[detailItem.code] == 0 ? '#10BC79' : monitorData[detailItem.code] == 1 ? '#F14C4C' : '#BFBFBF' }"
+              >{{ monitorData[detailItem.code] == 0 ? '正常' : monitorData[detailItem.code] == 1 ? '报警' : '-' }}</span
+            >
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <component v-if="modalVisible" :is="currentModal" v-model:visible="modalVisible" />
+</template>
+
+<script setup lang="ts">
+  import { onBeforeMount, ref, onMounted, onUnmounted, shallowRef, defineProps, ComponentOptions, reactive } from 'vue';
+  import { mountedThree, destroy, setModelType } from '../grout.threejs';
+  import { ScrollBoard as DvScrollBoard } from '@kjgl77/datav-vue3';
+  import ventBox1 from '/@/components/vent/ventBox1.vue';
+  import RunParameterModal from './runParameter.modal.vue';
+  import WarningParameterModal from './warningParameter.modal.vue';
+  import { deviceMonitorList } from '../grout.data';
+  import { list } from '../grout.api';
+  import BarAndLineCustom from '/@/components/chart/BarAndLineCustom.vue';
+
+  const props = defineProps({
+    deviceId: {
+      type: String,
+      require: true,
+    },
+    deviceType: {
+      type: String,
+      require: true,
+    },
+  });
+  const left: string = '0px';
+  const currentModal = shallowRef<Nullable<ComponentOptions>>(null); //模态框
+  const modalVisible = ref<Boolean>(false); // 模态框是否可见
+  const loading = ref(false);
+  const monitorData = ref({});
+  // 默认初始是第一行
+  const dataSource = ref([
+    {
+      waterSupply: '-',
+      beltVla: '-',
+      density: '-',
+      pressure: '-',
+      liquidLevel: '-',
+      flowRate: '-',
+      readTime: '',
+    },
+    {
+      waterSupply: '-',
+      beltVla: '-',
+      density: '-',
+      pressure: '-',
+      liquidLevel: '-',
+      flowRate: '-',
+      readTime: '',
+    },
+  ]); //dusting
+
+  const flvURL1 = () => {
+    return `https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv`;
+    // return ''
+  };
+  const openModal = (modalName) => {
+    modalVisible.value = true;
+    if (modalName == 'RunParameterModal') {
+      currentModal.value = RunParameterModal;
+    } else {
+      currentModal.value = WarningParameterModal;
+    }
+  };
+
+  // https获取监测数据
+  let timer: null | NodeJS.Timeout = null;
+  function getMonitor(flag?) {
+    if (Object.prototype.toString.call(timer) === '[object Null]') {
+      timer = setTimeout(
+        async () => {
+          await getDataSource();
+          if (timer) {
+            timer = null;
+          }
+          await getMonitor();
+        },
+        flag ? 0 : 1000
+      );
+    }
+  }
+
+  async function getDataSource() {
+    const res = await list({ devicetype: 'pulping_auto', pagetype: 'normal' });
+    if (res.msgTxt && res.msgTxt[0] && res.msgTxt[0].datalist && res.msgTxt[0].datalist[0]) {
+      monitorData.value = Object.assign(res.msgTxt[0].datalist[0], res.msgTxt[0].datalist[0]['readData']);
+    }
+    // const dataList = res.msgTxt[0].datalist || [];
+    // dataSource.value = dataList.filter((data) => {
+    //   const item = data.readData;
+    //   Object.assign(data, item);
+    //   return item
+    // });
+    // monitorData.value =
+  }
+
+  function handlerDevice(param: string | Object) {}
+  function controlDevice(flag) {}
+
+  onBeforeMount(() => {});
+
+  onMounted(() => {
+    loading.value = true;
+    mountedThree().then(async () => {
+      // await setModelType('groutBase');
+      await setModelType('bertaiBase');
+      loading.value = false;
+      timer = null;
+      await getMonitor(true);
+    });
+  });
+  onUnmounted(() => {
+    destroy();
+    if (timer) {
+      clearTimeout(timer);
+      timer = undefined;
+    }
+  });
+</script>
+<style lang="less" scoped>
+  @import '/@/design/vent/modal.less';
+  @ventSpace: zxm;
+
+  .monitor-container {
+    width: 100%;
+    height: 100%;
+    // height: 550px;
+    // border: 1px solid #fff;
+    margin-top: 40px;
+    display: flex;
+    // justify-content: space-between;
+    justify-content: center;
+    padding: 0 5px;
+
+    .header-box {
+      // width: 100%;
+      margin-top: 50px;
+      .header-container {
+        height: auto;
+        display: flex;
+        flex-direction: row;
+        justify-content: center;
+        color: #fff;
+        box-shadow: 0 0 30px rgb(0, 153, 184) inset;
+      }
+      .device-title {
+        width: 110px;
+        text-align: center;
+        border-top: 1px solid #00baffd4;
+        border-left: 1px solid #00baffd4;
+        line-height: 46px;
+        color: #00e5ff;
+        background-color: #00bbff21;
+      }
+      .device-detail {
+        text-align: center;
+        &:first-child {
+          background-color: #00bbff11;
+        }
+        &:last-child {
+          .device-val,
+          .device-title {
+            border-right: 1px solid #00baffd4;
+          }
+        }
+        .device-val {
+          line-height: 36px;
+          border-top: 1px solid #00baffd4;
+          border-left: 1px solid #00baffd4;
+          &:last-child {
+            border-bottom: 1px solid #00baffd4;
+          }
+        }
+      }
+    }
+  }
+
+  :deep(.@{ventSpace}-tabs-tabpane-active) {
+    overflow: auto;
+  }
+
+  .input-box {
+    display: flex;
+    align-items: center;
+    padding-left: 10px;
+
+    .input-title {
+      color: #73e8fe;
+      width: auto;
+    }
+
+    .@{ventSpace}-input-number {
+      border-color: #ffffff88 !important;
+    }
+
+    margin-right: 10px;
+  }
+</style>

+ 1130 - 0
src/views/vent/monitorManager/nitrogen/components/nitrogenHomeYJ.vue

@@ -0,0 +1,1130 @@
+<template>
+  <div id="compressor3D" style="width: 100%; height: 100%; position: absolute; overflow: hidden"></div>
+  <div
+    v-show="monitorDataGroupFlag == 1"
+    id="compressorCss3D"
+    class="threejs-Object-CSS compressorCss3D-box"
+    style="width: 100%; height: 100%; position: absolute; pointer-events: none; overflow: hidden; z-index: 2; top: 0px; left: 0px"
+  >
+    <!-- <a-spin :spinning="loading" /> -->
+    <div v-for="(groupNum, index) in monitorDataGroupNum1" :key="index" class="modal-monitor">
+      <fourBorderBg :class="`kyj${groupNum}`" :id="`nitrogenMonitor${groupNum}`">
+        <div class="title">{{ groupNum }}号空压机 </div>
+        <div class="monitor-item">
+          <span class="monitor-title">机头温度:</span>
+          <span class="monitor-val"
+            ><span class="val">{{ monitorData[`PRE${groupNum}_CPR_HeadTemp`] ? monitorData[`PRE${groupNum}_CPR_HeadTemp`] : '-' }}</span
+            ><span class="unit"></span>℃</span
+          >
+        </div>
+        <div class="monitor-item">
+          <span class="monitor-title">冷却温度:</span>
+          <span class="monitor-val"
+            ><span class="val">{{ monitorData[`PRE${groupNum}_CPR_CoolantTemp`] ? monitorData[`PRE${groupNum}_CPR_CoolantTemp`] : '-' }}</span
+            ><span class="unit">℃</span></span
+          >
+        </div>
+        <div class="monitor-item">
+          <span class="monitor-title">排气温度:</span>
+          <span class="monitor-val"
+            ><span class="val">{{ monitorData[`PRE${groupNum}_CPR_ExhaustTemp`] ? monitorData[`PRE${groupNum}_CPR_ExhaustTemp`] : '-' }}</span
+            ><span class="unit">℃</span></span
+          >
+        </div>
+        <div class="signal-item">
+          <div class="signal"
+            ><span class="monitor-title">运行信号</span
+            ><span
+              :class="{
+                'signal-round': true,
+                'signal-round-run': monitorData[`PRE${groupNum}_MOT_Running`] == '1',
+                'signal-round-gry': monitorData[`PRE${groupNum}_MOT_Running`] != '1',
+              }"
+            ></span>
+          </div>
+          <div class="signal"
+            ><span class="monitor-title">故障信号</span
+            ><span
+              :class="{
+                'signal-round': true,
+                'signal-round-warning': monitorData[`PRE${groupNum}_MOT_Fault`] == '1',
+                'signal-round-gry': monitorData[`PRE${groupNum}_MOT_Fault`] != '1',
+              }"
+            ></span>
+          </div>
+        </div>
+      </fourBorderBg>
+      <fourBorderBg :class="`cqg${groupNum}`" :id="`cqgMonitor${groupNum}`">
+        <div class="title">{{ groupNum }}号储气罐 </div>
+        <div class="monitor-item">
+          <span class="monitor-title">气囊温度:</span>
+          <span class="monitor-val"
+            ><span class="val">{{ monitorData[`PRE${groupNum}_VLS_Temp`] ? monitorData[`PRE${groupNum}_VLS_Temp`] : '-' }}</span
+            ><span class="unit">℃</span></span
+          >
+        </div>
+        <!-- <div class="monitor-item">
+              <span class="monitor-title">气囊压力<span class="unit"></span>:</span>
+              <span class="monitor-val"><span class="val">{{ monitorData[groupNum - 1] && monitorData[groupNum - 1]['airReceiverPress'] ?
+                monitorData[groupNum - 1]['airReceiverPress'] : '-' }}</span><span class="unit">Mpa</span></span>
+            </div>
+            <div class="monitor-item">
+              <span class="monitor-title">气囊流量<span class="unit"></span>:</span>
+              <span class="monitor-val"><span class="val">{{ monitorData[groupNum - 1] && monitorData[groupNum - 1]['airReceiverFlow'] ?
+                monitorData[groupNum - 1]['airReceiverFlow'] : '-' }}</span><span class="unit">m³/k</span></span>
+            </div> -->
+      </fourBorderBg>
+    </div>
+  </div>
+  <div
+    v-show="monitorDataGroupFlag == 2"
+    id="compressorCss3D1"
+    class="threejs-Object-CSS compressorCss3D-box"
+    style="width: 100%; height: 100%; position: absolute; pointer-events: none; overflow: hidden; z-index: 3; top: 0px; left: 0px"
+  >
+    <div v-for="(groupNum, index) in monitorDataGroupNum2" :key="index" class="modal-monitor">
+      <fourBorderBg :class="`kyj${groupNum}`" :id="`nitrogenMonitor${groupNum}`">
+        <div class="title">{{ groupNum }}号空压机 </div>
+        <div class="monitor-item">
+          <span class="monitor-title">机头温度:</span>
+          <span class="monitor-val"
+            ><span class="val">{{ monitorData[`PRE${groupNum}_CPR_HeadTemp`] ? formatNum(monitorData[`PRE${groupNum}_CPR_HeadTemp`]) : '-' }}</span
+            ><span class="unit">℃</span></span
+          >
+        </div>
+        <div class="monitor-item">
+          <span class="monitor-title">冷却温度:</span>
+          <span class="monitor-val"
+            ><span class="val">{{
+              monitorData[`PRE${groupNum}_CPR_CoolantTemp`] ? formatNum(monitorData[`PRE${groupNum}_CPR_CoolantTemp`]) : '-'
+            }}</span
+            ><span class="unit">℃</span></span
+          >
+        </div>
+        <div class="monitor-item">
+          <span class="monitor-title">排气温度:</span>
+          <span class="monitor-val"
+            ><span class="val">{{
+              monitorData[`PRE${groupNum}_CPR_ExhaustTemp`] ? formatNum(monitorData[`PRE${groupNum}_CPR_ExhaustTemp`]) : '-'
+            }}</span
+            ><span class="unit">℃</span></span
+          >
+        </div>
+        <div class="signal-item">
+          <div class="signal"
+            ><span class="monitor-title">运行信号</span
+            ><span
+              :class="{
+                'signal-round': true,
+                'signal-round-run': monitorData[`PRE${groupNum}_MOT_Running`] == '1',
+                'signal-round-gry': monitorData[`PRE${groupNum}_MOT_Running`] != '1',
+              }"
+            ></span>
+          </div>
+          <div class="signal"
+            ><span class="monitor-title">故障信号</span
+            ><span
+              :class="{
+                'signal-round': true,
+                'signal-round-warning': monitorData[`PRE${groupNum}_MOT_Fault`] == '1',
+                'signal-round-gry': monitorData[`PRE${groupNum}_MOT_Fault`] != '1',
+              }"
+            ></span>
+          </div>
+        </div>
+      </fourBorderBg>
+      <fourBorderBg :class="`cqg${groupNum}`" :id="`cqgMonitor${groupNum}`">
+        <div class="title">{{ groupNum }}号储气罐 </div>
+        <div class="monitor-item">
+          <span class="monitor-title">气囊温度:</span>
+          <span class="monitor-val"
+            ><span class="val">{{ monitorData[`PRE${groupNum}_VLS_Temp`] ? formatNum(monitorData[`PRE${groupNum}_VLS_Temp`]) : '-' }}</span
+            ><span class="unit">℃</span></span
+          >
+        </div>
+        <!-- <div class="monitor-item">
+              <span class="monitor-title">气囊压力<span class="unit"></span>:</span>
+              <span class="monitor-val"><span class="val">{{ monitorData[groupNum - 1] && monitorData[groupNum - 1]['airReceiverPress'] ?
+                monitorData[groupNum - 1]['airReceiverPress'] : '-' }}</span><span class="unit">Mpa</span></span>
+            </div>
+            <div class="monitor-item">
+              <span class="monitor-title">气囊流量<span class="unit"></span>:</span>
+              <span class="monitor-val"><span class="val">{{ monitorData[groupNum - 1] && monitorData[groupNum - 1]['airReceiverFlow'] ?
+                monitorData[groupNum - 1]['airReceiverFlow'] : '-' }}</span><span class="unit">m³/k</span></span>
+            </div> -->
+      </fourBorderBg>
+    </div>
+  </div>
+  <div class="nitrogen-home">
+    <div style="position: absolute; color: #fff; top: 30px; pointer-events: auto; display: flex">
+      <span
+        class="tab-button-box"
+        :class="{ 'tab-button-box-active': monitorDataGroupFlag == 1 }"
+        @click="setMonitorGroupNum(monitorDataGroupNum1, 1)"
+        >压风系统1</span
+      >
+      <span
+        class="tab-button-box"
+        :class="{ 'tab-button-box-active': monitorDataGroupFlag == 2 }"
+        @click="setMonitorGroupNum(monitorDataGroupNum2, 2)"
+        >压风系统2</span
+      >
+    </div>
+    <div class="total-data">
+      <div class="vent-flex-row">
+        <div class="item"
+          >总流量(m³/min):<span class="val">{{
+            monitorData[`PreSys_TotalOutPipeFlow${monitorDataGroupFlag}`]
+              ? formatNum(monitorData[`PreSys_TotalOutPipeFlow${monitorDataGroupFlag}`])
+              : '-'
+          }}</span></div
+        >
+        <div class="item"
+          >总压力(bar):<span class="val">{{
+            monitorData[`PreSys_TotalOutPipePre${monitorDataGroupFlag}`]
+              ? formatNum(monitorData[`PreSys_TotalOutPipePre${monitorDataGroupFlag}`])
+              : '-'
+          }}</span></div
+        >
+      </div>
+      <div class="" style="margin-left: 30px; margin-top: 10px">
+        <div v-if="Number(monitorData[`PreSys_TotalOutPipeFlow${monitorDataGroupFlag}`]) < 0" style="color: red">总流量异常</div>
+        <div v-if="Number(monitorData[`PreSys_TotalOutPipePre${monitorDataGroupFlag}`]) < 0" style="color: red">总压力异常</div>
+      </div>
+    </div>
+    <div class="nitrogen-container">
+      <div v-if="monitorData['netStatus'] == 0" class="device-state">网络断开</div>
+      <div class="top-box">
+        <!-- 左边监测数据 -->
+        <div class="lr-box left-box">
+          <div class="left-container">
+            <div class="item item-l" v-for="(groupNum, index) in monitorDataGroupNum" :key="index">
+              <div class="monitor-box">
+                <ventBox1>
+                  <template #title>
+                    <div>{{ groupNum }}号空压机组</div>
+                  </template>
+                  <template #container>
+                    <div class="state-item" v-for="(data, index) in showMonitorData" :key="index">
+                      <div class="item-col">
+                        <span class="state-title">{{ Object.values(data)[0] }} :</span>
+                        <span class="state-val">{{
+                          monitorData[Object.keys(data)[0].replace('PRE', 'PRE' + groupNum)] >= 0
+                            ? formatNum(Number(monitorData[Object.keys(data)[0].replace('PRE', 'PRE' + groupNum)]))
+                            : '-'
+                        }}</span>
+                      </div>
+                      <div class="item-col">
+                        <span class="state-title">{{ Object.values(data)[1] }} :</span>
+                        <span class="state-val">{{
+                          monitorData[Object.keys(data)[0].replace('PRE', 'PRE' + groupNum)] >= 0
+                            ? formatNum(Number(monitorData[Object.keys(data)[0].replace('PRE', 'PRE' + groupNum)]))
+                            : '-'
+                        }}</span>
+                      </div>
+                    </div>
+                  </template>
+                </ventBox1>
+              </div>
+            </div>
+          </div>
+        </div>
+        <!-- 右边控制状态 -->
+        <div class="lr-box right-box" style="display: none">
+          <ventBox1>
+            <template #title>
+              <div>远程控制</div>
+            </template>
+            <template #container>
+              <div class="control-group">
+                <div class="control-item" v-for="groupNum in monitorDataGroupNum" :key="groupNum">
+                  <div class="control-item-title">{{ kyjs[groupNum - 1] }}</div>
+                  <div class="control-item-state">
+                    <a-switch
+                      v-model="airCompressorState[groupNum - 1][`compressRunSigF1`]"
+                      size="small"
+                      checked-children="开启"
+                      un-checked-children="关闭"
+                      :disabled="airCompressorState[groupNum - 1][`controlModel`]"
+                      @change="handlerDevice(airCompressorState[groupNum - 1])"
+                    />
+                  </div>
+                </div>
+                <div class="control-item" v-for="groupNum in monitorDataGroupNum" :key="groupNum">
+                  <div class="control-item-title">{{ cqgs[groupNum - 1] }}</div>
+                  <div class="control-item-state">
+                    <a-switch
+                      v-model="airCompressorState[groupNum - 1][`compressRunSigF1`]"
+                      size="small"
+                      checked-children="开启"
+                      un-checked-children="关闭"
+                      :disabled="airCompressorState[groupNum - 1][`controlModel`]"
+                      @change="handlerDevice(airCompressorState[groupNum - 1])"
+                    />
+                  </div>
+                </div>
+
+                <a-divider style="height: 1px; background-color: #d7d7d755" />
+                <div class="control-btn-group vent-margin-b-20">
+                  <div class="control-left-box">
+                    <div class="btn-box">
+                      <span @click="handlerDevice({ remote: true })">远程</span>
+                      <span @click="handlerDevice({ remote: false })">就地</span>
+                    </div>
+                    <div class="icon-box" :class="{ 'remote-icon-box': true }">
+                      <div class="icon"></div>
+                    </div>
+                  </div>
+                  <div class="control-right-box">
+                    <div class="control-item-title">是否开启联动</div>
+                    <div class="item-data-box">
+                      <div
+                        :class="{
+                          'state-icon': true,
+                          open: monitorData[0] && monitorData[0].linkState,
+                          close: monitorData[0] && !monitorData[0].linkState,
+                        }"
+                      >
+                      </div>
+                      <div>{{ monitorData[0] && !monitorData[0].linkState ? '不联动' : '联动' }}</div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </template>
+          </ventBox1>
+
+          <!-- <div class="control-item">
+              <div class="control-item-l">
+                <span class="round"></span>
+                <span>控制模式</span>
+              </div>
+              <div>
+                <a-switch v-model="airCompressorState[0][`controlModel`]" checked-children="就地" un-checked-children="远程"
+                  @change="handlerControlModel(airCompressorState[0])">
+                </a-switch>
+              </div>
+            </div> -->
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script lang="ts" setup name="nitrogenHome">
+  import { onMounted, onUnmounted, ref, watch } from 'vue';
+  import fourBorderBg from '../../../comment/components/fourBorderBg.vue';
+  import { mountedThree, destroy, setModelType, clearCssText } from '../nitrogen.threejs';
+  import { list } from '../nitrogen.api';
+  import ventBox1 from '/@/components/vent/ventBox1.vue';
+  import { monitorDataGroupNum1, monitorDataGroupNum2, airCompressorState, showMonitorData, monitorData } from '../nitrogen.data';
+  import { formatNum } from '/@/utils/ventutil';
+
+  const loading = ref(true);
+  const monitorDataGroupNum = ref(monitorDataGroupNum1);
+  const monitorDataGroupFlag = ref(1);
+  const kyjs = ['1号空压机', '2号空压机', '3号空压机', '4号空压机'];
+  const cqgs = ['1号储气罐', '2号储气罐', '3号储气罐', '4号储气罐'];
+
+  // https获取监测数据
+  let timer: null | NodeJS.Timeout = null;
+  async function getMonitor(flag?) {
+    if (Object.prototype.toString.call(timer) === '[object Null]') {
+      timer = await setTimeout(
+        async () => {
+          await getDataSource();
+          if (timer) {
+            timer = null;
+          }
+          await getMonitor();
+        },
+        flag ? 0 : 1000
+      );
+    }
+  }
+
+  async function getDataSource() {
+    const res = await list({ devicetype: 'forcFan', pagetype: 'normal' });
+    let dataSource = res.msgTxt[0].datalist[0];
+    // dataSource =
+    //   {
+    //     "msgType": null,
+    //     "deviceID": "1705212847586627592",
+    //     "strname": "压风机系统",
+    //     "strinstallpos": "压风机系统",
+    //     "fsectarea": "null",
+    //     "stationname": "压风机系统分站",
+    //     "deviceType": "forcFan",
+    //     "typeName": null,
+    //     "netStatus": 1,
+    //     "warnFlag": 0,
+    //     "warnLevel": null,
+    //     "warnLevel_str": null,
+    //     "warnTime": null,
+    //     "readTime": "2023-10-24 08:47:27",
+    //     "warnDes": "",
+    //     "frontGateOpenCtrl": null,
+    //     "rearGateOpenCtrl": null,
+    //     "readData": {
+    //       "PRE1_MOT_PhaseATemp": "526",
+    //       "PRE3_CPR_CoolantTemp": "12",
+    //       "PRE4_CPR_HeadTemp": "13",
+    //       "PRE2_MOT_PhaseATempAlarm": "0",
+    //       "PRE5_MOT_Fault": "0",
+    //       "PRE4_MOT_PhaseATempStop": "0",
+    //       "PRE4_CPR_LoadPre": "65",
+    //       "PRE5_CPR_LoadPre": "62",
+    //       "PRE4_MOT_CtrlMode": "1",
+    //       "PRE2_CPR_LoadorUnload": "1",
+    //       "PRE3_MOT_PhaseBTemp": "133",
+    //       "PRE1_CPR_ExhaustPre": "66",
+    //       "PRE1_MOT_PhaseATempAlarm": "0",
+    //       "PRE5_CPR_UnLoadPre": "69",
+    //       "PRE4_MOT_PhaseATemp": "129",
+    //       "PRE5_MOT_PhaseCTemp": "685",
+    //       "PRE5_MOT_PhaseATemp": "681",
+    //       "PRE5_VLS_Temp": "590",
+    //       "PRE1_CPR_LoadTime": "8344",
+    //       "PRE2_CPR_LoadTime": "5553",
+    //       "PRE4_CPR_LoadorUnload": "0",
+    //       "PRE5_MOT_PhaseATempAlarm": "0",
+    //       "PRE3_CPR_LoadTime": "4511",
+    //       "PRE5_CPR_LoadTime": "6032",
+    //       "PRE1_MOT_PhaseATempStop": "0",
+    //       "PRE2_MOT_CompProtFault": "0",
+    //       "PRE5_MOT_PhaseATempStop": "0",
+    //       "PRE3_MOT_PhaseATempStop": "0",
+    //       "PRE1_VLS_Temp": "436",
+    //       "PRE2_CPR_ExhaustPre": "71",
+    //       "PRE5_MOT_CtrlMode": "1",
+    //       "PRE3_CPR_ExhaustTemp": "10",
+    //       "PRE3_MOT_TotalRunTime": "5342",
+    //       "P RE2_MOT_PhaseATemp": "541",
+    //       "PRE4_MOT_PhaseCTemp": "130",
+    //       "PRE4_MOT_PhaseATempAlarm": "0",
+    //       "timestamp": "1698108447720",
+    //       "PRE3_VLS_Temp": "219",
+    //       "PRE1_HostorLoc": "0",
+    //       "PRE2_MOT_Running": "1",
+    //       "PRE1_CPR_LoadPre": "65",
+    //       "PRE1_MOT_Running": "1",
+    //       "PRE4_MOT_Fault": "0",
+    //       "PRE2_CPR_LoadPre": "65",
+    //       "PRE3_MOT_Running": "0",
+    //       "PRE4_MOT_Running": "0",
+    //       "PRE3_CPR_LoadPre": "65",
+    //       "PRE1_MOT_CtrlMode": "1",
+    //       "PRE3_MOT_CtrlMode": "1",
+    //       "PRE3_CPR_LoadorUnload": "0",
+    //       "PRE2_MOT_PhaseCTemp": "550",
+    //       "PRE1_CPR_CoolantTemp": "71",
+    //       "PRE1_MOT_PhaseBTemp": "539",
+    //       "PRE3_MOT_PhaseATempAlarm": "0",
+    //       "PRE5_MOT_Running": "1",
+    //       "PRE1_MOT_Fault": "0",
+    //       "PRE4_CPR_ExhaustPre": "66",
+    //       "PRE4_CPR_CoolantTemp": "12",
+    //       "PRE5_CPR_ExhaustTemp": "76",
+    //       "PRE2_CPR_HeadTemp": "89",
+    //       "PRE3_MOT_PhaseCTemp": "135",
+    //       "PRE4_CPR_LoadTime": "5084",
+    //       "sign": "0",
+    //       "PRE1_CPR_UnLoadPre": "72",
+    //       "PRE4_HostorLoc": "0",
+    //       "PRE4_MOT_CompProtFault": "0",
+    //       "PRE1_CPR_LoadorUnload": "1",
+    //       "PRE3_CPR_ExhaustPre": "68",
+    //       "PRE2_CPR_ExhaustTemp": "77",
+    //       "PRE2_MOT_PhaseATempStop": "0",
+    //       "PRE5_MOT_CompProtFault": "0",
+    //       "PRE2_MOT_Fault": "0",
+    //       "PRE5_MOT_PhaseBTemp": "676",
+    //       "PRE3_MOT_PhaseATemp": "134",
+    //       "PRE4_MOT_PhaseBTemp": "130",
+    //       "PRE2_CPR_CoolantTemp": "66",
+    //       "PRE3_HostorLoc": "0",
+    //       "PRE4_MOT_TotalRunTime": "5104",
+    //       "PRE1_MOT_TotalRunTime": "8416",
+    //       "PRE3_MOT_CompProtFault": "0",
+    //       "PRE3_MOT_Fault": "0",
+    //       "PRE4_CPR_UnLoadPre": "72",
+    //       "PRE1_CPR_HeadTemp": "97",
+    //       "PRE2_HostorLoc": "0",
+    //       "PRE2_MOT_PhaseBTemp": "562",
+    //       "PRE3_CPR_HeadTemp": "13",
+    //       "PRE2_MOT_TotalRunTime": "5586",
+    //       "PRE5_CPR_HeadTemp": "95",
+    //       "PRE3_CPR_UnLoadPre": "72",
+    //       "PRE4_VLS_Temp": "166",
+    //       "PRE5_CPR_CoolantTemp": "70",
+    //       "PRE1_MOT_CompProtFault": "0",
+    //       "PRE5_MOT_TotalRunTime": "7825",
+    //       "PRE2_MOT_CtrlMode": "1",
+    //       "PRE5_CPR_ExhaustPre": "68",
+    //       "PRE1_MOT_PhaseCTemp": "544",
+    //       "PRE5_CPR_LoadorUnload": "1",
+    //       "PRE2_CPR_UnLoadPre": "72",
+    //       "PRE4_CPR_ExhaustTemp": "11",
+    //       "PRE2_VLS_Temp": "445",
+    //       "isRun": "-2",
+    //       "PRE5_HostorLoc": "0",
+    //       "PRE1_CPR_ExhaustTemp": "68"
+    //     },
+    //     "readDataDes": null,
+    //     "summaryHour": [],
+    //     "summaryDay": [],
+    //     "history": [],
+    //     "totalInfo": null,
+    //     "sign": null,
+    //     "cameras": [],
+    //     "links": [],
+    //     "other1": null,
+    //     "other2": null,
+    //     "other3": null
+    //   }
+    if (dataSource) {
+      monitorData.value = Object.assign(dataSource, dataSource.readData);
+    }
+    // dataSource.forEach((data, index) => {
+    //   const item = data.readData;
+    //   Object.assign(item, data);
+    //   item.compressRunSigF1 = item.compressRunSigF1 ? true : false
+    //   airCompressorState.value[index].id = item.id
+    //   airCompressorState.value[index].compressRunSigF1 = item.compressRunSigF1
+    //   airCompressorState.value[index].controlModel = item.controlModel === 'LOC' ? true : false
+    //   monitorData.value[index] = item
+    // });
+    // monitorDataGroupNum.value = monitorData.value.length
+    loading.value = false;
+  }
+
+  function setMonitorGroupNum(num, flag) {
+    monitorDataGroupNum.value = num;
+    monitorDataGroupFlag.value = flag;
+  }
+
+  function handlerDevice(data) {
+    // if (data.length < 1) return
+    // handleAirCompressor({ id: data.id, compressRunF1: data.compressRunSigF1 }).then(res => {
+    //   if (res.success) {
+    //     message.success('操作成功')
+    //   } else {
+    //     message.warning(data.msg)
+    //   }
+    // })
+  }
+  function resetDevice(data) {}
+
+  function handlerControlModel(data) {}
+
+  watch(monitorDataGroupFlag, (newVal) => {
+    if (newVal == 1) {
+      setModelType('compressor1');
+    }
+    if (newVal == 2) {
+      setModelType('compressor2');
+    }
+  });
+
+  onMounted(async () => {
+    mountedThree(monitorDataGroupNum1, monitorDataGroupNum2).then(async () => {
+      await getMonitor(true);
+      setModelType('compressor1');
+    });
+  });
+
+  onUnmounted(() => {
+    destroy();
+    if (timer) {
+      clearTimeout(timer);
+      timer = undefined;
+    }
+  });
+</script>
+
+<style lang="less" scoped>
+  @ventSpace: zxm;
+
+  .nitrogen-home {
+    width: 100%;
+    height: 100%;
+    display: flex;
+    justify-content: center;
+    position: relative;
+    .total-data {
+      position: absolute;
+      color: #e4cd00;
+      z-index: 9;
+      top: 50px;
+      right: 30px;
+      //display: flex;
+      font-size: 18px;
+      .item {
+        width: 200px;
+        margin-left: 30px;
+        .val {
+          color: #00d8ff;
+        }
+      }
+    }
+  }
+
+  .compressorCss3D-box {
+    .modal-monitor {
+      position: absolute;
+      left: 0px;
+      top: 0px;
+    }
+
+    &:deep(.win) {
+      margin: 0 !important;
+      background: #00000044;
+    }
+
+    &:deep(.main) {
+      .title {
+        height: 34px;
+        text-align: center;
+        font-weight: 600;
+        color: #7af5ff;
+        // background-image: url('../../../assets/img/yfj/light.png');
+        background-repeat: no-repeat;
+        background-position-x: center;
+        background-position-y: 100%;
+        background-size: 80%;
+        font-size: 16px;
+      }
+
+      .monitor-item {
+        display: flex;
+        flex-direction: row;
+        width: auto;
+        margin-bottom: 3px;
+        .monitor-val {
+          color: #ffb700;
+          display: flex;
+          width: auto;
+
+          .val {
+            width: 80px;
+            font-size: 14px;
+          }
+
+          .unit {
+            color: #ffffffbb;
+            font-size: 14px;
+          }
+        }
+      }
+
+      .monitor-title {
+        width: 100px;
+        color: #7af5ff;
+        font-weight: 400;
+        font-size: 14px;
+      }
+
+      .signal-item {
+        display: flex;
+        justify-content: space-between;
+
+        // margin-bottom: 5px;
+        .signal-round {
+          display: inline-block;
+          width: 8px;
+          height: 8px;
+          border-radius: 50%;
+          margin: 0 10px;
+          position: relative;
+
+          &::after {
+            display: block;
+            content: '';
+            position: absolute;
+            width: 12px;
+            height: 12px;
+            top: -2px;
+            left: -2px;
+            border-radius: 50%;
+          }
+        }
+
+        .signal-round-gry {
+          background-color: #858585;
+
+          &::after {
+            background-color: #85858544;
+            box-shadow: 0 0 1px 1px #85858599;
+          }
+        }
+
+        .signal-round-run {
+          background-color: #67fc00;
+
+          &::after {
+            background-color: #67fc0044;
+            box-shadow: 0 0 1px 1px #c6ff77;
+          }
+        }
+
+        .signal-round-warning {
+          background-color: #e9170b;
+
+          &::after {
+            background-color: #e9170b44;
+            box-shadow: 0 0 1px 1px #e9170b;
+          }
+        }
+      }
+    }
+  }
+
+  .nitrogen-home {
+    width: 100%;
+    height: calc(100% - 100px);
+    position: fixed;
+    z-index: 99;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+    pointer-events: none;
+    top: 60px;
+    .nitrogen-container {
+      width: 100%;
+      height: calc(100%);
+      display: flex;
+      justify-content: space-between;
+      margin-bottom: 100px;
+      position: relative;
+      .device-state {
+        width: 100%;
+        position: absolute;
+        top: 70px;
+        color: #e90000;
+        display: flex;
+        justify-content: center;
+        font-size: 20px;
+      }
+      .top-box {
+        width: 100%;
+        padding: 10px;
+        overflow: hidden;
+        display: flex;
+        justify-content: space-between;
+
+        .lr-box {
+          display: flex;
+          flex-direction: column;
+          position: relative;
+          z-index: 9999;
+          pointer-events: auto;
+        }
+
+        .item {
+          width: 285px;
+          height: auto;
+          position: relative;
+          border-radius: 5px;
+          margin-top: 10px;
+          margin-bottom: 0px;
+          pointer-events: auto;
+          color: #fff;
+          overflow: hidden;
+
+          .control-item {
+            height: auto;
+            min-height: 35px;
+            display: flex;
+            flex-direction: row;
+            justify-content: space-between;
+            align-items: center;
+            padding: 5px;
+            margin: 0 10px 0 3px;
+            pointer-events: auto;
+            background: linear-gradient(to right, #0063cd22, #0063cd04);
+
+            margin-bottom: 5px;
+            border-width: 1px;
+            border-style: dashed;
+
+            border-image: linear-gradient(to right, #008ccd66, #0063cd04) 1 1;
+            border-radius: 5px;
+
+            &:last-child {
+              margin-bottom: 0;
+            }
+
+            .control-item-l {
+              display: flex;
+              align-items: center;
+              font-size: 14px;
+
+              .round {
+                display: inline-block;
+                width: 3px;
+                height: 3px;
+                padding: 1px;
+                border-radius: 50%;
+                background-color: #3df6ff;
+                margin-right: 5px;
+                box-shadow: 0 0 1px 1px #64f7ff;
+              }
+            }
+
+            .control-item-r {
+              text-align: right;
+            }
+
+            .button-box {
+              position: relative;
+              padding: 5px;
+              border: 1px transparent solid;
+              background-clip: border-box;
+              border-radius: 5px;
+              margin-left: 8px;
+            }
+
+            .a-button {
+              pointer-events: auto;
+            }
+
+            &::v-deep .a-button--mini {
+              padding: 6px 10px;
+            }
+
+            &::v-deep .a-button--mini.is-round {
+              padding: 6px 10px;
+            }
+          }
+
+          .base-title {
+            width: calc(100% - 60px);
+            text-align: center;
+            color: #00d8ff;
+          }
+
+          .state-item {
+            display: flex;
+            flex-direction: row;
+            padding: 5px;
+
+            .item-col {
+              width: 50%;
+              display: flex;
+              justify-content: center;
+              align-items: center;
+              padding-right: 4px;
+
+              .state-title {
+                color: #ffffffcc;
+                flex: 9;
+                font-size: 14px;
+
+                .unit {
+                  // color: #ffffffbb;
+                }
+              }
+
+              .state-val {
+                flex: 1;
+                color: #e4a300;
+                margin-right: 5px;
+                text-align: right;
+                font-size: 14px;
+              }
+            }
+          }
+
+          .signal-box {
+            margin: 5px 0;
+            display: flex;
+            align-items: center;
+
+            .signal-title {
+              color: #7af5ff;
+              margin: 0 5px;
+            }
+
+            &:last-child {
+              margin-right: 0px;
+            }
+          }
+
+          .list-item {
+            padding: 0 10px;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+
+            .item-data-key {
+              color: #ffffff99;
+            }
+          }
+
+          .item-data-box {
+            color: #fff;
+
+            .state-icon {
+              display: inline-block;
+              width: 12px;
+              height: 12px;
+              border-radius: 12px;
+            }
+
+            .open {
+              border: 5px solid #133a56;
+              background: #4ecb73;
+            }
+
+            .close {
+              border: 5px solid #192961;
+              background: #6d7898;
+            }
+          }
+        }
+
+        .item-l {
+          width: 335px;
+
+          .monitor-box {
+            // width: 335px;
+            background-color: #ffffff05;
+            // margin-left: 2px;
+            // border-radius: 5px;
+            // backdrop-filter: blur(10px);
+          }
+        }
+
+        .right-box {
+          width: 330px;
+          .control-group {
+            display: flex;
+            // justify-content: space-around;
+            flex-wrap: wrap;
+            .control-item {
+              display: flex;
+              flex-direction: column;
+              justify-content: center;
+              align-items: center;
+              padding: 0 4px;
+              .control-item-title {
+                color: #a6dce9;
+                position: relative;
+                top: 5px;
+              }
+              .control-item-state {
+                width: 94px;
+                height: 47px;
+                background: url('/@/assets/images/vent/control-switch-bg.png');
+                display: flex;
+                justify-content: center;
+                align-items: center;
+                color: #fff;
+              }
+
+              .button-box {
+                position: relative;
+                padding: 5px;
+                border: 1px transparent solid;
+                background-clip: border-box;
+                border-radius: 5px;
+                margin-left: 8px;
+              }
+
+              .a-button {
+                pointer-events: auto;
+              }
+
+              &::v-deep .a-button--mini {
+                padding: 6px 10px;
+              }
+
+              &::v-deep .a-button--mini.is-round {
+                padding: 6px 10px;
+              }
+            }
+          }
+          .control-btn-group {
+            width: 100%;
+            display: flex;
+            flex-direction: row;
+            justify-content: space-between;
+            align-items: center;
+            .control-left-box {
+              display: flex;
+              flex-direction: column;
+              justify-content: center;
+              align-items: center;
+              padding: 0 20px;
+              .btn-box {
+                width: 100px;
+                color: #fff;
+                display: flex;
+                justify-content: space-between;
+                span {
+                  display: inline-block;
+                  padding: 2px 8px;
+                  background: #007099;
+                  border-radius: 4px;
+                  border: 1px solid rgb(125, 230, 249);
+                  cursor: pointer;
+                  &:hover {
+                    background: #005574;
+                  }
+                }
+              }
+              .icon-box {
+                width: 60px;
+                height: 60px;
+                border-radius: 30px;
+                border: 2px solid #00bcdd;
+                box-shadow: 0 0 20px #ffffff88;
+                display: flex;
+                justify-content: center;
+                align-items: center;
+                margin-top: 20px;
+
+                .icon {
+                  width: 18px;
+                  height: 18px;
+                  border-radius: 9px;
+                  border: 3px solid #d7f9ff;
+                  position: relative;
+                  background: #00bcdd;
+                  &::before {
+                    position: absolute;
+                    content: '';
+                    width: 2px;
+                    height: 12px;
+                    background-color: #00bcdd;
+                    left: 6px;
+                    top: -16px;
+                  }
+                  &::after {
+                    position: absolute;
+                    content: '';
+                    width: 2px;
+                    height: 12px;
+                    left: 6px;
+                    top: 17px;
+                    background-color: #00d9ff;
+                  }
+                }
+              }
+              .remote-icon-box {
+                transform: rotate(30deg);
+                animation: iconRotate 1s linear;
+              }
+              .remote-icon-box1 {
+                transform: rotate(-30deg);
+                animation: iconRotate1 1s linear;
+              }
+
+              @keyframes iconRotate {
+                from {
+                  transform: rotate(-30deg);
+                }
+                to {
+                  transform: rotate(30deg);
+                }
+              }
+              @keyframes iconRotate1 {
+                from {
+                  transform: rotate(30deg);
+                }
+                to {
+                  transform: rotate(-30deg);
+                }
+              }
+            }
+            .control-right-box {
+              width: 100px;
+              color: #fff;
+              height: 80px;
+              justify-content: space-between;
+              align-items: center;
+              .btn {
+                margin-bottom: 30px;
+              }
+            }
+          }
+        }
+
+        .left-box {
+          height: calc(100%);
+          overflow-x: hidden;
+          overflow-y: auto;
+          pointer-events: auto;
+          direction: rtl;
+          .left-container {
+            direction: ltr;
+          }
+          .control-item {
+            height: 36px;
+          }
+        }
+      }
+    }
+  }
+  .tab-button-box {
+    display: inline-block;
+    position: relative;
+    padding: 5px;
+    // border: 1px transparent solid;
+    border-radius: 5px;
+    margin-left: 8px;
+    margin-right: 8px;
+    width: auto;
+    // height: 40px;
+    // border: 1px solid #65dbea;
+    height: 35px !important;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    color: #fff;
+    padding: 0 15px 5px 15px;
+    cursor: pointer;
+    &:hover {
+      background: linear-gradient(#2cd1ff55, #1eb0ff55);
+    }
+    &::before {
+      width: calc(100% - 6px);
+      height: 27px;
+      content: '';
+      position: absolute;
+      top: 3px;
+      right: 0;
+      left: 3px;
+      bottom: 0;
+      z-index: -1;
+      border-radius: inherit; /*important*/
+      background: linear-gradient(#1fa6cb, #127cb5);
+    }
+    &::after {
+      width: calc(100% + 32px);
+      height: 10px;
+      content: '';
+      position: absolute;
+      top: 28px;
+      right: 0;
+      left: -16px;
+      bottom: 0;
+      z-index: -1;
+      border-radius: inherit; /*important*/
+      background: url('/@/assets/images/vent/short-light.png') no-repeat;
+      background-position: center;
+      background-size: 100%;
+      z-index: 999;
+    }
+  }
+
+  .tab-button-box-active {
+    border: 1px solid #66989e !important;
+    &:hover {
+      background: none !important;
+    }
+    &::before {
+      background: linear-gradient(#1fa6cbcc, #127cb5cc) !important;
+    }
+  }
+</style>

+ 62 - 0
src/views/vent/sys/resources/DetailModal.vue

@@ -0,0 +1,62 @@
+<template>
+  <BasicModal v-bind="$attrs" @register="registerModal" :title="title" @ok="handleSubmit" width="900px" destroyOnClose>
+    <BasicForm @register="registerForm" />
+  </BasicModal>
+</template>
+<script lang="ts" setup>
+  import { ref, computed, unref } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, useForm } from '/@/components/Form/index';
+  import { formSchema } from './file.data';
+  import { update, add } from './file.api';
+  import { saveModel } from '/@/utils/threejs/util';
+
+  // 声明Emits
+  const emit = defineEmits(['register', 'success']);
+  const isUpdate = ref(true);
+  //表单配置
+  const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
+    schemas: formSchema,
+    showActionButtonGroup: false,
+  });
+  //表单赋值
+  const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
+    //重置表单
+    await resetFields();
+    setModalProps({ confirmLoading: false });
+    isUpdate.value = !!data?.isUpdate;
+    if (unref(isUpdate)) {
+      //表单赋值
+      await setFieldsValue({
+        ...data.record,
+      });
+    }
+  });
+  //设置标题
+  const title = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));
+  //表单提交事件
+  async function handleSubmit() {
+    try {
+      let values = await validate();
+      setModalProps({ confirmLoading: true });
+      //提交表单
+      const fileName = values['path'].replace(/(.*\/)*([^.]+).*/gi, '$2');
+      const arr = fileName.split('_');
+      const version = new Date().getTime();
+
+      if (values['id']) {
+        await update({ ...values, fileName: arr[0], version, biz: 'webfile' });
+      } else {
+        await add({ ...values, fileName: arr[0], version, biz: 'webfile' });
+      }
+
+      //关闭弹窗
+      closeModal();
+      saveModel(fileName, values.path, version);
+    } finally {
+      //刷新列表
+      emit('success');
+      setModalProps({ confirmLoading: false });
+    }
+  }
+</script>

+ 31 - 0
src/views/vent/sys/resources/file.api.ts

@@ -0,0 +1,31 @@
+import { defHttp } from '/@/utils/http/axios';
+
+enum Api {
+  list = '/ventanaly-device/safety/ventanalyWebfile/list',
+  add = '/ventanaly-device/safety/ventanalyWebfile/add',
+  edit = '/ventanaly-device/safety/ventanalyWebfile/edit',
+  delete = '/ventanaly-device/safety/ventanalyWebfile/delete',
+}
+
+/**
+ * 查询租户列表
+ * @param params
+ */
+export const getList = (params) => {
+  return defHttp.get({ url: Api.list, params });
+};
+
+export const add = (params) => {
+  return defHttp.post({ url: Api.add, params });
+};
+/**
+ * 保存或者更新通告
+ * @param params
+ */
+export const update = (params) => {
+  return defHttp.put({ url: Api.edit, params });
+};
+
+export const deleteFile = (params) => {
+  return defHttp.delete({ url: Api.delete, params });
+};

+ 90 - 0
src/views/vent/sys/resources/file.data.ts

@@ -0,0 +1,90 @@
+import { BasicColumn, FormSchema } from '/@/components/Table';
+
+export const columns: BasicColumn[] = [
+  {
+    title: '文件描述',
+    width: 150,
+    dataIndex: 'des',
+  },
+  {
+    title: '文件名',
+    width: 150,
+    dataIndex: 'fileName',
+  },
+  {
+    title: '文件类型',
+    dataIndex: 'fileType',
+    width: 140,
+  },
+  {
+    title: '文件',
+    width: 150,
+    dataIndex: 'path',
+  },
+  // {
+  //   title: '操作',
+  //   width: 150,
+  //   dataIndex: 'operation',
+  // },
+];
+export const searchFormSchema: FormSchema[] = [
+  {
+    label: '文件名',
+    field: 'fileName',
+    component: 'Input',
+    colProps: { span: 6 },
+  },
+  {
+    label: '文件描述',
+    field: 'des',
+    component: 'Input',
+    colProps: { span: 6 },
+  },
+];
+export const formSchema: FormSchema[] = [
+  {
+    field: 'id',
+    label: 'id',
+    component: 'Input',
+    show: false,
+  },
+  // {
+  //   field: 'fileName',
+  //   label: '文件名',
+  //   component: 'Input',
+  // },
+  {
+    field: 'des',
+    label: '文件描述',
+    component: 'Input',
+  },
+  {
+    field: 'fileType',
+    label: '文件类型',
+    component: 'RadioGroup',
+    defaultValue: 1,
+    componentProps: {
+      options: [
+        {
+          label: '图片',
+          value: 'image',
+        },
+        {
+          label: '模型',
+          value: 'modal',
+        },
+      ],
+    },
+  },
+  {
+    field: 'path',
+    label: '上传文件',
+    component: 'JUpload',
+    componentProps: {
+      maxCount: 1,
+      fileMax: 50,
+      bizPath: 'webfile',
+      change: (value) => {},
+    },
+  },
+];

+ 114 - 0
src/views/vent/sys/resources/index.vue

@@ -0,0 +1,114 @@
+<template>
+  <div class="setting-box">
+    <BasicTable @register="registerTable" :dataSource="dataSource">
+      <template #tableTitle>
+        <a-button type="primary" @click="handleCreate"> 新增</a-button>
+      </template>
+      <template #action="{ record }">
+        <a class="table-action-link" @click="handleEdit(record)">编辑</a>
+        <a-popconfirm title="确定删除?" @confirm="handleDelete(record)">
+          <a class="table-action-link">删除</a>
+        </a-popconfirm>
+        <a class="table-action-link" @click="handleUpload(record)">下载</a>
+      </template>
+    </BasicTable>
+  </div>
+  <DetailModal @register="register" @success="saveAndUpdate" />
+</template>
+<script lang="ts" name="system-setting" setup>
+  import { ref, onMounted } from 'vue';
+  import { BasicTable } from '/@/components/Table';
+  import { useListPage } from '/@/hooks/system/useListPage';
+  import DetailModal from './DetailModal.vue';
+  import { useModal } from '/@/components/Modal';
+  import { columns, searchFormSchema } from './file.data';
+  import { getList, deleteFile } from './file.api';
+  import { useGlobSetting } from '/@/hooks/setting';
+  const globSetting = useGlobSetting();
+  const baseUploadUrl = globSetting.uploadUrl;
+
+  let urlStr = '';
+  if (import.meta.env.PROD) {
+    urlStr = VUE_APP_URL.baseUrl;
+  } else {
+    urlStr = baseUploadUrl || '';
+  }
+  const dataSource = ref<any[]>([]);
+
+  const [register, { openModal: openDetail }] = useModal();
+
+  const { tableContext } = useListPage({
+    tableProps: {
+      columns,
+      // dataSource: dataSource,
+      api: getList,
+      showIndexColumn: false,
+      bordered: true,
+      showActionColumn: true,
+      formConfig: {
+        showAdvancedButton: true,
+        // labelWidth: 100,
+        labelAlign: 'left',
+        labelCol: {
+          xs: 24,
+          sm: 24,
+          md: 24,
+          lg: 9,
+          xl: 7,
+          xxl: 5,
+        },
+        schemas: searchFormSchema as any[],
+      },
+      fetchSetting: {
+        listField: 'records',
+      },
+      beforeFetch: (params) => {},
+    },
+  });
+  const [registerTable, { reload }] = tableContext;
+
+  // async function getDataSource() {
+  //   const result = await getList({})
+  //   if(result && result.records && result.records.length > 0){
+  //     dataSource.value = result.records
+  //   }
+  // }
+
+  async function saveAndUpdate() {
+    // await getDataSource()
+    reload();
+  }
+
+  function handleCreate() {
+    openDetail(true, {
+      isUpdate: false,
+    });
+  }
+
+  function handleEdit(record) {
+    openDetail(true, {
+      isUpdate: true,
+      record,
+    });
+  }
+
+  function handleDelete(record) {
+    deleteFile({ id: record['id'] });
+  }
+
+  function handleUpload(record) {}
+
+  onMounted(async () => {});
+</script>
+<style lang="less" scoped>
+  .setting-box {
+    margin: 10px 8px;
+    height: calc(100% - 72px);
+    padding-bottom: 10px;
+    border: 1px solid #44d3ff70;
+    border-radius: 2px;
+    box-shadow: 0 0 20px #44b4ff33 inset;
+    background-color: #ffffff11;
+    overflow-y: auto;
+  }
+</style>

Some files were not shown because too many files changed in this diff