csk-gis-frame-work 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (636) hide show
  1. package/baseSetting/config/mapConfig.js +48 -0
  2. package/baseSetting/gis-data/examples-data/3DTile/Tileset/tileset.json +124 -0
  3. package/baseSetting/gis-data/examples-data/client-analysis/buffer-hash-4.json +1 -0
  4. package/baseSetting/gis-data/examples-data/client-analysis/point.json +47 -0
  5. package/baseSetting/gis-data/examples-data/echarts/griddata.js +3 -0
  6. package/baseSetting/gis-data/examples-data/echarts/line-bus.json +1 -0
  7. package/baseSetting/gis-data/examples-data/echarts/weibo.geojson +1 -0
  8. package/baseSetting/gis-data/examples-data/echarts/weibo.json +1 -0
  9. package/baseSetting/gis-data/examples-data/echartsgl/beijing/buildings.xml +1 -0
  10. package/baseSetting/gis-data/examples-data/echartsgl/newyork/buildings.json +17178 -0
  11. package/baseSetting/gis-data/examples-data/echartsgl/shenzhen//346/267/261/345/234/263/350/275/250/350/277/271/347/272/277.json +24 -0
  12. package/baseSetting/gis-data/examples-data/echartsgl/shenzhen//351/201/223/350/267/25703.json +1949 -0
  13. package/baseSetting/gis-data/examples-data/geojson/animate-marker.json +15007 -0
  14. package/baseSetting/gis-data/examples-data/geojson/arc.js +256 -0
  15. package/baseSetting/gis-data/examples-data/geojson/chiacgo_bounds.geojson +9 -0
  16. package/baseSetting/gis-data/examples-data/geojson/china-city.geojson +355 -0
  17. package/baseSetting/gis-data/examples-data/geojson/china-xian.geojson +2428 -0
  18. package/baseSetting/gis-data/examples-data/geojson/china.geojson +42 -0
  19. package/baseSetting/gis-data/examples-data/geojson/countries.geojson +181 -0
  20. package/baseSetting/gis-data/examples-data/geojson/line-string.json +1020 -0
  21. package/baseSetting/gis-data/examples-data/geojson/washington_bounds.geojson +6 -0
  22. package/baseSetting/gis-data/examples-data/geojson/washington_point.geojson +153 -0
  23. package/baseSetting/gis-data/examples-data/geojson/wuhan_bounds.geojson +29 -0
  24. package/baseSetting/gis-data/examples-data/kml/Earthquake_2012.js +203 -0
  25. package/baseSetting/gis-data/examples-data/kml/KML_Samples.kml +915 -0
  26. package/baseSetting/gis-data/examples-data/mapbox/changestyle.json +2980 -0
  27. package/baseSetting/gis-data/examples-data/mapbox/sprite.json +3634 -0
  28. package/baseSetting/gis-data/examples-data/mapv/china-point.geojson +2 -0
  29. package/baseSetting/gis-data/examples-data/mapv/china-point.json +2 -0
  30. package/baseSetting/gis-data/examples-data/mapv/china.geojson +40 -0
  31. package/baseSetting/gis-data/examples-data/mapv/china.json +40 -0
  32. package/baseSetting/gis-data/examples-data/model/Airplane/Airplane.dae +333 -0
  33. package/baseSetting/gis-data/examples-data/model/Airplane/Airplane.gltf +802 -0
  34. package/baseSetting/gis-data/examples-data/model/fireExtinguisher.gltf +455 -0
  35. package/baseSetting/gis-data/sources_layers.js +2002 -0
  36. package/baseSetting/images/map/done.png +0 -0
  37. package/baseSetting/images/map/error.png +0 -0
  38. package/baseSetting/images/map/invalid.png +0 -0
  39. package/baseSetting/images/map/map.png +0 -0
  40. package/baseSetting/images/map/point.png +0 -0
  41. package/baseSetting/images/map/todo.png +0 -0
  42. package/baseSetting/style/DevMapConfig.js +33 -0
  43. package/baseSetting/style/getDefaultFonts.py +23 -0
  44. package/baseSetting/utils/TokenUtils.js +15 -0
  45. package/index.js +42 -0
  46. package/mapboxgl/js/common/AnnotationLayer.js +341 -0
  47. package/mapboxgl/js/common/BoundaryLayer.js +271 -0
  48. package/mapboxgl/js/common/ClusterLayer.js +498 -0
  49. package/mapboxgl/js/common/FlowLayer.js +234 -0
  50. package/mapboxgl/js/common/FlowingLayer.js +325 -0
  51. package/mapboxgl/js/common/HeatmapLayer.js +280 -0
  52. package/mapboxgl/js/common/ILayer.js +89 -0
  53. package/mapboxgl/js/common/LocationLayer.js +791 -0
  54. package/mapboxgl/js/common/PulserLayer.js +244 -0
  55. package/mapboxgl/js/common/SelectionLayer.js +315 -0
  56. package/mapboxgl/js/common/SimpleCircleLayer.js +465 -0
  57. package/mapboxgl/js/common/SimpleFillLayer.js +475 -0
  58. package/mapboxgl/js/common/SimpleLineLayer.js +430 -0
  59. package/mapboxgl/js/common/SimpleMarkerLayer.js +468 -0
  60. package/mapboxgl/js/common/StatsCircleLayer.js +351 -0
  61. package/mapboxgl/js/common/TrackingLayer.js +845 -0
  62. package/mapboxgl/js/common/VideoClusterLayer.js +539 -0
  63. package/mapboxgl/js/common/VideoLayer.js +334 -0
  64. package/mapboxgl/js/drainer/DrainEntityAnalystProvider.js +550 -0
  65. package/mapboxgl/js/drainer/DrainEntityProvider.js +557 -0
  66. package/mapboxgl/js/drainer/DrainEntityStatsLayer.js +144 -0
  67. package/mapboxgl/js/drainer/DrainUnitLayer.js +130 -0
  68. package/mapboxgl/js/drainer/DrainageEntityLayer.js +145 -0
  69. package/mapboxgl/js/drainer/DrainageEntityProvider.js +222 -0
  70. package/mapboxgl/js/drainer/DrainageUnitFlowLayer.js +137 -0
  71. package/mapboxgl/js/drainer/DrainageUnitlineLayer.js +154 -0
  72. package/mapboxgl/js/drainer/DrainageUnitlineProvider.js +140 -0
  73. package/mapboxgl/js/drainer/DrainerSearchProvider.js +274 -0
  74. package/mapboxgl/js/draw/CircleDrawing.js +238 -0
  75. package/mapboxgl/js/draw/DrawingProvider.js +533 -0
  76. package/mapboxgl/js/draw/DynamicBuffer.js +220 -0
  77. package/mapboxgl/js/draw/PointDrawing.js +189 -0
  78. package/mapboxgl/js/draw/PolygonDrawing.js +538 -0
  79. package/mapboxgl/js/draw/PolylineDrawing.js +597 -0
  80. package/mapboxgl/js/draw/RectangleDrawing.js +217 -0
  81. package/mapboxgl/js/draw/SplitPoylgon.js +214 -0
  82. package/mapboxgl/js/draw/mapConfig.js +240 -0
  83. package/mapboxgl/js/dynamic/BuildingsiteLayer.js +179 -0
  84. package/mapboxgl/js/dynamic/BusinessProvider.js +547 -0
  85. package/mapboxgl/js/dynamic/DefectLayer.js +137 -0
  86. package/mapboxgl/js/dynamic/EventLayer.js +151 -0
  87. package/mapboxgl/js/dynamic/StaffLayer.js +233 -0
  88. package/mapboxgl/js/dynamic/StoreLayer.js +143 -0
  89. package/mapboxgl/js/dynamic/VehicleLayer.js +236 -0
  90. package/mapboxgl/js/dynamic/WorkorderLayer.js +110 -0
  91. package/mapboxgl/js/editor/DeleteMarkerLayer.js +184 -0
  92. package/mapboxgl/js/editor/EditorProvider.js +2270 -0
  93. package/mapboxgl/js/editor/SurveyProvider.js +253 -0
  94. package/mapboxgl/js/equipment/AlarmLayer.js +117 -0
  95. package/mapboxgl/js/equipment/EquipCODLayer.js +119 -0
  96. package/mapboxgl/js/equipment/EquipDoorLayer.js +119 -0
  97. package/mapboxgl/js/equipment/EquipFloodedLayer.js +118 -0
  98. package/mapboxgl/js/equipment/EquipFlowLayer.js +119 -0
  99. package/mapboxgl/js/equipment/EquipFlowingLayer.js +103 -0
  100. package/mapboxgl/js/equipment/EquipLiquidLayer.js +121 -0
  101. package/mapboxgl/js/equipment/EquipNh3Layer.js +119 -0
  102. package/mapboxgl/js/equipment/EquipOtherLayer.js +123 -0
  103. package/mapboxgl/js/equipment/EquipPumpLayer.js +119 -0
  104. package/mapboxgl/js/equipment/EquipRaingaugeLayer.js +116 -0
  105. package/mapboxgl/js/equipment/EquipSpeedLayer.js +119 -0
  106. package/mapboxgl/js/equipment/EquipWellLayer.js +119 -0
  107. package/mapboxgl/js/equipment/EquipmentLayer.js +116 -0
  108. package/mapboxgl/js/equipment/EquipmentProvider.js +545 -0
  109. package/mapboxgl/js/equipment/EquippHLayer.js +119 -0
  110. package/mapboxgl/js/equipment/OverflowLayer.js +167 -0
  111. package/mapboxgl/js/equipment/WarnLayer.js +120 -0
  112. package/mapboxgl/js/event/EventBranchPipeLayer.js +108 -0
  113. package/mapboxgl/js/event/EventDefectLayer.js +119 -0
  114. package/mapboxgl/js/event/EventDrainerLayer.js +119 -0
  115. package/mapboxgl/js/event/EventLayer.js +123 -0
  116. package/mapboxgl/js/event/EventMixLayer.js +119 -0
  117. package/mapboxgl/js/event/EventOtherLayer.js +119 -0
  118. package/mapboxgl/js/event/EventOtherWaterLayer.js +109 -0
  119. package/mapboxgl/js/event/EventPolicyWaterLayer.js +119 -0
  120. package/mapboxgl/js/event/EventPourLayer.js +119 -0
  121. package/mapboxgl/js/event/EventProvider.js +426 -0
  122. package/mapboxgl/js/event/EventWaterLayer.js +108 -0
  123. package/mapboxgl/js/facility/DitchLayer.js +171 -0
  124. package/mapboxgl/js/facility/FacilityProvider.js +523 -0
  125. package/mapboxgl/js/facility/FlapLayer.js +196 -0
  126. package/mapboxgl/js/facility/GateLayer.js +166 -0
  127. package/mapboxgl/js/facility/InterceptionLayer.js +166 -0
  128. package/mapboxgl/js/facility/InterceptionsewLayer.js +166 -0
  129. package/mapboxgl/js/facility/OutfallLayer.js +166 -0
  130. package/mapboxgl/js/facility/PatrolareaLayer.js +177 -0
  131. package/mapboxgl/js/facility/RaininletLayer.js +166 -0
  132. package/mapboxgl/js/facility/StorageLayer.js +166 -0
  133. package/mapboxgl/js/geog/AreaBoundaryProvider.js +282 -0
  134. package/mapboxgl/js/geog/BoundaryProvider.js +266 -0
  135. package/mapboxgl/js/geog/GMLProvider.js +146 -0
  136. package/mapboxgl/js/geog/GeoJsonProvider.js +336 -0
  137. package/mapboxgl/js/geog/IconProvider.js +481 -0
  138. package/mapboxgl/js/geog/IndexedDBProvider.js +467 -0
  139. package/mapboxgl/js/geog/LayerProvider.js +275 -0
  140. package/mapboxgl/js/geog/LocationProvider.js +227 -0
  141. package/mapboxgl/js/geog/MapProvider.js +179 -0
  142. package/mapboxgl/js/geog/SelectionProvider.js +99 -0
  143. package/mapboxgl/js/geog/WKTProvider.js +180 -0
  144. package/mapboxgl/js/layers/CircleLayer.js +471 -0
  145. package/mapboxgl/js/layers/ClusterLayer.js +529 -0
  146. package/mapboxgl/js/layers/FillLayer.js +407 -0
  147. package/mapboxgl/js/layers/FlowingLayer.js +315 -0
  148. package/mapboxgl/js/layers/HeatmapLayer.js +263 -0
  149. package/mapboxgl/js/layers/IconClusterLayer.js +497 -0
  150. package/mapboxgl/js/layers/LineLayer.js +442 -0
  151. package/mapboxgl/js/layers/MarkerLayer.js +504 -0
  152. package/mapboxgl/js/layers/Pulser.js +84 -0
  153. package/mapboxgl/js/layers/PulserLayer.js +161 -0
  154. package/mapboxgl/js/layers/TextLayer.js +352 -0
  155. package/mapboxgl/js/pipe/BufferLayer.js +142 -0
  156. package/mapboxgl/js/pipe/DrainageAreaLayer.js +272 -0
  157. package/mapboxgl/js/pipe/DrainageAreaProvider.js +823 -0
  158. package/mapboxgl/js/pipe/DrainagePointLayer.js +258 -0
  159. package/mapboxgl/js/pipe/LayerManagerProvider.js +1499 -0
  160. package/mapboxgl/js/pipe/MapQueryProvider.js +879 -0
  161. package/mapboxgl/js/pipe/QueryResultsLayer.js +799 -0
  162. package/mapboxgl/js/pipeline/ConnholeLayer.js +134 -0
  163. package/mapboxgl/js/pipeline/LabelLayer.js +310 -0
  164. package/mapboxgl/js/pipeline/ManholeLayer.js +563 -0
  165. package/mapboxgl/js/pipeline/PipeflowLayer.js +490 -0
  166. package/mapboxgl/js/pipeline/PipelineErrorLayer.js +180 -0
  167. package/mapboxgl/js/pipeline/PipelineFlowLayer.js +213 -0
  168. package/mapboxgl/js/pipeline/PipelineLayer.js +509 -0
  169. package/mapboxgl/js/pipeline/PipenetErrorProvider.js +352 -0
  170. package/mapboxgl/js/pipeline/PipenetFaultProvider.js +219 -0
  171. package/mapboxgl/js/pipeline/PipenetInProvider.js +514 -0
  172. package/mapboxgl/js/pipeline/PipenetMixingFlowLayer.js +329 -0
  173. package/mapboxgl/js/pipeline/PipenetMixingLayer.js +155 -0
  174. package/mapboxgl/js/pipeline/PipenetMixingProvider.js +163 -0
  175. package/mapboxgl/js/pipeline/PipenetProvider.js +1042 -0
  176. package/mapboxgl/js/pipenet/PipenetAnalystProvider.js +393 -0
  177. package/mapboxgl/js/pipenet/PipenetConnectivityProvider.js +166 -0
  178. package/mapboxgl/js/pipenet/PipenetDownstreamProvider.js +276 -0
  179. package/mapboxgl/js/pipenet/PipenetFlowingLayer.js +312 -0
  180. package/mapboxgl/js/pipenet/PipenetServiceRangeProvider.js +386 -0
  181. package/mapboxgl/js/pipenet/PipenetUpdownstreamProvider.js +507 -0
  182. package/mapboxgl/js/pipenet/PipenetUpstreamProvider.js +311 -0
  183. package/mapboxgl/js/pipenet/PipenetWhereaboutsProvider.js +342 -0
  184. package/mapboxgl/js/plant/FlylineLayer.js +304 -0
  185. package/mapboxgl/js/plant/PlantLayer.js +166 -0
  186. package/mapboxgl/js/plant/PlantPumpProvider.js +788 -0
  187. package/mapboxgl/js/plant/PumpLayer.js +166 -0
  188. package/mapboxgl/js/plant/RuralSewageLayer.js +166 -0
  189. package/mapboxgl/js/plant/ServiceRangeLayer.js +130 -0
  190. package/mapboxgl/js/plant/VideoProvider.js +145 -0
  191. package/mapboxgl/js/three/ThreeGltfProvider.js +245 -0
  192. package/mapboxgl/js/utils/CesiumUtils.js +109 -0
  193. package/mapboxgl/js/utils/ColorUtils.js +48 -0
  194. package/mapboxgl/js/utils/CommonUtils.js +65 -0
  195. package/mapboxgl/js/utils/DataUtils.js +138 -0
  196. package/mapboxgl/js/utils/GeoJsonUtils.js +357 -0
  197. package/mapboxgl/js/utils/GeogUtils.js +300 -0
  198. package/mapboxgl/js/utils/LayerUtils.js +160 -0
  199. package/mapboxgl/js/utils/MapUtils.js +128 -0
  200. package/mapboxgl/js/utils/NetworkUtils.js +21 -0
  201. package/mapboxgl/js/utils/PipenetUtils.js +100 -0
  202. package/mapboxgl/js/utils/ProjUtils.js +32 -0
  203. package/mapboxgl/js/utils/SpatialRefUtils.js +198 -0
  204. package/mapboxgl/js/utils/SvgUtils.js +133 -0
  205. package/mapboxgl/js/utils/VerifyUtils.js +73 -0
  206. package/mapboxgl/js/widget/Pulser.js +88 -0
  207. package/mapboxgl/style/fonts/Microsoft YaHei/0-255.pbf +0 -0
  208. package/mapboxgl/style/fonts/Microsoft YaHei/1024-1279.pbf +0 -0
  209. package/mapboxgl/style/fonts/Microsoft YaHei/10240-10495.pbf +3 -0
  210. package/mapboxgl/style/fonts/Microsoft YaHei/10496-10751.pbf +3 -0
  211. package/mapboxgl/style/fonts/Microsoft YaHei/10752-11007.pbf +3 -0
  212. package/mapboxgl/style/fonts/Microsoft YaHei/11008-11263.pbf +3 -0
  213. package/mapboxgl/style/fonts/Microsoft YaHei/11264-11519.pbf +3 -0
  214. package/mapboxgl/style/fonts/Microsoft YaHei/11520-11775.pbf +3 -0
  215. package/mapboxgl/style/fonts/Microsoft YaHei/11776-12031.pbf +0 -0
  216. package/mapboxgl/style/fonts/Microsoft YaHei/12032-12287.pbf +3 -0
  217. package/mapboxgl/style/fonts/Microsoft YaHei/12288-12543.pbf +0 -0
  218. package/mapboxgl/style/fonts/Microsoft YaHei/12544-12799.pbf +0 -0
  219. package/mapboxgl/style/fonts/Microsoft YaHei/1280-1535.pbf +3 -0
  220. package/mapboxgl/style/fonts/Microsoft YaHei/12800-13055.pbf +0 -0
  221. package/mapboxgl/style/fonts/Microsoft YaHei/13056-13311.pbf +0 -0
  222. package/mapboxgl/style/fonts/Microsoft YaHei/13312-13567.pbf +0 -0
  223. package/mapboxgl/style/fonts/Microsoft YaHei/13568-13823.pbf +0 -0
  224. package/mapboxgl/style/fonts/Microsoft YaHei/13824-14079.pbf +0 -0
  225. package/mapboxgl/style/fonts/Microsoft YaHei/14080-14335.pbf +0 -0
  226. package/mapboxgl/style/fonts/Microsoft YaHei/14336-14591.pbf +0 -0
  227. package/mapboxgl/style/fonts/Microsoft YaHei/14592-14847.pbf +0 -0
  228. package/mapboxgl/style/fonts/Microsoft YaHei/14848-15103.pbf +0 -0
  229. package/mapboxgl/style/fonts/Microsoft YaHei/15104-15359.pbf +0 -0
  230. package/mapboxgl/style/fonts/Microsoft YaHei/1536-1791.pbf +3 -0
  231. package/mapboxgl/style/fonts/Microsoft YaHei/15360-15615.pbf +0 -0
  232. package/mapboxgl/style/fonts/Microsoft YaHei/15616-15871.pbf +0 -0
  233. package/mapboxgl/style/fonts/Microsoft YaHei/15872-16127.pbf +0 -0
  234. package/mapboxgl/style/fonts/Microsoft YaHei/16128-16383.pbf +0 -0
  235. package/mapboxgl/style/fonts/Microsoft YaHei/16384-16639.pbf +0 -0
  236. package/mapboxgl/style/fonts/Microsoft YaHei/16640-16895.pbf +0 -0
  237. package/mapboxgl/style/fonts/Microsoft YaHei/16896-17151.pbf +0 -0
  238. package/mapboxgl/style/fonts/Microsoft YaHei/17152-17407.pbf +0 -0
  239. package/mapboxgl/style/fonts/Microsoft YaHei/17408-17663.pbf +0 -0
  240. package/mapboxgl/style/fonts/Microsoft YaHei/17664-17919.pbf +0 -0
  241. package/mapboxgl/style/fonts/Microsoft YaHei/1792-2047.pbf +3 -0
  242. package/mapboxgl/style/fonts/Microsoft YaHei/17920-18175.pbf +0 -0
  243. package/mapboxgl/style/fonts/Microsoft YaHei/18176-18431.pbf +0 -0
  244. package/mapboxgl/style/fonts/Microsoft YaHei/18432-18687.pbf +0 -0
  245. package/mapboxgl/style/fonts/Microsoft YaHei/18688-18943.pbf +0 -0
  246. package/mapboxgl/style/fonts/Microsoft YaHei/18944-19199.pbf +0 -0
  247. package/mapboxgl/style/fonts/Microsoft YaHei/19200-19455.pbf +0 -0
  248. package/mapboxgl/style/fonts/Microsoft YaHei/19456-19711.pbf +0 -0
  249. package/mapboxgl/style/fonts/Microsoft YaHei/19712-19967.pbf +0 -0
  250. package/mapboxgl/style/fonts/Microsoft YaHei/19968-20223.pbf +0 -0
  251. package/mapboxgl/style/fonts/Microsoft YaHei/20224-20479.pbf +0 -0
  252. package/mapboxgl/style/fonts/Microsoft YaHei/2048-2303.pbf +3 -0
  253. package/mapboxgl/style/fonts/Microsoft YaHei/20480-20735.pbf +0 -0
  254. package/mapboxgl/style/fonts/Microsoft YaHei/20736-20991.pbf +0 -0
  255. package/mapboxgl/style/fonts/Microsoft YaHei/20992-21247.pbf +0 -0
  256. package/mapboxgl/style/fonts/Microsoft YaHei/21248-21503.pbf +0 -0
  257. package/mapboxgl/style/fonts/Microsoft YaHei/21504-21759.pbf +0 -0
  258. package/mapboxgl/style/fonts/Microsoft YaHei/21760-22015.pbf +0 -0
  259. package/mapboxgl/style/fonts/Microsoft YaHei/22016-22271.pbf +0 -0
  260. package/mapboxgl/style/fonts/Microsoft YaHei/22272-22527.pbf +154 -9
  261. package/mapboxgl/style/fonts/Microsoft YaHei/22528-22783.pbf +0 -0
  262. package/mapboxgl/style/fonts/Microsoft YaHei/22784-23039.pbf +0 -0
  263. package/mapboxgl/style/fonts/Microsoft YaHei/2304-2559.pbf +3 -0
  264. package/mapboxgl/style/fonts/Microsoft YaHei/23040-23295.pbf +0 -0
  265. package/mapboxgl/style/fonts/Microsoft YaHei/23296-23551.pbf +0 -0
  266. package/mapboxgl/style/fonts/Microsoft YaHei/23552-23807.pbf +0 -0
  267. package/mapboxgl/style/fonts/Microsoft YaHei/23808-24063.pbf +0 -0
  268. package/mapboxgl/style/fonts/Microsoft YaHei/24064-24319.pbf +0 -0
  269. package/mapboxgl/style/fonts/Microsoft YaHei/24320-24575.pbf +0 -0
  270. package/mapboxgl/style/fonts/Microsoft YaHei/24576-24831.pbf +0 -0
  271. package/mapboxgl/style/fonts/Microsoft YaHei/24832-25087.pbf +0 -0
  272. package/mapboxgl/style/fonts/Microsoft YaHei/25088-25343.pbf +0 -0
  273. package/mapboxgl/style/fonts/Microsoft YaHei/25344-25599.pbf +0 -0
  274. package/mapboxgl/style/fonts/Microsoft YaHei/256-511.pbf +0 -0
  275. package/mapboxgl/style/fonts/Microsoft YaHei/2560-2815.pbf +3 -0
  276. package/mapboxgl/style/fonts/Microsoft YaHei/25600-25855.pbf +0 -0
  277. package/mapboxgl/style/fonts/Microsoft YaHei/25856-26111.pbf +0 -0
  278. package/mapboxgl/style/fonts/Microsoft YaHei/26112-26367.pbf +0 -0
  279. package/mapboxgl/style/fonts/Microsoft YaHei/26368-26623.pbf +0 -0
  280. package/mapboxgl/style/fonts/Microsoft YaHei/26624-26879.pbf +0 -0
  281. package/mapboxgl/style/fonts/Microsoft YaHei/26880-27135.pbf +0 -0
  282. package/mapboxgl/style/fonts/Microsoft YaHei/27136-27391.pbf +0 -0
  283. package/mapboxgl/style/fonts/Microsoft YaHei/27392-27647.pbf +0 -0
  284. package/mapboxgl/style/fonts/Microsoft YaHei/27648-27903.pbf +0 -0
  285. package/mapboxgl/style/fonts/Microsoft YaHei/27904-28159.pbf +0 -0
  286. package/mapboxgl/style/fonts/Microsoft YaHei/2816-3071.pbf +3 -0
  287. package/mapboxgl/style/fonts/Microsoft YaHei/28160-28415.pbf +0 -0
  288. package/mapboxgl/style/fonts/Microsoft YaHei/28416-28671.pbf +0 -0
  289. package/mapboxgl/style/fonts/Microsoft YaHei/28672-28927.pbf +0 -0
  290. package/mapboxgl/style/fonts/Microsoft YaHei/28928-29183.pbf +0 -0
  291. package/mapboxgl/style/fonts/Microsoft YaHei/29184-29439.pbf +0 -0
  292. package/mapboxgl/style/fonts/Microsoft YaHei/29440-29695.pbf +0 -0
  293. package/mapboxgl/style/fonts/Microsoft YaHei/29696-29951.pbf +0 -0
  294. package/mapboxgl/style/fonts/Microsoft YaHei/29952-30207.pbf +0 -0
  295. package/mapboxgl/style/fonts/Microsoft YaHei/30208-30463.pbf +0 -0
  296. package/mapboxgl/style/fonts/Microsoft YaHei/30464-30719.pbf +0 -0
  297. package/mapboxgl/style/fonts/Microsoft YaHei/3072-3327.pbf +3 -0
  298. package/mapboxgl/style/fonts/Microsoft YaHei/30720-30975.pbf +0 -0
  299. package/mapboxgl/style/fonts/Microsoft YaHei/30976-31231.pbf +0 -0
  300. package/mapboxgl/style/fonts/Microsoft YaHei/31232-31487.pbf +0 -0
  301. package/mapboxgl/style/fonts/Microsoft YaHei/31488-31743.pbf +0 -0
  302. package/mapboxgl/style/fonts/Microsoft YaHei/31744-31999.pbf +0 -0
  303. package/mapboxgl/style/fonts/Microsoft YaHei/32000-32255.pbf +0 -0
  304. package/mapboxgl/style/fonts/Microsoft YaHei/32256-32511.pbf +0 -0
  305. package/mapboxgl/style/fonts/Microsoft YaHei/32512-32767.pbf +0 -0
  306. package/mapboxgl/style/fonts/Microsoft YaHei/32768-33023.pbf +0 -0
  307. package/mapboxgl/style/fonts/Microsoft YaHei/33024-33279.pbf +0 -0
  308. package/mapboxgl/style/fonts/Microsoft YaHei/3328-3583.pbf +3 -0
  309. package/mapboxgl/style/fonts/Microsoft YaHei/33280-33535.pbf +0 -0
  310. package/mapboxgl/style/fonts/Microsoft YaHei/33536-33791.pbf +0 -0
  311. package/mapboxgl/style/fonts/Microsoft YaHei/33792-34047.pbf +0 -0
  312. package/mapboxgl/style/fonts/Microsoft YaHei/34048-34303.pbf +0 -0
  313. package/mapboxgl/style/fonts/Microsoft YaHei/34304-34559.pbf +0 -0
  314. package/mapboxgl/style/fonts/Microsoft YaHei/34560-34815.pbf +0 -0
  315. package/mapboxgl/style/fonts/Microsoft YaHei/34816-35071.pbf +0 -0
  316. package/mapboxgl/style/fonts/Microsoft YaHei/35072-35327.pbf +0 -0
  317. package/mapboxgl/style/fonts/Microsoft YaHei/35328-35583.pbf +0 -0
  318. package/mapboxgl/style/fonts/Microsoft YaHei/35584-35839.pbf +0 -0
  319. package/mapboxgl/style/fonts/Microsoft YaHei/3584-3839.pbf +3 -0
  320. package/mapboxgl/style/fonts/Microsoft YaHei/35840-36095.pbf +0 -0
  321. package/mapboxgl/style/fonts/Microsoft YaHei/36096-36351.pbf +0 -0
  322. package/mapboxgl/style/fonts/Microsoft YaHei/36352-36607.pbf +0 -0
  323. package/mapboxgl/style/fonts/Microsoft YaHei/36608-36863.pbf +0 -0
  324. package/mapboxgl/style/fonts/Microsoft YaHei/36864-37119.pbf +0 -0
  325. package/mapboxgl/style/fonts/Microsoft YaHei/37120-37375.pbf +0 -0
  326. package/mapboxgl/style/fonts/Microsoft YaHei/37376-37631.pbf +0 -0
  327. package/mapboxgl/style/fonts/Microsoft YaHei/37632-37887.pbf +0 -0
  328. package/mapboxgl/style/fonts/Microsoft YaHei/37888-38143.pbf +0 -0
  329. package/mapboxgl/style/fonts/Microsoft YaHei/38144-38399.pbf +0 -0
  330. package/mapboxgl/style/fonts/Microsoft YaHei/3840-4095.pbf +3 -0
  331. package/mapboxgl/style/fonts/Microsoft YaHei/38400-38655.pbf +0 -0
  332. package/mapboxgl/style/fonts/Microsoft YaHei/38656-38911.pbf +0 -0
  333. package/mapboxgl/style/fonts/Microsoft YaHei/38912-39167.pbf +0 -0
  334. package/mapboxgl/style/fonts/Microsoft YaHei/39168-39423.pbf +0 -0
  335. package/mapboxgl/style/fonts/Microsoft YaHei/39424-39679.pbf +0 -0
  336. package/mapboxgl/style/fonts/Microsoft YaHei/39680-39935.pbf +0 -0
  337. package/mapboxgl/style/fonts/Microsoft YaHei/39936-40191.pbf +0 -0
  338. package/mapboxgl/style/fonts/Microsoft YaHei/40192-40447.pbf +0 -0
  339. package/mapboxgl/style/fonts/Microsoft YaHei/40448-40703.pbf +0 -0
  340. package/mapboxgl/style/fonts/Microsoft YaHei/40704-40959.pbf +0 -0
  341. package/mapboxgl/style/fonts/Microsoft YaHei/4096-4351.pbf +3 -0
  342. package/mapboxgl/style/fonts/Microsoft YaHei/40960-41215.pbf +3 -0
  343. package/mapboxgl/style/fonts/Microsoft YaHei/41216-41471.pbf +3 -0
  344. package/mapboxgl/style/fonts/Microsoft YaHei/41472-41727.pbf +3 -0
  345. package/mapboxgl/style/fonts/Microsoft YaHei/41728-41983.pbf +3 -0
  346. package/mapboxgl/style/fonts/Microsoft YaHei/41984-42239.pbf +3 -0
  347. package/mapboxgl/style/fonts/Microsoft YaHei/42240-42495.pbf +3 -0
  348. package/mapboxgl/style/fonts/Microsoft YaHei/42496-42751.pbf +3 -0
  349. package/mapboxgl/style/fonts/Microsoft YaHei/42752-43007.pbf +3 -0
  350. package/mapboxgl/style/fonts/Microsoft YaHei/43008-43263.pbf +3 -0
  351. package/mapboxgl/style/fonts/Microsoft YaHei/43264-43519.pbf +3 -0
  352. package/mapboxgl/style/fonts/Microsoft YaHei/4352-4607.pbf +3 -0
  353. package/mapboxgl/style/fonts/Microsoft YaHei/43520-43775.pbf +3 -0
  354. package/mapboxgl/style/fonts/Microsoft YaHei/43776-44031.pbf +3 -0
  355. package/mapboxgl/style/fonts/Microsoft YaHei/44032-44287.pbf +3 -0
  356. package/mapboxgl/style/fonts/Microsoft YaHei/44288-44543.pbf +3 -0
  357. package/mapboxgl/style/fonts/Microsoft YaHei/44544-44799.pbf +3 -0
  358. package/mapboxgl/style/fonts/Microsoft YaHei/44800-45055.pbf +3 -0
  359. package/mapboxgl/style/fonts/Microsoft YaHei/45056-45311.pbf +3 -0
  360. package/mapboxgl/style/fonts/Microsoft YaHei/45312-45567.pbf +3 -0
  361. package/mapboxgl/style/fonts/Microsoft YaHei/45568-45823.pbf +3 -0
  362. package/mapboxgl/style/fonts/Microsoft YaHei/45824-46079.pbf +3 -0
  363. package/mapboxgl/style/fonts/Microsoft YaHei/4608-4863.pbf +3 -0
  364. package/mapboxgl/style/fonts/Microsoft YaHei/46080-46335.pbf +3 -0
  365. package/mapboxgl/style/fonts/Microsoft YaHei/46336-46591.pbf +3 -0
  366. package/mapboxgl/style/fonts/Microsoft YaHei/46592-46847.pbf +3 -0
  367. package/mapboxgl/style/fonts/Microsoft YaHei/46848-47103.pbf +3 -0
  368. package/mapboxgl/style/fonts/Microsoft YaHei/47104-47359.pbf +3 -0
  369. package/mapboxgl/style/fonts/Microsoft YaHei/47360-47615.pbf +3 -0
  370. package/mapboxgl/style/fonts/Microsoft YaHei/47616-47871.pbf +3 -0
  371. package/mapboxgl/style/fonts/Microsoft YaHei/47872-48127.pbf +3 -0
  372. package/mapboxgl/style/fonts/Microsoft YaHei/48128-48383.pbf +3 -0
  373. package/mapboxgl/style/fonts/Microsoft YaHei/48384-48639.pbf +3 -0
  374. package/mapboxgl/style/fonts/Microsoft YaHei/4864-5119.pbf +3 -0
  375. package/mapboxgl/style/fonts/Microsoft YaHei/48640-48895.pbf +3 -0
  376. package/mapboxgl/style/fonts/Microsoft YaHei/48896-49151.pbf +3 -0
  377. package/mapboxgl/style/fonts/Microsoft YaHei/49152-49407.pbf +3 -0
  378. package/mapboxgl/style/fonts/Microsoft YaHei/49408-49663.pbf +3 -0
  379. package/mapboxgl/style/fonts/Microsoft YaHei/49664-49919.pbf +3 -0
  380. package/mapboxgl/style/fonts/Microsoft YaHei/49920-50175.pbf +3 -0
  381. package/mapboxgl/style/fonts/Microsoft YaHei/50176-50431.pbf +3 -0
  382. package/mapboxgl/style/fonts/Microsoft YaHei/50432-50687.pbf +3 -0
  383. package/mapboxgl/style/fonts/Microsoft YaHei/50688-50943.pbf +3 -0
  384. package/mapboxgl/style/fonts/Microsoft YaHei/50944-51199.pbf +3 -0
  385. package/mapboxgl/style/fonts/Microsoft YaHei/512-767.pbf +0 -0
  386. package/mapboxgl/style/fonts/Microsoft YaHei/5120-5375.pbf +3 -0
  387. package/mapboxgl/style/fonts/Microsoft YaHei/51200-51455.pbf +3 -0
  388. package/mapboxgl/style/fonts/Microsoft YaHei/51456-51711.pbf +3 -0
  389. package/mapboxgl/style/fonts/Microsoft YaHei/51712-51967.pbf +3 -0
  390. package/mapboxgl/style/fonts/Microsoft YaHei/51968-52223.pbf +3 -0
  391. package/mapboxgl/style/fonts/Microsoft YaHei/52224-52479.pbf +3 -0
  392. package/mapboxgl/style/fonts/Microsoft YaHei/52480-52735.pbf +3 -0
  393. package/mapboxgl/style/fonts/Microsoft YaHei/52736-52991.pbf +3 -0
  394. package/mapboxgl/style/fonts/Microsoft YaHei/52992-53247.pbf +3 -0
  395. package/mapboxgl/style/fonts/Microsoft YaHei/53248-53503.pbf +3 -0
  396. package/mapboxgl/style/fonts/Microsoft YaHei/53504-53759.pbf +3 -0
  397. package/mapboxgl/style/fonts/Microsoft YaHei/5376-5631.pbf +3 -0
  398. package/mapboxgl/style/fonts/Microsoft YaHei/53760-54015.pbf +3 -0
  399. package/mapboxgl/style/fonts/Microsoft YaHei/54016-54271.pbf +3 -0
  400. package/mapboxgl/style/fonts/Microsoft YaHei/54272-54527.pbf +3 -0
  401. package/mapboxgl/style/fonts/Microsoft YaHei/54528-54783.pbf +3 -0
  402. package/mapboxgl/style/fonts/Microsoft YaHei/54784-55039.pbf +3 -0
  403. package/mapboxgl/style/fonts/Microsoft YaHei/55040-55295.pbf +3 -0
  404. package/mapboxgl/style/fonts/Microsoft YaHei/55296-55551.pbf +3 -0
  405. package/mapboxgl/style/fonts/Microsoft YaHei/55552-55807.pbf +3 -0
  406. package/mapboxgl/style/fonts/Microsoft YaHei/55808-56063.pbf +3 -0
  407. package/mapboxgl/style/fonts/Microsoft YaHei/56064-56319.pbf +3 -0
  408. package/mapboxgl/style/fonts/Microsoft YaHei/5632-5887.pbf +3 -0
  409. package/mapboxgl/style/fonts/Microsoft YaHei/56320-56575.pbf +3 -0
  410. package/mapboxgl/style/fonts/Microsoft YaHei/56576-56831.pbf +3 -0
  411. package/mapboxgl/style/fonts/Microsoft YaHei/56832-57087.pbf +3 -0
  412. package/mapboxgl/style/fonts/Microsoft YaHei/57088-57343.pbf +3 -0
  413. package/mapboxgl/style/fonts/Microsoft YaHei/57344-57599.pbf +3 -0
  414. package/mapboxgl/style/fonts/Microsoft YaHei/57600-57855.pbf +3 -0
  415. package/mapboxgl/style/fonts/Microsoft YaHei/57856-58111.pbf +3 -0
  416. package/mapboxgl/style/fonts/Microsoft YaHei/58112-58367.pbf +3 -0
  417. package/mapboxgl/style/fonts/Microsoft YaHei/58368-58623.pbf +3 -0
  418. package/mapboxgl/style/fonts/Microsoft YaHei/58624-58879.pbf +3 -0
  419. package/mapboxgl/style/fonts/Microsoft YaHei/5888-6143.pbf +3 -0
  420. package/mapboxgl/style/fonts/Microsoft YaHei/58880-59135.pbf +3 -0
  421. package/mapboxgl/style/fonts/Microsoft YaHei/59136-59391.pbf +3 -0
  422. package/mapboxgl/style/fonts/Microsoft YaHei/59392-59647.pbf +3 -0
  423. package/mapboxgl/style/fonts/Microsoft YaHei/59648-59903.pbf +3 -0
  424. package/mapboxgl/style/fonts/Microsoft YaHei/59904-60159.pbf +3 -0
  425. package/mapboxgl/style/fonts/Microsoft YaHei/60160-60415.pbf +3 -0
  426. package/mapboxgl/style/fonts/Microsoft YaHei/60416-60671.pbf +3 -0
  427. package/mapboxgl/style/fonts/Microsoft YaHei/60672-60927.pbf +3 -0
  428. package/mapboxgl/style/fonts/Microsoft YaHei/60928-61183.pbf +3 -0
  429. package/mapboxgl/style/fonts/Microsoft YaHei/61184-61439.pbf +3 -0
  430. package/mapboxgl/style/fonts/Microsoft YaHei/6144-6399.pbf +3 -0
  431. package/mapboxgl/style/fonts/Microsoft YaHei/61440-61695.pbf +3 -0
  432. package/mapboxgl/style/fonts/Microsoft YaHei/61696-61951.pbf +3 -0
  433. package/mapboxgl/style/fonts/Microsoft YaHei/61952-62207.pbf +3 -0
  434. package/mapboxgl/style/fonts/Microsoft YaHei/62208-62463.pbf +3 -0
  435. package/mapboxgl/style/fonts/Microsoft YaHei/62464-62719.pbf +3 -0
  436. package/mapboxgl/style/fonts/Microsoft YaHei/62720-62975.pbf +3 -0
  437. package/mapboxgl/style/fonts/Microsoft YaHei/62976-63231.pbf +3 -0
  438. package/mapboxgl/style/fonts/Microsoft YaHei/63232-63487.pbf +3 -0
  439. package/mapboxgl/style/fonts/Microsoft YaHei/63488-63743.pbf +3 -0
  440. package/mapboxgl/style/fonts/Microsoft YaHei/63744-63999.pbf +0 -0
  441. package/mapboxgl/style/fonts/Microsoft YaHei/6400-6655.pbf +3 -0
  442. package/mapboxgl/style/fonts/Microsoft YaHei/64000-64255.pbf +0 -0
  443. package/mapboxgl/style/fonts/Microsoft YaHei/64256-64511.pbf +3 -0
  444. package/mapboxgl/style/fonts/Microsoft YaHei/64512-64767.pbf +3 -0
  445. package/mapboxgl/style/fonts/Microsoft YaHei/64768-65023.pbf +3 -0
  446. package/mapboxgl/style/fonts/Microsoft YaHei/65024-65279.pbf +0 -0
  447. package/mapboxgl/style/fonts/Microsoft YaHei/65280-65535.pbf +0 -0
  448. package/mapboxgl/style/fonts/Microsoft YaHei/6656-6911.pbf +3 -0
  449. package/mapboxgl/style/fonts/Microsoft YaHei/6912-7167.pbf +3 -0
  450. package/mapboxgl/style/fonts/Microsoft YaHei/7168-7423.pbf +3 -0
  451. package/mapboxgl/style/fonts/Microsoft YaHei/7424-7679.pbf +3 -0
  452. package/mapboxgl/style/fonts/Microsoft YaHei/768-1023.pbf +0 -0
  453. package/mapboxgl/style/fonts/Microsoft YaHei/7680-7935.pbf +0 -0
  454. package/mapboxgl/style/fonts/Microsoft YaHei/7936-8191.pbf +3 -0
  455. package/mapboxgl/style/fonts/Microsoft YaHei/8192-8447.pbf +0 -0
  456. package/mapboxgl/style/fonts/Microsoft YaHei/8448-8703.pbf +0 -0
  457. package/mapboxgl/style/fonts/Microsoft YaHei/8704-8959.pbf +0 -0
  458. package/mapboxgl/style/fonts/Microsoft YaHei/8960-9215.pbf +0 -0
  459. package/mapboxgl/style/fonts/Microsoft YaHei/9216-9471.pbf +0 -0
  460. package/mapboxgl/style/fonts/Microsoft YaHei/9472-9727.pbf +0 -0
  461. package/mapboxgl/style/fonts/Microsoft YaHei/9728-9983.pbf +0 -0
  462. package/mapboxgl/style/fonts/Microsoft YaHei/9984-10239.pbf +4 -0
  463. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/0-255.pbf +0 -0
  464. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/1024-1279.pbf +0 -0
  465. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/10240-10495.pbf +3 -0
  466. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/10496-10751.pbf +3 -0
  467. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/10752-11007.pbf +3 -0
  468. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/11008-11263.pbf +3 -0
  469. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/11264-11519.pbf +3 -0
  470. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/11520-11775.pbf +3 -0
  471. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/11776-12031.pbf +3 -0
  472. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/12032-12287.pbf +3 -0
  473. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/12288-12543.pbf +0 -0
  474. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/12544-12799.pbf +0 -0
  475. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/1280-1535.pbf +0 -0
  476. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/12800-13055.pbf +0 -0
  477. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/13056-13311.pbf +0 -0
  478. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/13312-13567.pbf +3 -0
  479. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/13568-13823.pbf +3 -0
  480. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/13824-14079.pbf +3 -0
  481. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/14080-14335.pbf +3 -0
  482. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/14336-14591.pbf +3 -0
  483. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/14592-14847.pbf +3 -0
  484. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/14848-15103.pbf +3 -0
  485. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/16384-16639.pbf +3 -0
  486. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/16640-16895.pbf +3 -0
  487. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/16896-17151.pbf +3 -0
  488. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/17152-17407.pbf +3 -0
  489. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/1792-2047.pbf +3 -0
  490. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/18432-18687.pbf +3 -0
  491. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/19968-20223.pbf +0 -0
  492. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/20224-20479.pbf +0 -0
  493. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/2048-2303.pbf +3 -0
  494. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/20736-20991.pbf +0 -0
  495. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/21248-21503.pbf +0 -0
  496. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/21504-21759.pbf +0 -0
  497. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/21760-22015.pbf +0 -0
  498. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/22016-22271.pbf +0 -0
  499. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/22272-22527.pbf +118 -19
  500. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/22528-22783.pbf +0 -0
  501. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/22784-23039.pbf +0 -0
  502. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/2304-2559.pbf +0 -0
  503. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/23040-23295.pbf +0 -0
  504. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/23552-23807.pbf +0 -0
  505. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/24064-24319.pbf +0 -0
  506. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/24320-24575.pbf +0 -0
  507. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/24576-24831.pbf +0 -0
  508. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/24832-25087.pbf +0 -0
  509. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/25088-25343.pbf +0 -0
  510. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/25344-25599.pbf +0 -0
  511. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/256-511.pbf +0 -0
  512. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/2560-2815.pbf +0 -0
  513. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/25600-25855.pbf +0 -0
  514. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/25856-26111.pbf +0 -0
  515. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/26112-26367.pbf +0 -0
  516. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/26368-26623.pbf +0 -0
  517. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/2816-3071.pbf +0 -0
  518. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/3072-3327.pbf +0 -0
  519. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/31744-31999.pbf +0 -0
  520. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/32000-32255.pbf +0 -0
  521. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/32256-32511.pbf +0 -0
  522. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/32512-32767.pbf +0 -0
  523. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/32768-33023.pbf +0 -0
  524. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/33024-33279.pbf +0 -0
  525. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/3328-3583.pbf +0 -0
  526. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/33536-33791.pbf +0 -0
  527. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/33792-34047.pbf +0 -0
  528. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/34048-34303.pbf +0 -0
  529. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/34304-34559.pbf +0 -0
  530. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/34560-34815.pbf +0 -0
  531. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/34816-35071.pbf +0 -0
  532. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/35072-35327.pbf +0 -0
  533. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/35328-35583.pbf +0 -0
  534. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/3584-3839.pbf +0 -0
  535. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/35840-36095.pbf +0 -0
  536. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/36096-36351.pbf +0 -0
  537. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/36352-36607.pbf +0 -0
  538. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/36608-36863.pbf +0 -0
  539. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/37120-37375.pbf +0 -0
  540. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/37376-37631.pbf +0 -0
  541. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/37888-38143.pbf +0 -0
  542. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/38144-38399.pbf +0 -0
  543. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/38400-38655.pbf +0 -0
  544. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/38656-38911.pbf +0 -0
  545. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/38912-39167.pbf +0 -0
  546. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/39168-39423.pbf +0 -0
  547. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/39424-39679.pbf +0 -0
  548. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/39680-39935.pbf +0 -0
  549. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/39936-40191.pbf +0 -0
  550. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/40448-40703.pbf +0 -0
  551. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/40704-40959.pbf +0 -0
  552. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/40960-41215.pbf +3 -0
  553. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/41216-41471.pbf +3 -0
  554. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/41472-41727.pbf +3 -0
  555. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/41728-41983.pbf +3 -0
  556. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/41984-42239.pbf +3 -0
  557. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/42240-42495.pbf +3 -0
  558. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/42496-42751.pbf +3 -0
  559. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/42752-43007.pbf +3 -0
  560. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/43008-43263.pbf +3 -0
  561. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/43264-43519.pbf +3 -0
  562. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/43776-44031.pbf +3 -0
  563. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/44032-44287.pbf +0 -0
  564. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/44288-44543.pbf +0 -0
  565. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/44544-44799.pbf +0 -0
  566. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/44800-45055.pbf +0 -0
  567. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/45056-45311.pbf +0 -0
  568. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/45312-45567.pbf +0 -0
  569. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/45568-45823.pbf +0 -0
  570. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/46080-46335.pbf +0 -0
  571. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/46336-46591.pbf +0 -0
  572. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/46592-46847.pbf +0 -0
  573. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/46848-47103.pbf +0 -0
  574. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/47104-47359.pbf +0 -0
  575. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/47360-47615.pbf +0 -0
  576. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/47872-48127.pbf +0 -0
  577. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/48128-48383.pbf +78 -0
  578. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/48384-48639.pbf +0 -0
  579. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/49664-49919.pbf +0 -0
  580. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/50176-50431.pbf +0 -0
  581. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/50432-50687.pbf +0 -0
  582. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/50688-50943.pbf +0 -0
  583. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/50944-51199.pbf +0 -0
  584. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/512-767.pbf +0 -0
  585. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/5120-5375.pbf +3 -0
  586. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/51200-51455.pbf +0 -0
  587. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/51456-51711.pbf +117 -4
  588. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/51712-51967.pbf +0 -0
  589. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/51968-52223.pbf +0 -0
  590. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/52480-52735.pbf +0 -0
  591. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/52736-52991.pbf +0 -0
  592. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/52992-53247.pbf +0 -0
  593. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/5376-5631.pbf +3 -0
  594. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/5632-5887.pbf +3 -0
  595. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/5888-6143.pbf +3 -0
  596. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/6144-6399.pbf +3 -0
  597. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/6400-6655.pbf +3 -0
  598. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/6656-6911.pbf +3 -0
  599. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/6912-7167.pbf +3 -0
  600. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/7168-7423.pbf +3 -0
  601. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/7424-7679.pbf +3 -0
  602. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/7680-7935.pbf +0 -0
  603. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/8192-8447.pbf +0 -0
  604. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/8448-8703.pbf +0 -0
  605. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/8704-8959.pbf +0 -0
  606. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/8960-9215.pbf +0 -0
  607. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/9216-9471.pbf +0 -0
  608. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/9472-9727.pbf +0 -0
  609. package/mapboxgl/style/fonts/Open Sans Regular,Arial Unicode MS Regular/9984-10239.pbf +0 -0
  610. package/mapboxgl/style/sprite/dark/sprite.json +1 -0
  611. package/mapboxgl/style/sprite/dark/sprite.png +0 -0
  612. package/mapboxgl/style/sprite/dark/sprite@2x.json +1 -0
  613. package/mapboxgl/style/sprite/dark/sprite@2x.png +0 -0
  614. package/mapboxgl/utils/mapbox.js +3821 -0
  615. package/mapboxgl/utils/mapbox_native.js +2037 -0
  616. package/mapboxgl/utils/mapboxgl.md +138 -0
  617. package/mapgis/js/datalayer/arcgis-layer/ArcGISMapImageLayer.js +586 -0
  618. package/mapgis/js/datalayer/arcgis-layer/ArcGISTileLayer.js +515 -0
  619. package/mapgis/js/datalayer/arcgis-layer/ArcGISVectorTileLayer.js +907 -0
  620. package/mapgis/js/datalayer/common-layer/Cesium3DTilesCacheLayer.js +1036 -0
  621. package/mapgis/js/datalayer/common-layer/EchartsLayer.js +861 -0
  622. package/mapgis/js/datalayer/igs-layer/IGSFeatureLayer.js +863 -0
  623. package/mapgis/js/datalayer/igs-layer/IGSImageryLayer.js +460 -0
  624. package/mapgis/js/datalayer/igs-layer/IGSImageryTileLayer.js +404 -0
  625. package/mapgis/js/datalayer/igs-layer/IGSMapImageLayer.js +607 -0
  626. package/mapgis/js/datalayer/igs-layer/IGSTileLayer.js +397 -0
  627. package/mapgis/js/datalayer/igs-layer/IGSVectorTileLayer.js +580 -0
  628. package/mapgis/js/datalayer/igs-layer/ISSceneLayer.js +328 -0
  629. package/mapgis/js/datalayer/igs-layer/ImageryLayer.js +463 -0
  630. package/mapgis/js/datalayer/igs-layer/ImageryTileLayer.js +413 -0
  631. package/mapgis/js/datalayer/index.js +206 -0
  632. package/mapgis/js/datalayer/ogc-layer/wfsLayer.js +670 -0
  633. package/mapgis/js/datalayer/ogc-layer/wmsLayer.js +418 -0
  634. package/mapgis/js/datalayer/ogc-layer/wmtsLayer.js +419 -0
  635. package/mapgis/utils/mapgis-common.js +2945 -0
  636. package/package.json +31 -0
@@ -0,0 +1,2945 @@
1
+ import mapConfig from "../../baseSetting/config/mapConfig.js";
2
+ import {
3
+ base_sources,
4
+ business_layers,
5
+ business_sources,
6
+ Dark_Layers,
7
+ Dark_Sources,
8
+ Image_Layers,
9
+ LayerConfig,
10
+ Light_Layers,
11
+ Light_Sources,
12
+ Vector_Layers,
13
+ } from "../../baseSetting/gis-data/sources_layers.js";
14
+ import {
15
+ Dark_Style,
16
+ Light_Style,
17
+ } from "../../baseSetting/style/DevMapConfig.js";
18
+ import TokenUtils from "../../baseSetting/utils/TokenUtils.js";
19
+ import {Scene, Mapbox} from '@antv/l7'
20
+
21
+ // 图标资源
22
+ const point_icon = require('../../baseSetting/images/map/point.png');
23
+ const img_todo = require('../../baseSetting/images/map/todo.png');
24
+ const img_done = require('../../baseSetting/images/map/done.png');
25
+ const img_invalid = require('../../baseSetting/images/map/invalid.png');
26
+ const img_error = require('../../baseSetting/images/map/error.png');
27
+ let map = null
28
+ let antV7Scene = null
29
+ let pendingRequests = new Set();
30
+ const throttleDelay = 300; // 300ms 内相同瓦片不重复请求
31
+
32
+ // 颜色配置 TODO: 是否增加亮色/暗色的配置
33
+ const actual_color = '#7ed321';
34
+ const plan_color_valid = '#3a6bdb';
35
+ const plan_color_invalid = '#9b9b9b';
36
+
37
+ export default {
38
+ workspace: mapConfig.workspace,
39
+ mapType: mapConfig.mapType || "vector",
40
+ vectorSignalStr: ['vec', 'cva'],
41
+ imageSignalStr: ['img', 'cia'],
42
+ map_srid: mapConfig.map_srid,
43
+ business_srid: mapConfig.business_srid,
44
+ mapgisMap: null,
45
+ mbMap: null,
46
+ rootUrl: window.location.protocol + '//' + window.location.host + '/gisserver',
47
+ styleUrl: window.location.protocol + '//' + window.location.host + '/gisserver/style',
48
+ sceneConfig: mapConfig.sceneConfig,
49
+ opts: {},
50
+
51
+ /**
52
+ * 创建地图实例
53
+ * theme = 'dark'时 将使用离线暗色底图瓦片,将mapConfig中的isOnline设置为false,此时默认使用文件服务器上的暗色瓦片资源
54
+ * theme = 'light'时 将使用在线亮色底图瓦片,将mapConfig中的isOnline设置为true,此时默认使用天地图资源
55
+ * theme = 'light'时 将使用在线亮色底图瓦片,将mapConfig中的isOnline设置为false,此时默认使用文件服务器上的亮色瓦片资源
56
+ * @param opts
57
+ * @param callback
58
+ */
59
+ create: function (opts, callback) {
60
+ this.opts = opts
61
+ if (mapConfig.noMap) {
62
+ this.$message.info("未配置地图")
63
+ alert("未配置地图")
64
+ return
65
+ } else {
66
+ if (typeof zondy == 'undefined') {
67
+ // 使用 Promise 确保资源加载完成后再执行后续逻辑
68
+ this.loadMapGISResources().then(() => {
69
+ this.initMap(opts, callback);
70
+ }).catch((error) => {
71
+ console.error("地图资源加载失败:", error);
72
+ callback && callback();
73
+ });
74
+ } else {
75
+ // 如果 zondy 已经存在,直接初始化地图
76
+ console.log('MapGIS 资源已加载,直接初始化地图');
77
+ this.initMap(opts, callback);
78
+ }
79
+ }
80
+ },
81
+
82
+ /**
83
+ * 添加图标资源
84
+ * @param map
85
+ */
86
+ addImageSource: function (map) {
87
+ // 添加图标到地图
88
+ if (!map.hasImage('img_done')) {
89
+ map.loadImage(img_done, (error, image) => {
90
+ if (error) throw error;
91
+ map.addImage('img_done', image);
92
+ });
93
+ }
94
+
95
+ if (!map.hasImage('img_error')) {
96
+ map.loadImage(img_error, (error, image) => {
97
+ if (error) throw error;
98
+ map.addImage('img_error', image);
99
+ });
100
+ }
101
+
102
+ if (!map.hasImage('img_invalid')) {
103
+ map.loadImage(img_invalid, (error, image) => {
104
+ if (error) throw error;
105
+ map.addImage('img_invalid', image);
106
+ });
107
+ }
108
+
109
+ if (!map.hasImage('img_todo')) {
110
+ map.loadImage(img_todo, (error, image) => {
111
+ if (error) throw error;
112
+ map.addImage('img_todo', image);
113
+ });
114
+ }
115
+ },
116
+
117
+ /**
118
+ * 加载 MapGIS 资源
119
+ * @returns {Promise<unknown>}
120
+ */
121
+ loadMapGISResources: function () {
122
+ window.MapConfig = mapConfig
123
+ return new Promise((resolve, reject) => {
124
+ const script = document.createElement("script");
125
+ script.src = mapConfig.mapUrl + "/mapgis-libs/include-lib-local-upgrade.js";
126
+
127
+ // 根据需要加载的引擎类型添加 include 属性
128
+ script.setAttribute("include", "engine:mapboxgl");
129
+
130
+ let scriptLoaded = false;
131
+
132
+ script.onload = () => {
133
+ console.log('include-lib-local-upgrade.js 加载完成,等待依赖初始化...');
134
+ scriptLoaded = true;
135
+ this.checkDependenciesReady().then(() => {
136
+ console.log('MapGIS 资源加载完成');
137
+ resolve();
138
+ }).catch(reject);
139
+ };
140
+
141
+ script.onerror = () => reject(new Error("MapGIS Client JS 加载失败"));
142
+
143
+ document.head.appendChild(script);
144
+ });
145
+ },
146
+
147
+ /**
148
+ * 检查依赖是否就绪
149
+ * @returns {Promise<unknown>}
150
+ */
151
+ checkDependenciesReady: function () {
152
+ return new Promise((resolve, reject) => {
153
+ const check = () => {
154
+ if (typeof zondy !== 'undefined' &&
155
+ typeof zondy.Map !== 'undefined' &&
156
+ typeof window.createView === 'function') {
157
+ console.log('MapGIS 核心依赖已就绪');
158
+ resolve();
159
+ return true;
160
+ }
161
+ return false;
162
+ };
163
+
164
+ // 立即检查一次
165
+ if (check()) {
166
+ return;
167
+ }
168
+
169
+ // 如果还没就绪,轮询检查(最多等待10秒)
170
+ let attempts = 0;
171
+ const maxAttempts = 100; // 100 * 100ms = 10秒
172
+ const pollInterval = setInterval(() => {
173
+ attempts++;
174
+ if (check()) {
175
+ clearInterval(pollInterval);
176
+ } else if (attempts >= maxAttempts) {
177
+ clearInterval(pollInterval);
178
+ reject(new Error("MapGIS 依赖初始化超时"));
179
+ }
180
+ }, 100);
181
+ });
182
+ },
183
+
184
+ /**
185
+ * 初始化地图
186
+ * @param opts
187
+ * @param callback
188
+ */
189
+
190
+ initMap: function (opts, callback) {
191
+ const {Map} = zondy
192
+ let baseSources = {}, baseLayers = [];
193
+
194
+ // 底图注入
195
+ if (mapConfig.isOnline) {
196
+ const basemapType = mapConfig.map_srid === 'EPSG:3857' ? 'w' : 'c';
197
+
198
+ baseSources = {};
199
+ baseLayers = [];
200
+
201
+ this.vectorSignalStr.forEach(signal => {
202
+ baseLayers.push({
203
+ name: 'tdt_vec_' + signal + '_tiles',
204
+ url: 'http://t0.tianditu.gov.cn/' + signal + '_' + basemapType + '/wmts',
205
+ visible: true
206
+ })
207
+
208
+ })
209
+
210
+ this.imageSignalStr.forEach(signal => {
211
+ baseLayers.push({
212
+ name: 'tdt_img_' + signal + '_tiles',
213
+ url: 'http://t0.tianditu.gov.cn/' + signal + '_' + basemapType + '/wmts',
214
+ visible: true
215
+ })
216
+ })
217
+
218
+ } else {
219
+ baseLayers = opts.theme === "dark" ? Dark_Layers : Light_Layers;
220
+ }
221
+
222
+ // const businessLayers = opts.theme === "dark" ? business_layers : business_layers;
223
+ const businessLayers = opts.theme === "dark" ? [] : [];
224
+ const mapId = opts.mapId;
225
+
226
+ mapboxgl.accessToken = TokenUtils.MapboxGL_AccessToken;
227
+ console.log('baseSources, baseLayers', baseSources, baseLayers);
228
+ mapboxgl.config.MAX_PARALLEL_IMAGE_REQUESTS = 256;
229
+
230
+ this.mapgisMap = new Map() // mapgis Map对象
231
+
232
+ // 初始化地图视图对象
233
+ window.gisView = createView(mapId, this.mapgisMap, this.opts)
234
+
235
+ this.initBaseDataLayers(baseLayers)
236
+
237
+ this._innerViewCreatedHandler(gisView,callback)
238
+ },
239
+
240
+ // 创建事件处理函数并保存引用
241
+ _innerViewCreatedHandler(result,callback) {
242
+ const innerView = result.getInnerView()
243
+ console.log('innerView-created', innerView);
244
+ map = innerView;
245
+ const customStyle = this.opts.theme === "dark" ? Dark_Style : Light_Style;
246
+
247
+ this.setStyle(map);
248
+ this.addImageSource(map)
249
+ map._customStyle = customStyle
250
+
251
+ if (this.sceneConfig.useAntVL7Scene) {
252
+ antV7Scene = this.createAntVL7Scene(this.opts.mapId)
253
+ window.antV7Scene = antV7Scene;
254
+ }
255
+
256
+ this.hideLogo(map)
257
+ map.resize()
258
+ callback && callback(map, antV7Scene, this.mapgisMap, gisView);
259
+ },
260
+
261
+ initBaseDataLayers(baseLayers) {
262
+ let bLayers = []
263
+ if (MapConfig.isOnline) {
264
+ bLayers = baseLayers.map(layer => {
265
+ return new zondy.layer.WMTSLayer({
266
+ id: layer.name,
267
+ url: layer.url,
268
+ visible: layer.visible,
269
+ // 天地图必须加token,且token名为tk
270
+ tokenKey: 'tk',
271
+ // token请在天地图官网申请
272
+ tokenValue: TokenUtils.TDT_token,
273
+ // 瓦片显示策略
274
+ tileDisplayStrategy: 'hide', // 'stretch'拉伸 'hide'隐藏
275
+ minScale: this.getScaleBySridAndLevel(mapConfig.map_srid_code,mapConfig.minZoom),
276
+ maxScale: this.getScaleBySridAndLevel(mapConfig.map_srid_code,mapConfig.maxOnlineZoom)
277
+ })
278
+ })
279
+ } else {
280
+ bLayers = baseLayers.map(layer => {
281
+ return new zondy.layer.IGSTileLayer({
282
+ name: layer.name,
283
+ url: layer.url,
284
+ visible: layer.visible
285
+ })
286
+ })
287
+ }
288
+
289
+ // 初始化图层管理容器
290
+ this.mapgisMap.basemap = new zondy.Basemap({
291
+ // 设置图层到底图集合中
292
+ baseLayers: new zondy.Collection(bLayers)
293
+ })
294
+ },
295
+
296
+ /* 地图 */
297
+ // 增加瓦片范围判断
298
+ isValidTile(z, x, y, url) {
299
+ // 在这里写你的判断逻辑
300
+ // 例如:mapConfig.origin.maxBounds获取地图的经纬度范围从而判断z,x,y是否在有效范围内,如果是返回正确的url,否则返回一个空的图片
301
+ const mapBounds = mapConfig.origin.maxBounds;
302
+ const tileBounds = this.tile2lonlat(x, y, z);
303
+ if (this.boundsIntersect(tileBounds, mapBounds)) {
304
+ return {
305
+ url: url
306
+ }
307
+ } else {
308
+ // 返回一个空的透明图片 Data URL,阻止实际的网络请求
309
+ return {
310
+ url: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'
311
+ };
312
+ }
313
+ },
314
+
315
+ /**
316
+ * 瓦片坐标转经纬度
317
+ * @param x
318
+ * @param y
319
+ * @param z
320
+ * @returns {number[]}
321
+ */
322
+ tile2lonlat(x, y, z) {
323
+ // 计算瓦片左上角的经纬度
324
+ const n = Math.pow(2, z);
325
+ const lon1 = (x / n) * 360 - 180;
326
+ const lat1 = Math.atan(Math.sinh(Math.PI * (1 - 2 * y / n))) * (180 / Math.PI);
327
+
328
+ // 计算瓦片右下角的经纬度
329
+ const lon2 = ((x + 1) / n) * 360 - 180;
330
+ const lat2 = Math.atan(Math.sinh(Math.PI * (1 - 2 * (y + 1) / n))) * (180 / Math.PI);
331
+
332
+ // Mapbox GL JS 使用 TMS 方案,y 轴是反的,需要转换
333
+ // 如果你的服务是 XYZ 方案,请注释下面的 lat 转换
334
+ const tileSize = 256;
335
+ const tileCount = Math.pow(2, z);
336
+ const yTMS = tileCount - 1 - y;
337
+
338
+ // 重新计算 TMS 对应的经纬度
339
+ const lat1TMS = Math.atan(Math.sinh(Math.PI * (1 - 2 * yTMS / n))) * (180 / Math.PI);
340
+ const lat2TMS = Math.atan(Math.sinh(Math.PI * (1 - 2 * (yTMS + 1) / n))) * (180 / Math.PI);
341
+
342
+ return [lon1, lat2TMS, lon2, lat1TMS];
343
+ },
344
+
345
+ /**
346
+ * 判断两个边界框是否相交
347
+ * @param bounds1
348
+ * @param bounds2
349
+ * @returns {boolean}
350
+ */
351
+ boundsIntersect(bounds1, bounds2) {
352
+ // bounds 格式: [minLng, minLat, maxLng, maxLat]
353
+ return !(
354
+ bounds1[0] > bounds2[2] || // 左 > 右
355
+ bounds1[2] < bounds2[0] || // 右 < 左
356
+ bounds1[1] > bounds2[3] || // 下 > 上
357
+ bounds1[3] < bounds2[1] // 上 < 下
358
+ );
359
+ },
360
+
361
+ /**
362
+ * 更新底图可见性
363
+ * @param {String} type - 底图类型:'vector' 或 'image'
364
+ */
365
+ updateBaseMapVisibility: function (type) {
366
+ if (!this.mapgisMap || !mapConfig.isOnline) return;
367
+
368
+ const vecLayerIds = this.vectorSignalStr.map(signal => 'tdt_vec_' + signal + '_tiles');
369
+ const imgLayerIds = this.imageSignalStr.map(signal => 'tdt_img_' + signal + '_tiles');
370
+
371
+ vecLayerIds.forEach(layerId => {
372
+ const layer = this.mapgisMap.findLayerById(layerId)
373
+ if (layer) {
374
+ const visible = type === 'vector';
375
+ layer.visible = visibility;
376
+ }
377
+ });
378
+
379
+ imgLayerIds.forEach(layerId => {
380
+ const layer = this.mapgisMap.findLayerById(layerId)
381
+ if (layer) {
382
+ const visible = type === 'image';
383
+ layer.visible = visibility;
384
+ }
385
+ });
386
+ },
387
+
388
+ /**
389
+ * 获取要素(点选)
390
+ * @param e
391
+ */
392
+ getFeature: function (e) {
393
+ // 获取点击位置的要素
394
+ const features = map.queryRenderedFeatures(e.point);
395
+
396
+ if (features.length > 0) {
397
+ const feature = features[0];
398
+ console.log('点击的要素:', feature.properties);
399
+ return feature
400
+ }
401
+ },
402
+
403
+ /**
404
+ * 隐藏MapBoxgl logo
405
+ */
406
+ hideLogo: function () {
407
+ console.log('logo is hidden')
408
+ let controls = map._controls;
409
+ controls.forEach(control => {
410
+ // 去除logo控件
411
+ if ('_updateLogo' in control) {
412
+ map.removeControl(control)
413
+ }
414
+
415
+ // 去除attribute控件
416
+ if ('_attribHTML' in control) {
417
+ map.removeControl(control)
418
+ }
419
+ })
420
+ },
421
+
422
+ /**
423
+ * 切换底图
424
+ * @param {String} type -目标底图类型
425
+ */
426
+ changeMap: function (type) {
427
+ if (!map || type === this.mapType) return;
428
+
429
+ if (mapConfig.isOnline) {
430
+ this.updateBaseMapVisibility(type);
431
+ } else {
432
+ let changedLayers = null;
433
+ switch (type) {
434
+ case 'vector':
435
+ changedLayers = Vector_Layers;
436
+ break;
437
+ case 'image':
438
+ changedLayers = Image_Layers;
439
+ break;
440
+ default:
441
+ return;
442
+ }
443
+
444
+ changedLayers.forEach(layer => {
445
+ if (map.getLayer(layer.id)) {
446
+ map.setLayoutProperty(layer.id, 'visibility', layer.visibility);
447
+ }
448
+ });
449
+ }
450
+
451
+ this.mapType = type;
452
+ },
453
+
454
+ /**
455
+ * 重置地图中心点和缩放级别
456
+ * @param map
457
+ */
458
+ resetCenterAndZoom: function (map) {
459
+ if (!map) return;
460
+ map.jumpTo({center: mapConfig.center, zoom: mapConfig.zoom});
461
+ console.log('地图已重置到默认中心点和缩放级别');
462
+ },
463
+
464
+ /**
465
+ * 定位到当前位置
466
+ */
467
+ placePoint: function (map, location, callback) {
468
+ if (!map) return;
469
+ if (Array.isArray(location) && location.length === 2) {
470
+ map.setCenter(location)
471
+ map.setZoom(mapConfig.zoom);
472
+ } else {
473
+ navigator.geolocation.getCurrentPosition(
474
+ (position) => {
475
+ console.log('navigator.geolocation', position);
476
+ const point = {
477
+ lng: position.coords.longitude,
478
+ lat: position.coords.latitude
479
+ };
480
+
481
+ map.setCenter([point.lng, point.lat]);
482
+ map.setZoom(mapConfig.maxZoom);
483
+ callback && callback(point);
484
+ },
485
+ (error) => {
486
+ switch (error.code) {
487
+ case error.PERMISSION_DENIED:
488
+ console.error("用户拒绝了位置请求");
489
+ break;
490
+ case error.POSITION_UNAVAILABLE:
491
+ console.error("位置信息不可用");
492
+ break;
493
+ case error.TIMEOUT:
494
+ console.error("请求超时");
495
+ break;
496
+ default:
497
+ console.error("未知错误", error.message);
498
+ }
499
+ // 默认定位到地图中心点
500
+ const point = {lng: mapConfig.center[0], lat: mapConfig.center[1]};
501
+ map.setCenter([point.lng, point.lat]);
502
+ map.setZoom(mapConfig.maxZoom);
503
+ callback && callback(point);
504
+ },
505
+ {
506
+ enableHighAccuracy: true, // 高精度(可能更耗电)
507
+ timeout: 10000, // 10秒超时
508
+ maximumAge: 30000 // 允许使用30秒内的缓存位置
509
+ }
510
+ );
511
+ }
512
+ },
513
+
514
+ /**
515
+ * @param data
516
+ * @param customIcon (require结构的url)
517
+ * @param customIconName
518
+ */
519
+ addMarker: function (data, customIcon, customIconName) {
520
+ console.log('addMarker>>>>>>')
521
+ // 清除之前的标记图层和数据源
522
+ if (map.getLayer('marker-point')) {
523
+ map.removeLayer('marker-point');
524
+ }
525
+ if (map.getSource('marker-point')) {
526
+ map.removeSource('marker-point');
527
+ }
528
+
529
+ if (data.longitude && data.latitude) {
530
+ // 确保图标已加载到地图中
531
+ if (!map.hasImage('add_marker_icon')) {
532
+ map.loadImage(point_icon, (error, image) => {
533
+ if (error) throw error;
534
+ map.addImage('add_marker_icon', image);
535
+ });
536
+ }
537
+
538
+ if (!map.hasImage('custom-icon')) {
539
+ map.loadImage(customIcon, (error, image) => {
540
+ if (error) throw error;
541
+ map.addImage(customIconName || 'custom-icon', image);
542
+ });
543
+ }
544
+
545
+ // 创建GeoJSON数据源
546
+ const geojson = {
547
+ type: 'FeatureCollection',
548
+ features: [{
549
+ type: 'Feature',
550
+ geometry: {
551
+ type: 'Point',
552
+ coordinates: [data.longitude, data.latitude]
553
+ },
554
+ properties: {}
555
+ }]
556
+ };
557
+
558
+ // 添加数据源
559
+ map.addSource('marker-point', {
560
+ type: 'geojson',
561
+ data: geojson
562
+ });
563
+
564
+ // 添加图层显示标记点(使用自定义图标)
565
+ map.addLayer({
566
+ id: 'marker-point',
567
+ type: 'symbol',
568
+ source: 'marker-point',
569
+ layout: {
570
+ 'icon-image': customIconName || 'add_marker_icon',
571
+ 'icon-size': 1,
572
+ 'icon-offset': [4, -19]
573
+ }
574
+ });
575
+
576
+ // 设置地图中心点和缩放级别
577
+ map.setCenter([data.longitude, data.latitude]);
578
+ map.setZoom(data.zoom || mapConfig.maxZoom || 18);
579
+ }
580
+ },
581
+
582
+ /**
583
+ * 设置地图样式
584
+ */
585
+ setStyle: function (map) {
586
+ if (!map) return;
587
+
588
+ // 独立设置需要的mapbox内置样式
589
+ // 默认的base64 png图片 并进行addImage操作 iVBORw0KGgoAAAANSUhEUgAAAAsAAAArCAYAAABm8CLRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAd5JREFUeNqkld9LAlEUxr93Z3fHXV1bE1JLMoheIh/6B/oHIiilICjohR76A4KgHnroTwh6CIKgICIzKCvNMnVdXd3ZnbnndIcZZ3bWEPoNDnfuOed855tzzz1XGGNgGIbxf8DpdF5omoZer/eXpmmYTCaIRCJot9vwer3wer0wmUwAgFarhXa7jXa7jVarhXa7jU6ng263i16vh36/DwAYDAaIRCKIRCJE0zQMDAzAarWCZVlgjIFSCkopKKXgeR6CICAIAjiOA8dxIIQAQghIkoQkSSBJEkRRhCiKEEURPM+DYRgwDAOGYUBRFCiKAkVRoKoqVFUFpRSapkHzPGiapnnDMAzDMAzDMIzf8M8BXq8XPp8PPp8Poij+9Xg8hkajgXq9jkajgXq9jnq9jmazCUIIGGOglILneQiCAEEQIAgCOI4Dx3EQBAEcxyEQCECWZUiShEAgALvdDovFAovFApvNBovFAkmSIEmSJEnSNVmW/1JV9Zym6XOaptc0TT/QNP1A0/QDTdMPNE0/0DR9T9P0PU3TdzRN39I0fUPT9DVN01c0TV/SNH1B0/Q5TdOnNE2f0DR9TNP0EU3ThzRNH9A0vU/T9B5N07s0Te/SNL1D0/Q2TdNbNE1v0jS9QdP0Ok3TazRNr9I0vULT9DJN00s0TS/SNL1A0/Q8TdNzNE3P0jQ9Q9P0NE3TUzRN/6Rp+jhN00c0TR/SNH1A0/Q+TdN7NE3v0jS9Q9P0Nk3TWzRNb9I0vUHT9DpN02s0Ta/SNL1C0/QyTdNLNE0v0jS9QNP0PE3TczRNz9I0PUMmk0kkEgnE43HE43HE43HEYjFomgZKKSilIIQAAARBAM/zEAQBgiCA53nwPA+e58HzPHiehyAI4DgOHMeB53lwHAeO48BxHHiehyAI4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOPM+D53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB/wD/BGAAuJZK3XZCtKsAAAAASUVORK5CYII=
590
+ // 添加基于base64的自定义图片资源
591
+ if (!map.hasImage('custom_circle_icon')) {
592
+ const img = new Image();
593
+ img.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAArCAYAAABm8CLRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAd5JREFUeNqkld9LAlEUxr93Z3fHXV1bE1JLMoheIh/6B/oHIiilICjohR76A4KgHnroTwh6CIKgICIzKCvNMnVdXd3ZnbnndIcZZ3bWEPoNDnfuOed855tzzz1XGGNgGIbxf8DpdF5omoZer/eXpmmYTCaIRCLot9vwer3wer0wmUwAgFarhXa7jXa7jVarhXa7jU6ng263i16vh36/DwAYDAaIRCKIRCJE0zQMDAzAarWCZVlgjIFSCkopKKXgeR6CICAIAjiOA8dxIIQAQghIkoQkSSBJEkRRhCiKEEURPM+DYRgwDAOGYUBRFCiKAkVRoKoqVFUFpRSapkHzPGiapnnDMAzDMIzDMIzf8M8BXq8PPp8PPp8Poij+9Xg8hkajgXq9jkajgXq9jnq9jmazCUIIGGOglILneQiCAEEQIAgCOI4Dx3EQBAEcxyEQCECWZUiShEAgALvdDovFAovFApvNBovFAkmSIEmSJEnSNVmW/1JV9Zym6XOaptc0TT/QNP1A0/QDTdMPNE0/0DR9T9P0PU3TdzRN39I0fUPT9DVN01c0TV/SNH1B0/Q5TdOnNE2f0DR9TNP0EU3ThzRNH9A0vU/T9B5N07s0Te/SNL1D0/Q2TdNbNE1v0jS9QdP0Ok3TazRNr9I0vULT9DJN00s0TS/SNL1A0/Q8TdNzNE3P0jQ9Q9P0NE3TUzRN/6Rp+jhN00c0TR/SNH1A0/Q+TdN7NE3v0jS9Q9P0Nk3TWzRNb9I0vUHT9DpN02s0Ta/SNL1C0/QyTdNLNE0v0jS9QNP0PE3TczRNz9I0PUMmk0kkEgnE43HE43HEYjFomgZKKSilIIQAAARBAM/zEAQBgiCA53nwPA+e58HzPHiehyAI4DgOHMeB53lwHAeO48BxHHiehyAI4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOPM+D53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB53nwPA9BECAIAjiOA8dx4DgOHMeB/wD/BGAAuJZK3XZCtKsAAAAASUVORK5CYII=';
594
+ img.onload = () => {
595
+ map.addImage('custom_circle_icon', img);
596
+ };
597
+ }
598
+
599
+ // Mapbox GL JS使用不同的样式设置方式
600
+ // 这里可以设置预定义样式或自定义样式
601
+ // map.setStyle('mapbox://styles/mapbox/streets-v11');
602
+ },
603
+
604
+ /**
605
+ * 设置地图缩放级别和中心点
606
+ */
607
+ setZoom: function (map, points, zoomLevel = null) {
608
+ if (!map || !points || points.length === 0) return;
609
+
610
+ let coordinates;
611
+ if (typeof points[0] === 'number' && points.length % 2 === 0) {
612
+ // 处理扁平数组格式
613
+ coordinates = [];
614
+ for (let i = 0; i < points.length; i += 2) {
615
+ coordinates.push([points[i], points[i + 1]]);
616
+ }
617
+ } else {
618
+ // 处理对象数组格式
619
+ coordinates = points.map(p => [p.longitude, p.latitude]);
620
+ }
621
+
622
+ // 计算所有坐标的边界框
623
+ const bounds = coordinates.reduce(
624
+ (bbox, coord) => {
625
+ return [
626
+ Math.min(bbox[0], coord[0]), // 最小经度
627
+ Math.min(bbox[1], coord[1]), // 最小纬度
628
+ Math.max(bbox[2], coord[0]), // 最大经度
629
+ Math.max(bbox[3], coord[1]) // 最大纬度
630
+ ];
631
+ },
632
+ [Infinity, Infinity, -Infinity, -Infinity] // 初始边界
633
+ );
634
+
635
+ if (zoomLevel) {
636
+ const center = [
637
+ (bounds[0] + bounds[2]) / 2,
638
+ (bounds[1] + bounds[3]) / 2
639
+ ];
640
+ map.setCenter(center);
641
+ map.setZoom(zoomLevel);
642
+ } else {
643
+ map.fitBounds(
644
+ [[bounds[0], bounds[1]], [bounds[2], bounds[3]]],
645
+ {
646
+ padding: 80,
647
+ maxZoom: 16,
648
+ duration: 800
649
+ }
650
+ );
651
+ }
652
+ },
653
+
654
+ /**
655
+ * 绘制巡检任务
656
+ */
657
+ drawPatrolTask: function (map, data) {
658
+ if (!map || !data) return;
659
+
660
+ const points = data.patrolPointDetailDTOs || [];
661
+ const lines = data.patrolTaskPlanPaths || [];
662
+
663
+ if (!points.length || !lines.length) return;
664
+
665
+ this.setZoom(map, points);
666
+
667
+ // 清除之前的图层
668
+ if (map.getLayer('patrol-points')) map.removeLayer('patrol-points');
669
+ if (map.getSource('patrol-points')) map.removeSource('patrol-points');
670
+ if (map.getLayer('patrol-lines')) map.removeLayer('patrol-lines');
671
+ if (map.getSource('patrol-lines')) map.removeSource('patrol-lines');
672
+
673
+ // 添加点数据
674
+ const pointFeatures = points.map(po => ({
675
+ type: 'Feature',
676
+ geometry: {
677
+ type: 'Point',
678
+ coordinates: [po.longitude, po.latitude]
679
+ },
680
+ properties: {
681
+ ...po
682
+ }
683
+ }));
684
+
685
+ map.addSource('patrol-points', {
686
+ type: 'geojson',
687
+ data: {
688
+ type: 'FeatureCollection',
689
+ features: pointFeatures
690
+ }
691
+ });
692
+
693
+ // 根据状态设置不同图标
694
+ map.addLayer({
695
+ id: 'patrol-points',
696
+ type: 'circle',
697
+ source: 'patrol-points',
698
+ paint: {
699
+ 'circle-radius': 6,
700
+ 'circle-color': [
701
+ 'match',
702
+ ['get', 'status'],
703
+ '正常', '#7ed321',
704
+ '异常', '#ff0000',
705
+ '未检', '#9b9b9b',
706
+ '#3a6bdb' // 默认颜色
707
+ ],
708
+ 'circle-stroke-width': 2,
709
+ 'circle-stroke-color': '#ffffff'
710
+ }
711
+ });
712
+
713
+ // 添加点标签
714
+ map.addLayer({
715
+ id: 'patrol-point-labels',
716
+ type: 'symbol',
717
+ source: 'patrol-points',
718
+ layout: {
719
+ 'text-field': ['get', 'patrolPoint'],
720
+ 'text-offset': [0, 1.5],
721
+ 'text-anchor': 'top'
722
+ },
723
+ paint: {
724
+ 'text-color': '#0093ff'
725
+ }
726
+ });
727
+
728
+ // 添加线数据
729
+ if (lines.length >= 2) {
730
+ const lineFeatures = [];
731
+ for (let i = 0; i < lines.length - 1; i++) {
732
+ lineFeatures.push({
733
+ type: 'Feature',
734
+ geometry: {
735
+ type: 'LineString',
736
+ coordinates: [
737
+ [lines[i].longitude, lines[i].latitude],
738
+ [lines[i + 1].longitude, lines[i + 1].latitude]
739
+ ]
740
+ },
741
+ properties: {
742
+ validate: lines[i].validate
743
+ }
744
+ });
745
+ }
746
+
747
+ map.addSource('patrol-lines', {
748
+ type: 'geojson',
749
+ data: {
750
+ type: 'FeatureCollection',
751
+ features: lineFeatures
752
+ }
753
+ });
754
+
755
+ map.addLayer({
756
+ id: 'patrol-lines',
757
+ type: 'line',
758
+ source: 'patrol-lines',
759
+ paint: {
760
+ 'line-color': [
761
+ 'match',
762
+ ['get', 'validate'],
763
+ 'valid', plan_color_valid,
764
+ plan_color_invalid
765
+ ],
766
+ 'line-width': 4
767
+ }
768
+ });
769
+ }
770
+ },
771
+
772
+ /**
773
+ * 绘制巡检路径
774
+ */
775
+ drawPatrol: function (map, data, pointField) {
776
+ if (!map || !data) return;
777
+ const taskUniqueId = data.id || data.patrolTaskId;
778
+ if (!taskUniqueId) return;
779
+
780
+ const points = data.patrolTaskPointTrackDTOs || [];
781
+ const lines = data.patrolTaskPlanPaths || [];
782
+ if (!points.length || !lines.length) return;
783
+
784
+ this.setZoom(map, points);
785
+
786
+ // 定义动态唯一ID
787
+ const pointSourceId = `patrol-track-points-${taskUniqueId}`;
788
+ const pointIconLayerId = `patrol-track-points-icons-${taskUniqueId}`;
789
+ const pointLabelLayerId = `patrol-track-point-labels-${taskUniqueId}`;
790
+ const lineSourceId = `patrol-track-lines-${taskUniqueId}`;
791
+ const lineLayerId = `patrol-track-lines-${taskUniqueId}`;
792
+
793
+ // 清除旧图层/数据源(使用动态ID)
794
+ if (map.getLayer(pointIconLayerId)) map.removeLayer(pointIconLayerId);
795
+ if (map.getLayer(pointLabelLayerId)) map.removeLayer(pointLabelLayerId);
796
+ if (map.getSource(pointSourceId)) map.removeSource(pointSourceId);
797
+ if (map.getLayer(lineLayerId)) map.removeLayer(lineLayerId);
798
+ if (map.getSource(lineSourceId)) map.removeSource(lineSourceId);
799
+
800
+ // 添加点数据
801
+ const pointFeatures = points.map(po => ({
802
+ type: 'Feature',
803
+ geometry: {
804
+ type: 'Point',
805
+ coordinates: [po.longitude, po.latitude]
806
+ },
807
+ properties: {
808
+ ...po
809
+ }
810
+ }));
811
+
812
+ // 在 addSource 中添加图标属性
813
+ map.addSource(pointSourceId, {
814
+ type: 'geojson',
815
+ data: {
816
+ type: 'FeatureCollection',
817
+ features: pointFeatures.map(feature => {
818
+ let icon;
819
+ const status = feature.properties.status;
820
+ switch (status) {
821
+ case '正常':
822
+ icon = 'img_done';
823
+ break;
824
+ case '异常':
825
+ icon = 'img_error';
826
+ break;
827
+ case '未检':
828
+ icon = 'img_invalid';
829
+ break;
830
+ default:
831
+ icon = 'img_todo';
832
+ break;
833
+ }
834
+ return {
835
+ ...feature,
836
+ properties: {...feature.properties, icon: icon}
837
+ };
838
+ })
839
+ }
840
+ });
841
+
842
+ // 在图层中使用图标
843
+ map.addLayer({
844
+ id: pointIconLayerId,
845
+ type: 'symbol',
846
+ source: pointSourceId,
847
+ layout: {
848
+ 'icon-image': ['get', 'icon'],
849
+ 'icon-size': 1,
850
+ 'icon-anchor': 'bottom'
851
+ }
852
+ });
853
+
854
+ // 添加点标签
855
+ map.addLayer({
856
+ id: pointLabelLayerId,
857
+ type: 'symbol',
858
+ source: pointSourceId,
859
+ layout: {
860
+ 'text-field': ['get', 'patrolPointName'],
861
+ 'text-offset': [0, 1.5],
862
+ 'text-anchor': 'top'
863
+ },
864
+ paint: {'text-color': '#0093ff'}
865
+ });
866
+
867
+ // 添加线数据,绑定任务信息到 properties
868
+ if (lines.length >= 2) {
869
+ const lineFeatures = [];
870
+ for (let i = 0; i < lines.length - 1; i++) {
871
+ lineFeatures.push({
872
+ type: 'Feature',
873
+ geometry: {
874
+ type: 'LineString',
875
+ coordinates: [
876
+ [lines[i].longitude, lines[i].latitude],
877
+ [lines[i + 1].longitude, lines[i + 1].latitude]
878
+ ]
879
+ },
880
+ properties: {
881
+ validate: lines[i].validate,
882
+ taskId: taskUniqueId,
883
+ taskInfo: {
884
+ name: data.name,
885
+ executeStatus: data.executeStatus,
886
+ startTime: data.startTime,
887
+ endTime: data.endTime,
888
+ faultCount: data.faultCount,
889
+ patrolPointCount: data.patrolPointCount,
890
+ inspectedCount: data.inspectedCount,
891
+ planPathLength: data.planPathLength,
892
+ validPathLength: data.validPathLength
893
+ }
894
+ }
895
+ });
896
+ }
897
+
898
+ map.addSource(lineSourceId, {
899
+ type: 'geojson',
900
+ data: {type: 'FeatureCollection', features: lineFeatures}
901
+ });
902
+
903
+ map.addLayer({
904
+ id: lineLayerId,
905
+ type: 'line',
906
+ source: lineSourceId,
907
+ paint: {
908
+ 'line-color': ['match', ['get', 'validate'], 'valid', plan_color_valid, plan_color_invalid],
909
+ 'line-width': 4,
910
+ 'line-dasharray': [2, 2]
911
+ },
912
+ interactive: true // 开启线图层点击交互
913
+ });
914
+ }
915
+
916
+ // console.log('当前地图图层ID列表:', map.getStyle().layers.map(layer => layer.id));
917
+ },
918
+
919
+ /**
920
+ * 绘制巡检任务(高德)
921
+ */
922
+ drawPatrolTaskInGaoDe: function (map, data) {
923
+ if (!map || !data) return;
924
+
925
+ const points = data.patrolPointDetailDTOs || [];
926
+ const lines = data.patrolTaskPlanPaths || [];
927
+
928
+ if (!points.length || !lines.length) return;
929
+
930
+ this.setZoom(map, points);
931
+
932
+ // 清除之前的图层
933
+ if (map.getLayer('patrol-points')) map.removeLayer('patrol-points');
934
+ if (map.getSource('patrol-points')) map.removeSource('patrol-points');
935
+ if (map.getLayer('patrol-lines')) map.removeLayer('patrol-lines');
936
+ if (map.getSource('patrol-lines')) map.removeSource('patrol-lines');
937
+
938
+ // 添加点数据
939
+ // 返回高德结果时需要进行wgs84转gcj02
940
+ points.forEach(po => {
941
+ [po.longitude, po.latitude] = SpatialRefUtils.wgs84toGcj02([po.longitude, po.latitude])
942
+ })
943
+ const pointFeatures = points.map(po => ({
944
+ type: 'Feature',
945
+ geometry: {
946
+ type: 'Point',
947
+ coordinates: [po.longitude, po.latitude]
948
+ },
949
+ properties: {
950
+ ...po
951
+ }
952
+ }));
953
+
954
+ map.addSource('patrol-points', {
955
+ type: 'geojson',
956
+ data: {
957
+ type: 'FeatureCollection',
958
+ features: pointFeatures
959
+ }
960
+ });
961
+
962
+ // 根据状态设置不同图标
963
+ map.addLayer({
964
+ id: 'patrol-points',
965
+ type: 'circle',
966
+ source: 'patrol-points',
967
+ paint: {
968
+ 'circle-radius': 6,
969
+ 'circle-color': [
970
+ 'match',
971
+ ['get', 'status'],
972
+ '正常', '#7ed321',
973
+ '异常', '#ff0000',
974
+ '未检', '#9b9b9b',
975
+ '#3a6bdb' // 默认颜色
976
+ ],
977
+ 'circle-stroke-width': 2,
978
+ 'circle-stroke-color': '#ffffff'
979
+ }
980
+ });
981
+
982
+ // 添加点标签
983
+ map.addLayer({
984
+ id: 'patrol-point-labels',
985
+ type: 'symbol',
986
+ source: 'patrol-points',
987
+ layout: {
988
+ 'text-field': ['get', 'patrolPoint'],
989
+ 'text-offset': [0, 1.5],
990
+ 'text-anchor': 'top'
991
+ },
992
+ paint: {
993
+ 'text-color': '#0093ff'
994
+ }
995
+ });
996
+
997
+ // 添加线数据
998
+ if (lines.length >= 2) {
999
+ const lineFeatures = [];
1000
+ for (let i = 0; i < lines.length - 1; i++) {
1001
+ lineFeatures.push({
1002
+ type: 'Feature',
1003
+ geometry: {
1004
+ type: 'LineString',
1005
+ coordinates: [
1006
+ [lines[i].longitude, lines[i].latitude],
1007
+ [lines[i + 1].longitude, lines[i + 1].latitude]
1008
+ ]
1009
+ },
1010
+ properties: {
1011
+ validate: lines[i].validate
1012
+ }
1013
+ });
1014
+ }
1015
+
1016
+ map.addSource('patrol-lines', {
1017
+ type: 'geojson',
1018
+ data: {
1019
+ type: 'FeatureCollection',
1020
+ features: lineFeatures
1021
+ }
1022
+ });
1023
+
1024
+ map.addLayer({
1025
+ id: 'patrol-lines',
1026
+ type: 'line',
1027
+ source: 'patrol-lines',
1028
+ paint: {
1029
+ 'line-color': [
1030
+ 'match',
1031
+ ['get', 'validate'],
1032
+ 'valid', plan_color_valid,
1033
+ plan_color_invalid
1034
+ ],
1035
+ 'line-width': 4
1036
+ }
1037
+ });
1038
+ }
1039
+ },
1040
+
1041
+ /**
1042
+ * 绘制巡检路径(高德)
1043
+ */
1044
+ drawPatrolInGaoDe: function (map, data, pointField) {
1045
+ if (!map || !data) return;
1046
+ const taskUniqueId = data.id || data.patrolTaskId;
1047
+ if (!taskUniqueId) return;
1048
+
1049
+ const points = data.patrolTaskPointTrackDTOs || [];
1050
+ const lines = data.patrolTaskPlanPaths || [];
1051
+ if (!points.length || !lines.length) return;
1052
+
1053
+ this.setZoom(map, points);
1054
+
1055
+ // 定义动态唯一ID
1056
+ const pointSourceId = `patrol-track-points-${taskUniqueId}`;
1057
+ const pointIconLayerId = `patrol-track-points-icons-${taskUniqueId}`;
1058
+ const pointLabelLayerId = `patrol-track-point-labels-${taskUniqueId}`;
1059
+ const lineSourceId = `patrol-track-lines-${taskUniqueId}`;
1060
+ const lineLayerId = `patrol-track-lines-${taskUniqueId}`;
1061
+
1062
+ // 清除旧图层/数据源(使用动态ID)
1063
+ if (map.getLayer(pointIconLayerId)) map.removeLayer(pointIconLayerId);
1064
+ if (map.getLayer(pointLabelLayerId)) map.removeLayer(pointLabelLayerId);
1065
+ if (map.getSource(pointSourceId)) map.removeSource(pointSourceId);
1066
+ if (map.getLayer(lineLayerId)) map.removeLayer(lineLayerId);
1067
+ if (map.getSource(lineSourceId)) map.removeSource(lineSourceId);
1068
+
1069
+ // 添加点数据
1070
+ // 返回高德结果时需要进行wgs84转gcj02
1071
+ points.forEach(po => {
1072
+ [po.longitude, po.latitude] = SpatialRefUtils.wgs84toGcj02([po.longitude, po.latitude])
1073
+ })
1074
+ const pointFeatures = points.map(po => ({
1075
+ type: 'Feature',
1076
+ geometry: {
1077
+ type: 'Point',
1078
+ coordinates: [po.longitude, po.latitude]
1079
+ },
1080
+ properties: {
1081
+ ...po
1082
+ }
1083
+ }));
1084
+
1085
+ // 在 addSource 中添加图标属性
1086
+ map.addSource(pointSourceId, {
1087
+ type: 'geojson',
1088
+ data: {
1089
+ type: 'FeatureCollection',
1090
+ features: pointFeatures.map(feature => {
1091
+ let icon;
1092
+ const status = feature.properties.status;
1093
+ switch (status) {
1094
+ case '正常':
1095
+ icon = 'img_done';
1096
+ break;
1097
+ case '异常':
1098
+ icon = 'img_error';
1099
+ break;
1100
+ case '未检':
1101
+ icon = 'img_invalid';
1102
+ break;
1103
+ default:
1104
+ icon = 'img_todo';
1105
+ break;
1106
+ }
1107
+ return {
1108
+ ...feature,
1109
+ properties: {...feature.properties, icon: icon}
1110
+ };
1111
+ })
1112
+ }
1113
+ });
1114
+
1115
+ // 在图层中使用图标
1116
+ map.addLayer({
1117
+ id: pointIconLayerId,
1118
+ type: 'symbol',
1119
+ source: pointSourceId,
1120
+ layout: {
1121
+ 'icon-image': ['get', 'icon'],
1122
+ 'icon-size': 1,
1123
+ 'icon-anchor': 'bottom'
1124
+ }
1125
+ });
1126
+
1127
+ // 添加点标签
1128
+ map.addLayer({
1129
+ id: pointLabelLayerId,
1130
+ type: 'symbol',
1131
+ source: pointSourceId,
1132
+ layout: {
1133
+ 'text-field': ['get', 'patrolPointName'],
1134
+ 'text-offset': [0, 1.5],
1135
+ 'text-anchor': 'top'
1136
+ },
1137
+ paint: {'text-color': '#0093ff'}
1138
+ });
1139
+
1140
+ // 添加线数据,绑定任务信息到 properties
1141
+ if (lines.length >= 2) {
1142
+ const lineFeatures = [];
1143
+ for (let i = 0; i < lines.length - 1; i++) {
1144
+ lineFeatures.push({
1145
+ type: 'Feature',
1146
+ geometry: {
1147
+ type: 'LineString',
1148
+ coordinates: [
1149
+ [lines[i].longitude, lines[i].latitude],
1150
+ [lines[i + 1].longitude, lines[i + 1].latitude]
1151
+ ]
1152
+ },
1153
+ properties: {
1154
+ validate: lines[i].validate,
1155
+ taskId: taskUniqueId,
1156
+ taskInfo: {
1157
+ name: data.name,
1158
+ executeStatus: data.executeStatus,
1159
+ startTime: data.startTime,
1160
+ endTime: data.endTime,
1161
+ faultCount: data.faultCount,
1162
+ patrolPointCount: data.patrolPointCount,
1163
+ inspectedCount: data.inspectedCount,
1164
+ planPathLength: data.planPathLength,
1165
+ validPathLength: data.validPathLength
1166
+ }
1167
+ }
1168
+ });
1169
+ }
1170
+
1171
+ map.addSource(lineSourceId, {
1172
+ type: 'geojson',
1173
+ data: {type: 'FeatureCollection', features: lineFeatures}
1174
+ });
1175
+
1176
+ map.addLayer({
1177
+ id: lineLayerId,
1178
+ type: 'line',
1179
+ source: lineSourceId,
1180
+ paint: {
1181
+ 'line-color': ['match', ['get', 'validate'], 'valid', plan_color_valid, plan_color_invalid],
1182
+ 'line-width': 4,
1183
+ 'line-dasharray': [2, 2]
1184
+ },
1185
+ interactive: true // 开启线图层点击交互
1186
+ });
1187
+ }
1188
+
1189
+ // console.log('当前地图图层ID列表:', map.getStyle().layers.map(layer => layer.id));
1190
+ },
1191
+
1192
+ /**
1193
+ * 添加搜索功能
1194
+ * @param {string} containerId - 搜索输入框的容器ID
1195
+ * @param {Array} bounds - 搜索边界范围
1196
+ * @param {Function} callback - 回调函数
1197
+ */
1198
+ addSearch: function (containerId, bounds = [], callback) {
1199
+ // 检查容器ID是否存在
1200
+ if (!containerId) return;
1201
+
1202
+ // 通过容器ID获取输入框元素
1203
+ const inputElement = document.getElementById(containerId);
1204
+ inputElement.setAttribute('placeholder', '请输入搜索内容并通过↩︎进行查询')
1205
+ if (!inputElement) {
1206
+ console.error(`未找到ID为 ${containerId} 的输入框元素`);
1207
+ return;
1208
+ }
1209
+
1210
+ // 创建搜索结果容器并插入到输入框下方
1211
+ let resultListContainer = document.getElementById(`${containerId}-results`);
1212
+ if (!resultListContainer) {
1213
+ resultListContainer = document.createElement('div');
1214
+ resultListContainer.id = `${containerId}-results`;
1215
+ resultListContainer.className = 'search-results-container';
1216
+ inputElement.parentNode.insertBefore(resultListContainer, inputElement.nextSibling);
1217
+ }
1218
+
1219
+ // 默认隐藏搜索结果容器
1220
+ resultListContainer.style.display = 'none';
1221
+
1222
+ // 监听输入事件,当输入为空时清空并隐藏结果列表
1223
+ inputElement.addEventListener('input', (event) => {
1224
+ const keyword = event.target.value.trim();
1225
+ if (!keyword) {
1226
+ // 清空并隐藏搜索结果列表
1227
+ this.clearSearchResults(containerId);
1228
+ }
1229
+ });
1230
+
1231
+ inputElement.addEventListener('keydown', (event) => {
1232
+ if (event.key === 'Enter') {
1233
+ event.preventDefault();
1234
+ const keyword = inputElement.value.trim();
1235
+ if (keyword) {
1236
+ this.executeSearch(containerId, bounds, (poiList) => {
1237
+ // 展示搜索结果列表
1238
+ this.showSearchResults(containerId, poiList);
1239
+ callback && callback(poiList);
1240
+ });
1241
+ } else {
1242
+ // 如果输入为空,清空并隐藏结果列表
1243
+ this.clearSearchResults(containerId);
1244
+ }
1245
+ }
1246
+ });
1247
+
1248
+ // 添加输入框失去焦点时隐藏结果列表的事件
1249
+ inputElement.addEventListener('blur', () => {
1250
+ // 延迟隐藏,确保点击列表项时不会立即隐藏
1251
+ setTimeout(() => {
1252
+ if (resultListContainer) {
1253
+ resultListContainer.style.display = 'none';
1254
+ }
1255
+ }, 200);
1256
+ });
1257
+
1258
+ // 添加输入框获得焦点时显示结果列表的事件(如果有结果)
1259
+ inputElement.addEventListener('focus', () => {
1260
+ if (resultListContainer && resultListContainer.children.length > 0) {
1261
+ resultListContainer.style.display = 'block';
1262
+ }
1263
+ });
1264
+ },
1265
+
1266
+ /**
1267
+ * 清空并隐藏搜索结果列表
1268
+ * @param {string} containerId - 搜索输入框的容器ID
1269
+ */
1270
+ clearSearchResults: function (containerId) {
1271
+ const resultListContainer = document.getElementById(`${containerId}-results`);
1272
+ if (resultListContainer) {
1273
+ resultListContainer.innerHTML = '';
1274
+ resultListContainer.style.display = 'none';
1275
+ }
1276
+
1277
+ // 同时清除地图上的POI结果
1278
+ this.clearPOIResults();
1279
+ },
1280
+
1281
+ /**
1282
+ * 展示搜索结果列表
1283
+ * @param {string} containerId - 搜索输入框的容器ID
1284
+ * @param {Array} poiList - POI结果列表
1285
+ */
1286
+ showSearchResults: function (containerId, poiList) {
1287
+ const resultListContainer = document.getElementById(`${containerId}-results`);
1288
+ if (!resultListContainer) return;
1289
+
1290
+ // 清空容器内容
1291
+ resultListContainer.innerHTML = '';
1292
+
1293
+ if (!poiList || poiList.length === 0) {
1294
+ resultListContainer.innerHTML = '<div class="no-results">未找到相关结果</div>';
1295
+ resultListContainer.style.display = 'block';
1296
+ return;
1297
+ }
1298
+
1299
+ // 创建结果列表
1300
+ const resultList = document.createElement('ul');
1301
+ resultList.className = 'search-result-list';
1302
+
1303
+ // 为每个POI创建列表项
1304
+ poiList.forEach((poi, index) => {
1305
+ const listItem = document.createElement('li');
1306
+ listItem.className = 'search-result-item';
1307
+ listItem.dataset.index = index;
1308
+
1309
+ // 设置列表项内容
1310
+ listItem.innerHTML = `
1311
+ <div class="result-item-header">
1312
+ <span class="result-item-name">${poi.name || '未知名称'}</span>
1313
+ ${poi.type ? `<span class="result-item-type">${poi.type}</span>` : ''}
1314
+ </div>
1315
+ ${poi.address ? `<div class="result-item-address">${poi.address}</div>` : ''}
1316
+ ${poi.tel ? `<div class="result-item-tel">电话: ${poi.tel}</div>` : ''}
1317
+ `;
1318
+
1319
+ // 绑定点击事件,实现定位功能
1320
+ listItem.addEventListener('mousedown', (e) => {
1321
+ // 使用mousedown而不是click,避免blur事件先触发
1322
+ e.preventDefault();
1323
+ this.focusOnPOI(poi);
1324
+ });
1325
+
1326
+ resultList.appendChild(listItem);
1327
+ });
1328
+
1329
+ resultListContainer.appendChild(resultList);
1330
+ resultListContainer.style.display = 'block';
1331
+ },
1332
+
1333
+ /**
1334
+ * 定位到指定POI
1335
+ * @param {Object} poi - POI对象
1336
+ */
1337
+ focusOnPOI: function (poi) {
1338
+ if (!map || !poi || !poi.longitude || !poi.latitude) return;
1339
+
1340
+ // 移动地图到POI位置
1341
+ map.flyTo({
1342
+ center: [poi.longitude, poi.latitude],
1343
+ zoom: 18,
1344
+ essential: true // 动画不受 prefers-reduced-motion 影响
1345
+ });
1346
+
1347
+ // 高亮显示该POI(如果地图上已有POI结果图层)
1348
+ if (map.getSource('poi-results')) {
1349
+ // 创建临时标记
1350
+ const popup = new mapboxgl.Popup({
1351
+ closeButton: false,
1352
+ className: 'poi-focus-popup'
1353
+ })
1354
+ .setLngLat([poi.longitude, poi.latitude])
1355
+ .setHTML(`<div class="poi-focus-content">${poi.name}</div>`)
1356
+ .addTo(map);
1357
+
1358
+ // 3秒后自动关闭弹窗
1359
+ setTimeout(() => {
1360
+ if (popup.isOpen()) {
1361
+ popup.remove();
1362
+ }
1363
+ }, 3000);
1364
+ }
1365
+ },
1366
+
1367
+ executeSearch: function (containerId, bounds = [], callback) {
1368
+ // 通过容器ID获取输入框元素
1369
+ const inputElement = document.getElementById(containerId);
1370
+ if (!inputElement) {
1371
+ console.error(`未找到ID为 ${containerId} 的输入框元素`);
1372
+ return;
1373
+ }
1374
+ // 获取输入框的值作为搜索关键词
1375
+ const keyword = inputElement.value.trim();
1376
+ if (!keyword) return;
1377
+
1378
+ // 天地图POI搜索API URL (使用注释中的v2/search接口)
1379
+ const baseUrl = mapConfig.TDT_query_url;
1380
+
1381
+ // 构建请求参数 (按照注释中的格式)
1382
+ const postStr = {
1383
+ keyWord: keyword,
1384
+ level: 12,
1385
+ queryType: 1,
1386
+ start: 0,
1387
+ count: 100
1388
+ };
1389
+
1390
+ // 如果提供了搜索范围,则添加边界参数
1391
+ if (bounds && bounds.length === 4) {
1392
+ postStr.mapBound = `${bounds[0]},${bounds[1]},${bounds[2]},${bounds[3]}`;
1393
+ } else {
1394
+ postStr.mapBound = `${mapConfig.mapExtent[0]},${mapConfig.mapExtent[1]},${mapConfig.mapExtent[2]},${mapConfig.mapExtent[3]}`;
1395
+ }
1396
+
1397
+ // 构建完整的请求URL
1398
+ const params = new URLSearchParams({
1399
+ postStr: JSON.stringify(postStr),
1400
+ type: 'query',
1401
+ tk: TokenUtils.TDT_token
1402
+ });
1403
+
1404
+ // 发送请求
1405
+ fetch(`${baseUrl}?${params.toString()}`)
1406
+ .then(response => response.json())
1407
+ .then(data => {
1408
+ if (data.pois) {
1409
+ // 处理返回的数据,转换为统一格式
1410
+ const poiList = data.pois.map(item => ({
1411
+ id: item.lonlat ? item.lonlat.split(',')[1] : '', // 使用lonlat生成ID
1412
+ name: item.name,
1413
+ address: item.address || '',
1414
+ longitude: item.lonlat ? parseFloat(item.lonlat.split(',')[0]) : 0,
1415
+ latitude: item.lonlat ? parseFloat(item.lonlat.split(',')[1]) : 0,
1416
+ tel: item.phone || '',
1417
+ type: item.type || ''
1418
+ }));
1419
+
1420
+ // 使用Mapbox绘制POI结果
1421
+ this.drawPOIResults(poiList);
1422
+
1423
+ callback && callback(poiList);
1424
+ } else {
1425
+ this.clearPOIResults();
1426
+ callback && callback([]);
1427
+ }
1428
+ })
1429
+ .catch(error => {
1430
+ console.error('天地图POI搜索失败:', error);
1431
+ this.clearPOIResults();
1432
+ callback && callback([]);
1433
+ });
1434
+ },
1435
+
1436
+ /**
1437
+ * 绘制POI搜索结果到地图上
1438
+ * @param {Array} poiList - POI结果列表
1439
+ */
1440
+ drawPOIResults: function (poiList) {
1441
+ if (!map || !poiList || !poiList.length) return;
1442
+
1443
+ // 清除之前的结果图层
1444
+ this.clearPOIResults();
1445
+
1446
+ // 创建GeoJSON数据
1447
+ const geojson = {
1448
+ type: 'FeatureCollection',
1449
+ features: poiList.map(poi => ({
1450
+ type: 'Feature',
1451
+ geometry: {
1452
+ type: 'Point',
1453
+ coordinates: [poi.longitude, poi.latitude]
1454
+ },
1455
+ properties: {
1456
+ id: poi.id,
1457
+ name: poi.name,
1458
+ address: poi.address,
1459
+ tel: poi.tel,
1460
+ type: poi.type
1461
+ }
1462
+ }))
1463
+ };
1464
+
1465
+ // 添加数据源
1466
+ map.addSource('poi-results', {
1467
+ type: 'geojson',
1468
+ data: geojson
1469
+ });
1470
+
1471
+ // 添加点图层
1472
+ map.addLayer({
1473
+ id: 'poi-results',
1474
+ type: 'circle',
1475
+ source: 'poi-results',
1476
+ paint: {
1477
+ 'circle-radius': 8,
1478
+ 'circle-color': '#ff6b35',
1479
+ 'circle-stroke-width': 2,
1480
+ 'circle-stroke-color': '#ffffff'
1481
+ }
1482
+ });
1483
+
1484
+ // 添加标签图层
1485
+ map.addLayer({
1486
+ id: 'poi-labels',
1487
+ type: 'symbol',
1488
+ source: 'poi-results',
1489
+ layout: {
1490
+ 'text-field': ['get', 'name'],
1491
+ 'text-offset': [0, 1.5],
1492
+ 'text-anchor': 'top',
1493
+ 'text-size': 12
1494
+ },
1495
+ paint: {
1496
+ 'text-color': '#333333',
1497
+ 'text-halo-color': '#ffffff',
1498
+ 'text-halo-width': 1
1499
+ }
1500
+ });
1501
+
1502
+ // 添加点击事件
1503
+ map.on('click', 'poi-results', (e) => {
1504
+ const feature = e.features[0];
1505
+ new mapboxgl.Popup({offset: [0, -15]})
1506
+ .setLngLat(feature.geometry.coordinates)
1507
+ .setHTML(` <div style="padding: 10px;">
1508
+ <h3 style="margin: 0 0 5px 0;">${feature.properties.name}</h3>
1509
+ <p style="margin: 5px 0;"><strong>地址:</strong> ${feature.properties.address || '无'}</p>
1510
+ <p style="margin: 5px 0;"><strong>电话:</strong> ${feature.properties.tel || '无'}</p>
1511
+ <p style="margin: 5px 0;"><strong>类型:</strong> ${feature.properties.type || '未知'}</p>
1512
+ </div>
1513
+ `)
1514
+ .addTo(map);
1515
+ });
1516
+
1517
+ // 设置鼠标悬停效果
1518
+ map.on('mouseenter', 'poi-results', () => {
1519
+ map.getCanvas().style.cursor = 'pointer';
1520
+ });
1521
+
1522
+ map.on('mouseleave', 'poi-results', () => {
1523
+ map.getCanvas().style.cursor = '';
1524
+ });
1525
+ },
1526
+
1527
+ /**
1528
+ * 清除POI搜索结果
1529
+ */
1530
+ clearPOIResults: function () {
1531
+ if (!map) return;
1532
+
1533
+ if (map.getLayer('poi-results')) {
1534
+ map.removeLayer('poi-results');
1535
+ }
1536
+ if (map.getLayer('poi-labels')) {
1537
+ map.removeLayer('poi-labels');
1538
+ }
1539
+ if (map.getSource('poi-results')) {
1540
+ map.removeSource('poi-results');
1541
+ }
1542
+
1543
+ // 移除事件监听器
1544
+ map.off('click', 'poi-results');
1545
+ map.off('mouseenter', 'poi-results');
1546
+ map.off('mouseleave', 'poi-results');
1547
+ },
1548
+
1549
+ /**
1550
+ * 转换数据点为地图点
1551
+ */
1552
+ getMapboxPoints: function (data) {
1553
+ if (!data) return [];
1554
+ return data.map(item => [item.longitude, item.latitude]);
1555
+ },
1556
+
1557
+ /**
1558
+ * 标记点位并支持拖拽移动
1559
+ * @param {Object} map - 地图实例
1560
+ * @param {Array|Object} points - 点位数据
1561
+ * @param {Boolean} disableDrag - 是否禁用拖拽功能
1562
+ * @param {Function} onDragEnd - 拖拽结束回调函数,返回更新后的点位信息
1563
+ */
1564
+ hitPoint: function (map, points, disableDrag = true, onDragEnd) {
1565
+ if (!map) return;
1566
+
1567
+ let pointsArray = Array.isArray(points) ? points : [points];
1568
+
1569
+ // 创建点数据源 - 改进数据验证逻辑,允许坐标值为0
1570
+ const features = pointsArray
1571
+ .filter(point =>
1572
+ typeof point.longitude !== 'undefined' &&
1573
+ typeof point.latitude !== 'undefined' &&
1574
+ point.longitude !== null &&
1575
+ point.latitude !== null
1576
+ )
1577
+ .map((point, idx) => ({
1578
+ type: 'Feature',
1579
+ geometry: {
1580
+ type: 'Point',
1581
+ coordinates: [point.longitude, point.latitude]
1582
+ },
1583
+ properties: {
1584
+ id: point.id,
1585
+ patrolPoint: point.patrolPoint
1586
+ }
1587
+ }));
1588
+
1589
+ // 添加数据源和图层
1590
+ if (!map.getSource('hit-points')) {
1591
+ map.addSource('hit-points', {
1592
+ type: 'geojson',
1593
+ data: {
1594
+ type: 'FeatureCollection',
1595
+ features: features
1596
+ }
1597
+ });
1598
+
1599
+ map.addLayer({
1600
+ id: 'hit-points',
1601
+ type: 'circle',
1602
+ source: 'hit-points',
1603
+ minzoom: 5,
1604
+ maxZoom: 19,
1605
+ layout: {
1606
+ 'visibility': 'visible' // 显式设置图层可见性
1607
+ },
1608
+ paint: {
1609
+ 'circle-radius': 6,
1610
+ 'circle-color': '#3a6bdb',
1611
+ 'circle-stroke-width': 2,
1612
+ 'circle-stroke-color': '#ffffff'
1613
+ }
1614
+ });
1615
+
1616
+ // 添加标签
1617
+ map.addLayer({
1618
+ id: 'hit-point-labels',
1619
+ type: 'symbol',
1620
+ source: 'hit-points',
1621
+ minzoom: 5,
1622
+ maxZoom: 19,
1623
+ layout: {
1624
+ "text-font": ["Microsoft YaHei"],
1625
+ 'text-field': ['get', 'patrolPoint'],
1626
+ 'text-offset': [0, 1.5],
1627
+ 'text-anchor': 'top',
1628
+ 'visibility': 'visible' // 显式设置图层可见性
1629
+ },
1630
+ paint: {
1631
+ 'text-color': '#0093ff'
1632
+ }
1633
+ });
1634
+
1635
+ // 确保图层在最上层显示
1636
+ const layers = map.getStyle().layers;
1637
+ const lastLayerId = layers.length > 0 ? layers[layers.length - 1].id : undefined;
1638
+ if (lastLayerId) {
1639
+ map.moveLayer('hit-points', lastLayerId);
1640
+ map.moveLayer('hit-point-labels', lastLayerId);
1641
+ }
1642
+
1643
+ // 如果不禁用拖拽,则添加拖拽功能
1644
+ if (!disableDrag) {
1645
+ this._enablePointDragging(map, onDragEnd);
1646
+ }
1647
+
1648
+ // 将 disableDrag 状态存储在图层上,便于后续更新时判断
1649
+ map.getLayer('hit-points')._disableDrag = disableDrag;
1650
+ } else {
1651
+ // 更新数据
1652
+ map.getSource('hit-points').setData({
1653
+ type: 'FeatureCollection',
1654
+ features: features
1655
+ });
1656
+
1657
+ // 确保图层可见
1658
+ map.setLayoutProperty('hit-points', 'visibility', 'visible');
1659
+ map.setLayoutProperty('hit-point-labels', 'visibility', 'visible');
1660
+
1661
+ // 检查是否需要更新拖拽功能状态
1662
+ const hitPointsLayer = map.getLayer('hit-points');
1663
+ if (hitPointsLayer && hitPointsLayer._disableDrag !== disableDrag) {
1664
+ if (!disableDrag) {
1665
+ // 启用拖拽功能
1666
+ this._enablePointDragging(map, onDragEnd);
1667
+ } else {
1668
+ // 禁用拖拽功能,移除相关事件监听器
1669
+ map.off('mousedown', 'hit-points');
1670
+ map.off('mouseenter', 'hit-points');
1671
+ map.off('mouseleave', 'hit-points');
1672
+ }
1673
+ // 更新状态
1674
+ hitPointsLayer._disableDrag = disableDrag;
1675
+ }
1676
+ }
1677
+
1678
+ // 调试日志
1679
+ console.log('_hitPoint_ executed with features:', features);
1680
+ console.log('Current zoom level:', map.getZoom());
1681
+ console.log('Layer visibility:',
1682
+ map.getLayoutProperty('hit-points', 'visibility'),
1683
+ map.getLayoutProperty('hit-point-labels', 'visibility')
1684
+ );
1685
+ },
1686
+
1687
+ /**
1688
+ * 启用点位拖拽功能
1689
+ * @param {Object} map - 地图实例
1690
+ * @param {Function} onDragEnd - 拖拽结束回调函数
1691
+ */
1692
+ _enablePointDragging: function (map, onDragEnd) {
1693
+ let isDragging = false;
1694
+ let dragTarget = null;
1695
+ let originalPosition = null;
1696
+ let tooltip = null; // 添加tooltip变量
1697
+
1698
+ // 鼠标按下事件 - 开始拖拽
1699
+ map.on('mousedown', 'hit-points', (e) => {
1700
+ this.enableScrollWheelZoom(false)
1701
+ map.dragPan.disable();
1702
+ isDragging = true;
1703
+ dragTarget = e.features[0];
1704
+ originalPosition = dragTarget.geometry.coordinates.slice();
1705
+
1706
+ // 设置鼠标样式
1707
+ map.getCanvas().style.cursor = 'grabbing';
1708
+
1709
+ // 为dragTarget增加一个tooltip
1710
+ tooltip = new mapboxgl.Popup({
1711
+ closeButton: false,
1712
+ closeOnClick: false,
1713
+ className: 'drag-tooltip'
1714
+ })
1715
+ .setLngLat(dragTarget.geometry.coordinates)
1716
+ .setHTML('<div>拖拽中...</div>')
1717
+ .addTo(map);
1718
+ });
1719
+
1720
+ // 鼠标移动事件 - 执行拖拽
1721
+ map.on('mousemove', (e) => {
1722
+ if (!isDragging || !dragTarget) return;
1723
+
1724
+ // 更新点位位置
1725
+ const updatedFeatures = map.getSource('hit-points')._data.features.map(feature => {
1726
+ if (feature.properties.id === dragTarget.properties.id) {
1727
+ return {
1728
+ ...feature,
1729
+ geometry: {
1730
+ ...feature.geometry,
1731
+ coordinates: [e.lngLat.lng, e.lngLat.lat]
1732
+ }
1733
+ };
1734
+ }
1735
+ return feature;
1736
+ });
1737
+
1738
+ // 更新数据源
1739
+ map.getSource('hit-points').setData({
1740
+ type: 'FeatureCollection',
1741
+ features: updatedFeatures
1742
+ });
1743
+
1744
+ // 更新tooltip位置
1745
+ if (tooltip) {
1746
+ tooltip.setLngLat([e.lngLat.lng, e.lngLat.lat]);
1747
+ }
1748
+ });
1749
+
1750
+ // 鼠标释放事件 - 结束拖拽
1751
+ map.on('mouseup', () => {
1752
+ // 移除tooltip
1753
+ if (tooltip) {
1754
+ tooltip.remove();
1755
+ tooltip = null;
1756
+ }
1757
+ if (isDragging && dragTarget) {
1758
+ isDragging = false;
1759
+
1760
+ // 获取更新后的点位数据
1761
+ const updatedFeatures = map.getSource('hit-points')._data.features;
1762
+ const updatedPoint = updatedFeatures.find(
1763
+ feature => feature.properties.id === dragTarget.properties.id
1764
+ );
1765
+
1766
+ // 调用回调函数返回更新后的点位信息
1767
+ if (onDragEnd && updatedPoint) {
1768
+ onDragEnd({
1769
+ id: updatedPoint.properties.id,
1770
+ patrolPoint: updatedPoint.properties.patrolPoint,
1771
+ longitude: updatedPoint.geometry.coordinates[0],
1772
+ latitude: updatedPoint.geometry.coordinates[1],
1773
+ originalLongitude: originalPosition[0],
1774
+ originalLatitude: originalPosition[1]
1775
+ });
1776
+ }
1777
+
1778
+ dragTarget = null;
1779
+ originalPosition = null;
1780
+
1781
+ this.enableScrollWheelZoom()
1782
+ map.dragPan.enable();
1783
+ }
1784
+
1785
+ // 恢复鼠标样式
1786
+ map.getCanvas().style.cursor = '';
1787
+ });
1788
+
1789
+ // 鼠标离开地图时也结束拖拽
1790
+ map.on('mouseleave', () => {
1791
+ if (isDragging) {
1792
+ isDragging = false;
1793
+ dragTarget = null;
1794
+ originalPosition = null;
1795
+
1796
+ // 移除tooltip
1797
+ if (tooltip) {
1798
+ tooltip.remove();
1799
+ tooltip = null;
1800
+ }
1801
+
1802
+ map.getCanvas().style.cursor = '';
1803
+ }
1804
+ });
1805
+
1806
+ // 设置鼠标悬停样式
1807
+ map.on('mouseenter', 'hit-points', () => {
1808
+ map.getCanvas().style.cursor = 'grab';
1809
+ });
1810
+
1811
+ map.on('mouseleave', 'hit-points', () => {
1812
+ if (!isDragging) {
1813
+ map.getCanvas().style.cursor = '';
1814
+ }
1815
+ });
1816
+ },
1817
+
1818
+ /**
1819
+ * 绘制线段
1820
+ * @param map - 地图实例
1821
+ * @param points - 点位数据
1822
+ * @param options - 绘制选项
1823
+ * @returns {*|null} 绘制的线对象
1824
+ */
1825
+ renderLine: function (map, points, options) {
1826
+ if (!map || !points || points.length < 2) return null;
1827
+
1828
+ const coordinates = points.map(p => [p.lng, p.lat]);
1829
+
1830
+ const config = {
1831
+ enableEditing: false,
1832
+ enableClicking: true,
1833
+ strokeWeight: 5,
1834
+ strokeOpacity: 0.65,
1835
+ color: '#3a6bdb',
1836
+ ...options
1837
+ };
1838
+
1839
+ // 创建线数据源
1840
+ if (!map.getSource('custom-line')) {
1841
+ map.addSource('custom-line', {
1842
+ type: 'geojson',
1843
+ data: {
1844
+ type: 'Feature',
1845
+ geometry: {
1846
+ type: 'LineString',
1847
+ coordinates: coordinates
1848
+ },
1849
+ properties: {
1850
+ id: options.id || Date.now()
1851
+ }
1852
+ }
1853
+ });
1854
+
1855
+ map.addLayer({
1856
+ id: 'custom-line',
1857
+ type: 'line',
1858
+ source: 'custom-line',
1859
+ paint: {
1860
+ 'line-color': config.color,
1861
+ 'line-width': config.strokeWeight,
1862
+ 'line-opacity': config.strokeOpacity
1863
+ }
1864
+ });
1865
+ } else {
1866
+ // 更新数据
1867
+ let existingData = map.getSource('custom-line')._data;
1868
+ let isFeatureObj = existingData.hasOwnProperty('features')
1869
+ let geomData = null
1870
+ if (isFeatureObj) {
1871
+ geomData = map.getSource('custom-line')._data.features[0]
1872
+ } else {
1873
+ geomData = map.getSource('custom-line')._data;
1874
+ }
1875
+ geomData.geometry.coordinates = coordinates;
1876
+ geomData.properties = {
1877
+ ...geomData.properties,
1878
+ ...options.properties
1879
+ };
1880
+
1881
+ map.getSource('custom-line').setData(geomData);
1882
+ }
1883
+
1884
+ // 获取更新后的feature
1885
+ const updatedFeature = map.getSource('custom-line')._data.hasOwnProperty('features') ? map.getSource('custom-line')._data.features[0]: map.getSource('custom-line')._data;
1886
+
1887
+ // 如果启用编辑功能
1888
+ if (config.enableEditing) {
1889
+ this._enableLineEditing(map, 'custom-line', config);
1890
+ }
1891
+
1892
+ return updatedFeature;
1893
+ },
1894
+
1895
+ /**
1896
+ * 启用线段编辑功能
1897
+ */
1898
+ _enableLineEditing: function (map, sourceId, config) {
1899
+ let editingVertexIndex = -1;
1900
+ let isVertexDragging = false;
1901
+
1902
+ // 创建顶点图层以便编辑
1903
+ if (!map.getSource('line-vertices')) {
1904
+ map.addSource('line-vertices', {
1905
+ type: 'geojson',
1906
+ data: {
1907
+ type: 'FeatureCollection',
1908
+ features: []
1909
+ }
1910
+ });
1911
+
1912
+ map.addLayer({
1913
+ id: 'line-vertices',
1914
+ type: 'circle',
1915
+ source: 'line-vertices',
1916
+ filter: ['==', '$type', 'Point'],
1917
+ paint: {
1918
+ 'circle-radius': 6,
1919
+ 'circle-color': '#ff0000',
1920
+ 'circle-stroke-width': 2,
1921
+ 'circle-stroke-color': '#ffffff'
1922
+ }
1923
+ });
1924
+ }
1925
+
1926
+ // 更新顶点显示
1927
+ const updateVertices = () => {
1928
+ const lineData = map.getSource(sourceId)._data;
1929
+ const coordinates = lineData.features[0].geometry.coordinates;
1930
+
1931
+ const vertices = coordinates.map((coord, index) => ({
1932
+ type: 'Feature',
1933
+ geometry: {
1934
+ type: 'Point',
1935
+ coordinates: coord
1936
+ },
1937
+ properties: {
1938
+ vertexIndex: index
1939
+ }
1940
+ }));
1941
+
1942
+ map.getSource('line-vertices').setData({
1943
+ type: 'FeatureCollection',
1944
+ features: vertices
1945
+ });
1946
+ };
1947
+
1948
+ // 鼠标按下事件 - 开始拖拽顶点
1949
+ map.on('mousedown', 'line-vertices', (e) => {
1950
+ if (!config.enableEditing) return;
1951
+
1952
+ this.enableScrollWheelZoom(false);
1953
+ map.dragPan.disable();
1954
+ editingVertexIndex = e.features[0].properties.vertexIndex;
1955
+ isVertexDragging = true;
1956
+
1957
+ // 设置鼠标样式
1958
+ map.getCanvas().style.cursor = 'grabbing';
1959
+ });
1960
+
1961
+ // 鼠标移动事件 - 拖拽顶点
1962
+ map.on('mousemove', (e) => {
1963
+ if (!isVertexDragging || editingVertexIndex === -1 || !config.enableEditing) return;
1964
+
1965
+ // 更新线段坐标
1966
+ const source = map.getSource(sourceId);
1967
+ const data = source._data;
1968
+ const coordinates = data.features[0].geometry.coordinates;
1969
+
1970
+ // 更新对应顶点的坐标
1971
+ coordinates[editingVertexIndex] = [e.lngLat.lng, e.lngLat.lat];
1972
+
1973
+ source.setData(data);
1974
+
1975
+ // 更新顶点显示
1976
+ updateVertices();
1977
+ });
1978
+
1979
+ // 鼠标释放事件 - 结束拖拽
1980
+ map.on('mouseup', () => {
1981
+ if (isVertexDragging) {
1982
+ isVertexDragging = false;
1983
+ editingVertexIndex = -1;
1984
+
1985
+ // 触发编辑完成回调
1986
+ if (config.onEditComplete) {
1987
+ const updatedFeature = map.getSource(sourceId)._data.features[0];
1988
+ config.onEditComplete(updatedFeature);
1989
+ }
1990
+
1991
+ this.enableScrollWheelZoom();
1992
+ map.dragPan.enable();
1993
+ }
1994
+
1995
+ // 恢复鼠标样式
1996
+ map.getCanvas().style.cursor = '';
1997
+ });
1998
+
1999
+ // 鼠标进入顶点区域 - 更改光标样式
2000
+ map.on('mouseenter', 'line-vertices', () => {
2001
+ if (config.enableEditing) {
2002
+ map.getCanvas().style.cursor = 'crosshair';
2003
+ }
2004
+ });
2005
+
2006
+ map.on('mouseleave', 'line-vertices', () => {
2007
+ if (config.enableEditing) {
2008
+ map.getCanvas().style.cursor = '';
2009
+ }
2010
+ });
2011
+
2012
+ // 初始显示顶点
2013
+ if (config.enableEditing) {
2014
+ updateVertices();
2015
+ }
2016
+ },
2017
+
2018
+
2019
+ /**
2020
+ * 绘制点
2021
+ * @param map 地图实例
2022
+ * @param point 点对象
2023
+ * @param options 绘制配置项
2024
+ * @returns {*|null} 绘制的点对象
2025
+ */
2026
+ renderPoint: function (map, point, options) {
2027
+ if (!map || !point || typeof point.lng === 'undefined' || typeof point.lat === 'undefined') return null;
2028
+
2029
+ const coordinates = [point.lng, point.lat];
2030
+
2031
+ const config = {
2032
+ enableEditing: false,
2033
+ enableClicking: true,
2034
+ radius: 6,
2035
+ color: '#3a6bdb',
2036
+ strokeColor: '#ffffff',
2037
+ strokeWidth: 2,
2038
+ ...options
2039
+ };
2040
+
2041
+ // 创建点数据源
2042
+ if (!map.getSource('custom-point')) {
2043
+ map.addSource('custom-point', {
2044
+ type: 'geojson',
2045
+ data: {
2046
+ type: 'Feature',
2047
+ geometry: {
2048
+ type: 'Point',
2049
+ coordinates: coordinates
2050
+ },
2051
+ properties: {
2052
+ id: point.id || Date.now()
2053
+ }
2054
+ }
2055
+ });
2056
+
2057
+ map.addLayer({
2058
+ id: 'custom-point',
2059
+ type: 'circle',
2060
+ source: 'custom-point',
2061
+ paint: {
2062
+ 'circle-radius': config.radius,
2063
+ 'circle-color': config.color,
2064
+ 'circle-stroke-width': config.strokeWidth,
2065
+ 'circle-stroke-color': config.strokeColor
2066
+ }
2067
+ });
2068
+ } else {
2069
+ // 更新数据
2070
+ const existingData = map.getSource('custom-point')._data;
2071
+ existingData.features[0].geometry.coordinates = coordinates;
2072
+ existingData.features[0].properties = {
2073
+ ...existingData.features[0].properties,
2074
+ ...point.properties
2075
+ };
2076
+
2077
+ map.getSource('custom-point').setData(existingData);
2078
+ }
2079
+
2080
+ // 获取更新后的feature
2081
+ const updatedFeature = map.getSource('custom-point')._data.features[0];
2082
+
2083
+ // 如果启用编辑功能
2084
+ if (config.enableEditing) {
2085
+ this._enablePointEditing(map, 'custom-point', config);
2086
+ }
2087
+
2088
+ return updatedFeature;
2089
+ },
2090
+
2091
+ /**
2092
+ * 启用点编辑功能
2093
+ */
2094
+ _enablePointEditing: function (map, sourceId, config) {
2095
+ let isDragging = false;
2096
+ let dragStartPos = null;
2097
+
2098
+ // 鼠标按下事件 - 开始拖拽
2099
+ map.on('mousedown', sourceId, (e) => {
2100
+ if (!config.enableEditing) return;
2101
+
2102
+ this.enableScrollWheelZoom(false);
2103
+ map.dragPan.disable();
2104
+ isDragging = true;
2105
+ dragStartPos = e.lngLat;
2106
+
2107
+ // 设置鼠标样式
2108
+ map.getCanvas().style.cursor = 'grabbing';
2109
+ });
2110
+
2111
+ // 鼠标移动事件 - 执行拖拽
2112
+ map.on('mousemove', (e) => {
2113
+ if (!isDragging || !config.enableEditing) return;
2114
+
2115
+ // 获取原始数据并更新坐标
2116
+ const source = map.getSource(sourceId);
2117
+ const data = source._data;
2118
+ data.features[0].geometry.coordinates = [e.lngLat.lng, e.lngLat.lat];
2119
+ source.setData(data);
2120
+ });
2121
+
2122
+ // 鼠标释放事件 - 结束拖拽
2123
+ map.on('mouseup', () => {
2124
+ if (isDragging) {
2125
+ isDragging = false;
2126
+
2127
+ // 触发编辑完成回调
2128
+ if (config.onEditComplete) {
2129
+ const updatedFeature = map.getSource(sourceId)._data.features[0];
2130
+ config.onEditComplete(updatedFeature);
2131
+ }
2132
+
2133
+ this.enableScrollWheelZoom();
2134
+ map.dragPan.enable();
2135
+ }
2136
+
2137
+ // 恢复鼠标样式
2138
+ map.getCanvas().style.cursor = '';
2139
+ });
2140
+
2141
+ // 设置鼠标悬停样式
2142
+ map.on('mouseenter', sourceId, () => {
2143
+ if (config.enableEditing) {
2144
+ map.getCanvas().style.cursor = 'grab';
2145
+ }
2146
+ });
2147
+
2148
+ map.on('mouseleave', sourceId, () => {
2149
+ if (!isDragging && config.enableEditing) {
2150
+ map.getCanvas().style.cursor = '';
2151
+ }
2152
+ });
2153
+ },
2154
+
2155
+ /**
2156
+ * 绘制多边形
2157
+ * @param map 地图实例
2158
+ * @param points 点对象数组
2159
+ * @param options 绘制配置项
2160
+ * @returns {*|null} 绘制的多边形对象
2161
+ */
2162
+ renderPolygon: function (map, points, options) {
2163
+ if (!map || !points || points.length < 3) return null;
2164
+
2165
+ // 确保多边形闭合
2166
+ const coordinates = [...points.map(p => [p.lng, p.lat])];
2167
+ if (coordinates[0][0] !== coordinates[coordinates.length - 1][0] ||
2168
+ coordinates[0][1] !== coordinates[coordinates.length - 1][1]) {
2169
+ coordinates.push(coordinates[0]); // 闭合多边形
2170
+ }
2171
+
2172
+ const config = {
2173
+ enableEditing: false,
2174
+ enableClicking: true,
2175
+ fillColor: '#3a6bdb',
2176
+ fillOpacity: 0.4,
2177
+ strokeColor: '#3a6bdb',
2178
+ strokeWidth: 2,
2179
+ ...options
2180
+ };
2181
+
2182
+ // 创建多边形数据源
2183
+ if (!map.getSource('custom-polygon')) {
2184
+ map.addSource('custom-polygon', {
2185
+ type: 'geojson',
2186
+ data: {
2187
+ type: 'Feature',
2188
+ geometry: {
2189
+ type: 'Polygon',
2190
+ coordinates: [coordinates]
2191
+ },
2192
+ properties: {
2193
+ id: options.id || Date.now()
2194
+ }
2195
+ }
2196
+ });
2197
+
2198
+ map.addLayer({
2199
+ id: 'custom-polygon-fill',
2200
+ type: 'fill',
2201
+ source: 'custom-polygon',
2202
+ paint: {
2203
+ 'fill-color': config.fillColor,
2204
+ 'fill-opacity': config.fillOpacity
2205
+ }
2206
+ });
2207
+
2208
+ map.addLayer({
2209
+ id: 'custom-polygon-stroke',
2210
+ type: 'line',
2211
+ source: 'custom-polygon',
2212
+ paint: {
2213
+ 'line-color': config.strokeColor,
2214
+ 'line-width': config.strokeWidth
2215
+ }
2216
+ });
2217
+ } else {
2218
+ // 更新数据
2219
+ let existingData = map.getSource('custom-polygon')._data;
2220
+ let isFeatureObj = existingData.hasOwnProperty('features')
2221
+ let geomData = null
2222
+ if (isFeatureObj) {
2223
+ geomData = map.getSource('custom-polygon')._data.features[0]
2224
+ } else {
2225
+ geomData = map.getSource('custom-polygon')._data;
2226
+ }
2227
+ geomData.geometry.coordinates = coordinates;
2228
+ geomData.properties = {
2229
+ ...geomData.properties,
2230
+ ...options.properties
2231
+ };
2232
+
2233
+ map.getSource('custom-polygon').setData(geomData);
2234
+ }
2235
+
2236
+ // 获取更新后的feature
2237
+ const updatedFeature = map.getSource('custom-polygon')._data.hasOwnProperty('features') ? map.getSource('custom-polygon')._data.features[0]: map.getSource('custom-polygon')._data;
2238
+
2239
+
2240
+ // 如果启用编辑功能
2241
+ if (config.enableEditing) {
2242
+ this._enablePolygonEditing(map, 'custom-polygon', config);
2243
+ }
2244
+
2245
+ return updatedFeature;
2246
+ },
2247
+
2248
+ /**
2249
+ * 启用多边形编辑功能
2250
+ */
2251
+ _enablePolygonEditing: function (map, sourceId, config) {
2252
+ let editingVertexIndex = -1;
2253
+ let isVertexDragging = false;
2254
+
2255
+ // 创建顶点图层以便编辑
2256
+ if (!map.getSource('polygon-vertices')) {
2257
+ map.addSource('polygon-vertices', {
2258
+ type: 'geojson',
2259
+ data: {
2260
+ type: 'FeatureCollection',
2261
+ features: []
2262
+ }
2263
+ });
2264
+
2265
+ map.addLayer({
2266
+ id: 'polygon-vertices',
2267
+ type: 'circle',
2268
+ source: 'polygon-vertices',
2269
+ filter: ['==', '$type', 'Point'],
2270
+ paint: {
2271
+ 'circle-radius': 6,
2272
+ 'circle-color': '#ff0000',
2273
+ 'circle-stroke-width': 2,
2274
+ 'circle-stroke-color': '#ffffff'
2275
+ }
2276
+ });
2277
+ }
2278
+
2279
+ // 更新顶点显示
2280
+ const updateVertices = () => {
2281
+ const polygonData = map.getSource(sourceId)._data;
2282
+ const coordinates = polygonData.features[0].geometry.coordinates[0]; // 获取外环坐标
2283
+
2284
+ const vertices = coordinates.slice(0, -1).map((coord, index) => ({ // 不包含最后一个重复点
2285
+ type: 'Feature',
2286
+ geometry: {
2287
+ type: 'Point',
2288
+ coordinates: coord
2289
+ },
2290
+ properties: {
2291
+ vertexIndex: index
2292
+ }
2293
+ }));
2294
+
2295
+ map.getSource('polygon-vertices').setData({
2296
+ type: 'FeatureCollection',
2297
+ features: vertices
2298
+ });
2299
+ };
2300
+
2301
+ // 鼠标按下事件 - 开始拖拽顶点
2302
+ map.on('mousedown', 'polygon-vertices', (e) => {
2303
+ if (!config.enableEditing) return;
2304
+
2305
+ this.enableScrollWheelZoom(false);
2306
+ map.dragPan.disable();
2307
+ editingVertexIndex = e.features[0].properties.vertexIndex;
2308
+ isVertexDragging = true;
2309
+
2310
+ // 设置鼠标样式
2311
+ map.getCanvas().style.cursor = 'grabbing';
2312
+ });
2313
+
2314
+ // 鼠标移动事件 - 拖拽顶点
2315
+ map.on('mousemove', (e) => {
2316
+ if (!isVertexDragging || editingVertexIndex === -1 || !config.enableEditing) return;
2317
+
2318
+ // 更新多边形坐标
2319
+ const source = map.getSource(sourceId);
2320
+ const data = source._data;
2321
+ const coordinates = data.features[0].geometry.coordinates[0];
2322
+
2323
+ // 更新对应顶点的坐标
2324
+ coordinates[editingVertexIndex] = [e.lngLat.lng, e.lngLat.lat];
2325
+ // 如果是第一个点,也要更新最后一个点(因为多边形是闭合的)
2326
+ if (editingVertexIndex === 0) {
2327
+ coordinates[coordinates.length - 1] = [e.lngLat.lng, e.lngLat.lat];
2328
+ }
2329
+
2330
+ source.setData(data);
2331
+
2332
+ // 更新顶点显示
2333
+ updateVertices();
2334
+ });
2335
+
2336
+ // 鼠标释放事件 - 结束拖拽
2337
+ map.on('mouseup', () => {
2338
+ if (isVertexDragging) {
2339
+ isVertexDragging = false;
2340
+ editingVertexIndex = -1;
2341
+
2342
+ // 触发编辑完成回调
2343
+ if (config.onEditComplete) {
2344
+ const updatedFeature = map.getSource(sourceId)._data.features[0];
2345
+ config.onEditComplete(updatedFeature);
2346
+ }
2347
+
2348
+ this.enableScrollWheelZoom();
2349
+ map.dragPan.enable();
2350
+ }
2351
+
2352
+ // 恢复鼠标样式
2353
+ map.getCanvas().style.cursor = '';
2354
+ });
2355
+
2356
+ // 鼠标进入顶点区域 - 更改光标样式
2357
+ map.on('mouseenter', 'polygon-vertices', () => {
2358
+ if (config.enableEditing) {
2359
+ map.getCanvas().style.cursor = 'crosshair';
2360
+ }
2361
+ });
2362
+
2363
+ map.on('mouseleave', 'polygon-vertices', () => {
2364
+ if (config.enableEditing) {
2365
+ map.getCanvas().style.cursor = '';
2366
+ }
2367
+ });
2368
+
2369
+ // 初始显示顶点
2370
+ if (config.enableEditing) {
2371
+ updateVertices();
2372
+ }
2373
+ },
2374
+
2375
+
2376
+ /**
2377
+ * controls
2378
+ */
2379
+ /**
2380
+ * 启用滚轮缩放
2381
+ * @param {boolean} isOpen 是否开启控制
2382
+ */
2383
+ enableScrollWheelZoom: function (isOpen = true) {
2384
+ // 进行mapboxgl的scroll(wheel)事件的控制
2385
+ if (!map) return;
2386
+
2387
+ if (isOpen) {
2388
+ map.scrollZoom.enable();
2389
+ } else {
2390
+ map.scrollZoom.disable();
2391
+ }
2392
+ },
2393
+
2394
+ /**
2395
+ * 绘制带中心点标注的经纬度网格
2396
+ * @param {Object} map - 地图实例
2397
+ * @param {Object} options - 网格配置选项
2398
+ */
2399
+ _drawGridWithCenterLabels: function (map, options = {}) {
2400
+ if (!map) return;
2401
+
2402
+ const {
2403
+ interval = 1,
2404
+ color = '#0066cc',
2405
+ width = 1,
2406
+ showLabels = true,
2407
+ showCenterLabels = true
2408
+ } = options;
2409
+
2410
+ const features = [];
2411
+ const labelFeatures = [];
2412
+ const centerLabelFeatures = [];
2413
+
2414
+ // 中国范围经纬度网格
2415
+ // 73.55, 3.85, 135.08, 53.55
2416
+ const minLng = mapConfig.mapExtent[0], maxLng = mapConfig.mapExtent[2];
2417
+ const minLat = mapConfig.mapExtent[1], maxLat = mapConfig.mapExtent[3];
2418
+
2419
+ // 经线
2420
+ for (let lng = Math.ceil(minLng); lng <= Math.floor(maxLng); lng += interval) {
2421
+ const coordinates = [];
2422
+ for (let lat = minLat; lat <= maxLat; lat += 0.1) {
2423
+ coordinates.push([lng, lat]);
2424
+ }
2425
+ features.push({
2426
+ type: 'Feature',
2427
+ geometry: {
2428
+ type: 'LineString',
2429
+ coordinates: coordinates
2430
+ },
2431
+ properties: {
2432
+ type: 'longitude',
2433
+ value: lng
2434
+ }
2435
+ });
2436
+
2437
+ // 添加经度标签
2438
+ if (showLabels) {
2439
+ labelFeatures.push({
2440
+ type: 'Feature',
2441
+ geometry: {
2442
+ type: 'Point',
2443
+ coordinates: [lng, minLat]
2444
+ },
2445
+ properties: {
2446
+ text: `${lng}°`
2447
+ }
2448
+ });
2449
+ }
2450
+ }
2451
+
2452
+ // 纬线
2453
+ for (let lat = Math.ceil(minLat); lat <= Math.floor(maxLat); lat += interval) {
2454
+ const coordinates = [];
2455
+ for (let lng = minLng; lng <= maxLng; lng += 0.1) {
2456
+ coordinates.push([lng, lat]);
2457
+ }
2458
+ features.push({
2459
+ type: 'Feature',
2460
+ geometry: {
2461
+ type: 'LineString',
2462
+ coordinates: coordinates
2463
+ },
2464
+ properties: {
2465
+ type: 'latitude',
2466
+ value: lat
2467
+ }
2468
+ });
2469
+
2470
+ // 添加纬度标签
2471
+ if (showLabels) {
2472
+ labelFeatures.push({
2473
+ type: 'Feature',
2474
+ geometry: {
2475
+ type: 'Point',
2476
+ coordinates: [minLng, lat]
2477
+ },
2478
+ properties: {
2479
+ text: `${lat}°`
2480
+ }
2481
+ });
2482
+ }
2483
+ }
2484
+
2485
+ // 添加网格中心点标签(显示经纬度区间)
2486
+ if (showCenterLabels) {
2487
+ for (let lng = Math.ceil(minLng); lng < Math.floor(maxLng); lng += interval) {
2488
+ for (let lat = Math.ceil(minLat); lat < Math.floor(maxLat); lat += interval) {
2489
+ // 计算网格中心点
2490
+ const centerLng = lng + interval / 2;
2491
+ const centerLat = lat + interval / 2;
2492
+
2493
+ // 创建区间标签文本
2494
+ const label = `${lng}°~${lng + interval}°\n${lat}°~${lat + interval}°`;
2495
+
2496
+ centerLabelFeatures.push({
2497
+ type: 'Feature',
2498
+ geometry: {
2499
+ type: 'Point',
2500
+ coordinates: [centerLng, centerLat]
2501
+ },
2502
+ properties: {
2503
+ text: label
2504
+ }
2505
+ });
2506
+ }
2507
+ }
2508
+ }
2509
+
2510
+ // 添加网格线数据源和图层
2511
+ if (!map.getSource('longitude-latitude-grid')) {
2512
+ map.addSource('longitude-latitude-grid', {
2513
+ type: 'geojson',
2514
+ data: {
2515
+ type: 'FeatureCollection',
2516
+ features: features
2517
+ }
2518
+ });
2519
+
2520
+ map.addLayer({
2521
+ id: 'longitude-latitude-grid',
2522
+ type: 'line',
2523
+ source: 'longitude-latitude-grid',
2524
+ paint: {
2525
+ 'line-color': color,
2526
+ 'line-width': width,
2527
+ 'line-opacity': 0.6,
2528
+ 'line-dasharray': [2, 2]
2529
+ }
2530
+ });
2531
+ } else {
2532
+ map.getSource('longitude-latitude-grid').setData({
2533
+ type: 'FeatureCollection',
2534
+ features: features
2535
+ });
2536
+ }
2537
+
2538
+ // 添加边界标签数据源和图层
2539
+ if (showLabels && labelFeatures.length > 0) {
2540
+ if (!map.getSource('grid-labels')) {
2541
+ map.addSource('grid-labels', {
2542
+ type: 'geojson',
2543
+ data: {
2544
+ type: 'FeatureCollection',
2545
+ features: labelFeatures
2546
+ }
2547
+ });
2548
+
2549
+ map.addLayer({
2550
+ id: 'grid-labels',
2551
+ type: 'symbol',
2552
+ source: 'grid-labels',
2553
+ layout: {
2554
+ 'text-field': ['get', 'text'],
2555
+ 'text-size': 16,
2556
+ 'text-offset': [0, 1]
2557
+ },
2558
+ paint: {
2559
+ 'text-color': '#ff6b35',
2560
+ 'text-halo-color': '#ffffff',
2561
+ 'text-halo-width': 1,
2562
+ }
2563
+ });
2564
+ } else {
2565
+ map.getSource('grid-labels').setData({
2566
+ type: 'FeatureCollection',
2567
+ features: labelFeatures
2568
+ });
2569
+ }
2570
+ }
2571
+
2572
+ // 添加中心点区间标签数据源和图层(仅在层级10及以上显示)
2573
+ if (showCenterLabels && centerLabelFeatures.length > 0) {
2574
+ if (!map.getSource('grid-center-labels')) {
2575
+ map.addSource('grid-center-labels', {
2576
+ type: 'geojson',
2577
+ data: {
2578
+ type: 'FeatureCollection',
2579
+ features: centerLabelFeatures
2580
+ }
2581
+ });
2582
+
2583
+ map.addLayer({
2584
+ id: 'grid-center-labels',
2585
+ type: 'symbol',
2586
+ source: 'grid-center-labels',
2587
+ layout: {
2588
+ 'text-field': ['get', 'text'],
2589
+ 'text-size': 16,
2590
+ 'text-offset': [0, 0],
2591
+ 'text-anchor': 'center',
2592
+ 'text-justify': 'center',
2593
+ },
2594
+ paint: {
2595
+ 'text-color': '#ff6b35',
2596
+ 'text-halo-color': '#ffffff',
2597
+ 'text-halo-width': 1,
2598
+ }
2599
+ });
2600
+ } else {
2601
+ map.getSource('grid-center-labels').setData({
2602
+ type: 'FeatureCollection',
2603
+ features: centerLabelFeatures
2604
+ });
2605
+ }
2606
+ }
2607
+ },
2608
+
2609
+ /**
2610
+ * 清除经纬度网格(包括中心点标签)
2611
+ * @param {Object} map - 地图实例
2612
+ */
2613
+ clearGridWithCenterLabels: function (map) {
2614
+ if (!map) return;
2615
+
2616
+ // 清除网格线
2617
+ if (map.getLayer('longitude-latitude-grid')) {
2618
+ map.removeLayer('longitude-latitude-grid');
2619
+ }
2620
+ if (map.getSource('longitude-latitude-grid')) {
2621
+ map.removeSource('longitude-latitude-grid');
2622
+ }
2623
+
2624
+ // 清除边界标签
2625
+ if (map.getLayer('grid-labels')) {
2626
+ map.removeLayer('grid-labels');
2627
+ }
2628
+ if (map.getSource('grid-labels')) {
2629
+ map.removeSource('grid-labels');
2630
+ }
2631
+
2632
+ // 清除中心点标签
2633
+ if (map.getLayer('grid-center-labels')) {
2634
+ map.removeLayer('grid-center-labels');
2635
+ }
2636
+ if (map.getSource('grid-center-labels')) {
2637
+ map.removeSource('grid-center-labels');
2638
+ }
2639
+ },
2640
+
2641
+ /**
2642
+ * 计算线段中间点
2643
+ * @param start
2644
+ * @param end
2645
+ * @returns {{lng, lat}}
2646
+ */
2647
+ countMidFromLine(start, end) {
2648
+ return {
2649
+ lng: (start.lng + end.lng) / 2,
2650
+ lat: (start.lat + end.lat) / 2
2651
+ };
2652
+ },
2653
+
2654
+ /**
2655
+ * 清除所有非底图图层
2656
+ */
2657
+ clearOverlays: function () {
2658
+ // 批量清除所有巡检相关的动态图层(ID包含patrol-track-前缀)
2659
+ const layers = map.getStyle().layers;
2660
+ layers.forEach(layer => {
2661
+ if (layer.id.includes('patrol-track-')) {
2662
+ map.removeLayer(layer.id);
2663
+ if (layer.source && layer.source.includes('patrol-track-')) {
2664
+ map.removeSource(layer.source);
2665
+ }
2666
+ }
2667
+ });
2668
+ },
2669
+
2670
+ /**
2671
+ * 创建L7场景
2672
+ * @param mapId
2673
+ */
2674
+ createAntVL7Scene(mapId) {
2675
+ let scene = new Scene({
2676
+ id: mapId,
2677
+ antialias: true, // 👈 关键!启用硬件抗锯齿
2678
+ preserveDrawingBuffer: true,
2679
+ map: new Mapbox({
2680
+ mapInstance: map,
2681
+ }),
2682
+ WebGLParams: {
2683
+ antialias: true
2684
+ },
2685
+ // 关闭默认 L7 Logo
2686
+ logoVisible: false,
2687
+ });
2688
+
2689
+ // 立即返回 scene 对象,外部可以通过 scene.on('loaded') 监听加载完成
2690
+ return scene;
2691
+ },
2692
+
2693
+ /**
2694
+ * 销毁地图实例,清理事件监听器
2695
+ */
2696
+ destroy: function() {
2697
+ // 移除 innerView-created 事件监听器
2698
+ if (this._innerViewCreatedHandler && gisView) {
2699
+ gisView.off('innerView-created', this._innerViewCreatedHandler);
2700
+ this._innerViewCreatedHandler = null;
2701
+ }
2702
+
2703
+ // 清理全局引用
2704
+ window.gisView = null;
2705
+ this.mapgisMap = null;
2706
+ this.mbMap = null;
2707
+ map = null;
2708
+ antV7Scene = null;
2709
+
2710
+ console.log('MapGIS 地图实例已销毁');
2711
+ },
2712
+
2713
+
2714
+ /**
2715
+ * 根据 SRID 和 level 获取对应的 scale(比例尺)
2716
+ * @param {Number} srid - 坐标系 WKID(如 4326, 3857 等)
2717
+ * @param {Number} level - LODs 层级(0-22)
2718
+ * @returns {Number} 对应的比例尺值,如果未找到则返回 null
2719
+ *
2720
+ * @description
2721
+ * 该方法根据不同的坐标系和缩放层级,返回对应的地图比例尺。
2722
+ * 常用于 IGS 图层中根据显示层级计算合适的比例尺参数。
2723
+ *
2724
+ * @example
2725
+ * // 获取 EPSG:4326 坐标系下第 10 级的比例尺
2726
+ * const scale = getScaleBySridAndLevel(4326, 10);
2727
+ * console.log(scale); // 输出对应比例尺
2728
+ *
2729
+ * // 获取 EPSG:3857 坐标系下第 15 级的比例尺
2730
+ * const scale3857 = getScaleBySridAndLevel(3857, 15);
2731
+ * console.log(scale3857);
2732
+ */
2733
+ getScaleBySridAndLevel: function (srid, level) {
2734
+ // 定义不同坐标系下的 LODs 配置
2735
+ // 参考 ArcGIS/MapGIS 标准瓦片方案
2736
+ const lodsConfig = {
2737
+ // WGS84 (EPSG:4326) 坐标系
2738
+ 4326: [
2739
+ { level: 0, resolution: 0.703125, scale: 295829355.45 },
2740
+ { level: 1, resolution: 0.3515625, scale: 147914677.73 },
2741
+ { level: 2, resolution: 0.17578125, scale: 73957338.86 },
2742
+ { level: 3, resolution: 0.087890625, scale: 36978669.43 },
2743
+ { level: 4, resolution: 0.0439453125, scale: 18489334.72 },
2744
+ { level: 5, resolution: 0.02197265625, scale: 9244667.36 },
2745
+ { level: 6, resolution: 0.010986328125, scale: 4622333.68 },
2746
+ { level: 7, resolution: 0.0054931640625, scale: 2311166.84 },
2747
+ { level: 8, resolution: 0.00274658203125, scale: 1155583.42 },
2748
+ { level: 9, resolution: 0.001373291015625, scale: 577791.71 },
2749
+ { level: 10, resolution: 0.0006866455078125, scale: 288895.85 },
2750
+ { level: 11, resolution: 0.00034332275390625, scale: 144447.93 },
2751
+ { level: 12, resolution: 0.000171661376953125, scale: 72223.96 },
2752
+ { level: 13, resolution: 0.0000858306884765625, scale: 36111.98 },
2753
+ { level: 14, resolution: 0.00004291534423828125, scale: 18055.99 },
2754
+ { level: 15, resolution: 0.000021457672119140625, scale: 9028.0 },
2755
+ { level: 16, resolution: 0.000010728836059570312, scale: 4514.0 },
2756
+ { level: 17, resolution: 0.000005364418029785156, scale: 2257.0 },
2757
+ { level: 18, resolution: 0.000002682209014892578, scale: 1128.5 },
2758
+ { level: 19, resolution: 0.000001341104507446289, scale: 564.25 },
2759
+ { level: 20, resolution: 0.0000006705522537231445, scale: 282.12 }
2760
+ ],
2761
+ // Web Mercator (EPSG:3857) 坐标系
2762
+ 3857: [
2763
+ { level: 0, resolution: 156543.033928, scale: 591657527.59 },
2764
+ { level: 1, resolution: 78271.516964, scale: 295828763.79 },
2765
+ { level: 2, resolution: 39135.758482, scale: 147914381.9 },
2766
+ { level: 3, resolution: 19567.879241, scale: 73957190.95 },
2767
+ { level: 4, resolution: 9783.9396205, scale: 36978595.47 },
2768
+ { level: 5, resolution: 4891.96981025, scale: 18489297.74 },
2769
+ { level: 6, resolution: 2445.984905125, scale: 9244648.87 },
2770
+ { level: 7, resolution: 1222.9924525625, scale: 4622324.43 },
2771
+ { level: 8, resolution: 611.49622628125, scale: 2311162.22 },
2772
+ { level: 9, resolution: 305.748113140625, scale: 1155581.11 },
2773
+ { level: 10, resolution: 152.8740565703125, scale: 577790.55 },
2774
+ { level: 11, resolution: 76.43702828515625, scale: 288895.28 },
2775
+ { level: 12, resolution: 38.218514142578125, scale: 144447.64 },
2776
+ { level: 13, resolution: 19.109257071289062, scale: 72223.82 },
2777
+ { level: 14, resolution: 9.554628535644531, scale: 36111.91 },
2778
+ { level: 15, resolution: 4.777314267822266, scale: 18055.95 },
2779
+ { level: 16, resolution: 2.388657133911133, scale: 9027.98 },
2780
+ { level: 17, resolution: 1.1943285669555665, scale: 4513.99 },
2781
+ { level: 18, resolution: 0.5971642834777832, scale: 2257.0 },
2782
+ { level: 19, resolution: 0.2985821417388916, scale: 1128.5 },
2783
+ { level: 20, resolution: 0.1492910708694458, scale: 564.25 },
2784
+ { level: 21, resolution: 0.0746455354347229, scale: 282.12 },
2785
+ { level: 22, resolution: 0.03732276771736145, scale: 141.06 }
2786
+ ],
2787
+ // CGCS2000 (EPSG:4490) 坐标系 - 与 4326 类似
2788
+ 4490: [
2789
+ { level: 0, resolution: 0.703125, scale: 295829355.45 },
2790
+ { level: 1, resolution: 0.3515625, scale: 147914677.73 },
2791
+ { level: 2, resolution: 0.17578125, scale: 73957338.86 },
2792
+ { level: 3, resolution: 0.087890625, scale: 36978669.43 },
2793
+ { level: 4, resolution: 0.0439453125, scale: 18489334.72 },
2794
+ { level: 5, resolution: 0.02197265625, scale: 9244667.36 },
2795
+ { level: 6, resolution: 0.010986328125, scale: 4622333.68 },
2796
+ { level: 7, resolution: 0.0054931640625, scale: 2311166.84 },
2797
+ { level: 8, resolution: 0.00274658203125, scale: 1155583.42 },
2798
+ { level: 9, resolution: 0.001373291015625, scale: 577791.71 },
2799
+ { level: 10, resolution: 0.0006866455078125, scale: 288895.85 },
2800
+ { level: 11, resolution: 0.00034332275390625, scale: 144447.93 },
2801
+ { level: 12, resolution: 0.000171661376953125, scale: 72223.96 },
2802
+ { level: 13, resolution: 0.0000858306884765625, scale: 36111.98 },
2803
+ { level: 14, resolution: 0.00004291534423828125, scale: 18055.99 },
2804
+ { level: 15, resolution: 0.000021457672119140625, scale: 9028.0 },
2805
+ { level: 16, resolution: 0.000010728836059570312, scale: 4514.0 },
2806
+ { level: 17, resolution: 0.000005364418029785156, scale: 2257.0 },
2807
+ { level: 18, resolution: 0.000002682209014892578, scale: 1128.5 },
2808
+ { level: 19, resolution: 0.000001341104507446289, scale: 564.25 },
2809
+ { level: 20, resolution: 0.0000006705522537231445, scale: 282.12 }
2810
+ ]
2811
+ };
2812
+
2813
+ // 处理常见的 SRID 别名
2814
+ const normalizedSrid = (() => {
2815
+ switch (srid) {
2816
+ case 4214: // Beijing 1954
2817
+ case 4610: // Xian 1980
2818
+ return 4326; // 使用 WGS84 的配置
2819
+ default:
2820
+ return srid;
2821
+ }
2822
+ })();
2823
+
2824
+ // 获取对应坐标系的 LODs 配置
2825
+ const lods = lodsConfig[normalizedSrid];
2826
+
2827
+ if (!lods) {
2828
+ console.warn(`未找到 SRID ${srid} 的 LODs 配置,使用默认配置`);
2829
+ // 默认使用 4326 的配置
2830
+ return this.getScaleBySridAndLevel(4326, level);
2831
+ }
2832
+
2833
+ // 查找对应 level 的配置
2834
+ const lod = lods.find(item => item.level === level);
2835
+
2836
+ if (!lod) {
2837
+ console.warn(`未找到 level ${level} 的配置`);
2838
+ return null;
2839
+ }
2840
+
2841
+ return lod.scale;
2842
+ },
2843
+
2844
+ /**
2845
+ * 根据 SRID 和 scale 反查对应的 level
2846
+ * @param {Number} srid - 坐标系 WKID
2847
+ * @param {Number} scale - 比例尺值
2848
+ * @returns {Number} 对应的层级,如果未找到则返回 null
2849
+ *
2850
+ * @example
2851
+ * // 根据比例尺反查层级
2852
+ * const level = getLevelBySridAndScale(4326, 288895.85);
2853
+ * console.log(level); // 输出 10
2854
+ */
2855
+ getLevelBySridAndScale: function (srid, scale) {
2856
+ const lodsConfig = {
2857
+ 4326: [
2858
+ { level: 0, scale: 295829355.45 },
2859
+ { level: 1, scale: 147914677.73 },
2860
+ { level: 2, scale: 73957338.86 },
2861
+ { level: 3, scale: 36978669.43 },
2862
+ { level: 4, scale: 18489334.72 },
2863
+ { level: 5, scale: 9244667.36 },
2864
+ { level: 6, scale: 4622333.68 },
2865
+ { level: 7, scale: 2311166.84 },
2866
+ { level: 8, scale: 1155583.42 },
2867
+ { level: 9, scale: 577791.71 },
2868
+ { level: 10, scale: 288895.85 },
2869
+ { level: 11, scale: 144447.93 },
2870
+ { level: 12, scale: 72223.96 },
2871
+ { level: 13, scale: 36111.98 },
2872
+ { level: 14, scale: 18055.99 },
2873
+ { level: 15, scale: 9028.0 },
2874
+ { level: 16, scale: 4514.0 },
2875
+ { level: 17, scale: 2257.0 },
2876
+ { level: 18, scale: 1128.5 },
2877
+ { level: 19, scale: 564.25 },
2878
+ { level: 20, scale: 282.12 }
2879
+ ],
2880
+ 3857: [
2881
+ { level: 0, scale: 591657527.59 },
2882
+ { level: 1, scale: 295828763.79 },
2883
+ { level: 2, scale: 147914381.9 },
2884
+ { level: 3, scale: 73957190.95 },
2885
+ { level: 4, scale: 36978595.47 },
2886
+ { level: 5, scale: 18489297.74 },
2887
+ { level: 6, scale: 9244648.87 },
2888
+ { level: 7, scale: 4622324.43 },
2889
+ { level: 8, scale: 2311162.22 },
2890
+ { level: 9, scale: 1155581.11 },
2891
+ { level: 10, scale: 577790.55 },
2892
+ { level: 11, scale: 288895.28 },
2893
+ { level: 12, scale: 144447.64 },
2894
+ { level: 13, scale: 72223.82 },
2895
+ { level: 14, scale: 36111.91 },
2896
+ { level: 15, scale: 18055.95 },
2897
+ { level: 16, scale: 9027.98 },
2898
+ { level: 17, scale: 4513.99 },
2899
+ { level: 18, scale: 2257.0 },
2900
+ { level: 19, scale: 1128.5 },
2901
+ { level: 20, scale: 564.25 },
2902
+ { level: 21, scale: 282.12 },
2903
+ { level: 22, scale: 141.06 }
2904
+ ]
2905
+ };
2906
+
2907
+ const normalizedSrid = (() => {
2908
+ switch (srid) {
2909
+ case 4214:
2910
+ case 4610:
2911
+ case 4490:
2912
+ return 4326;
2913
+ default:
2914
+ return srid;
2915
+ }
2916
+ })();
2917
+
2918
+ const lods = lodsConfig[normalizedSrid];
2919
+
2920
+ if (!lods) {
2921
+ console.warn(`未找到 SRID ${srid} 的 LODs 配置`);
2922
+ return null;
2923
+ }
2924
+
2925
+ // 找到最接近的 level(允许一定的误差范围)
2926
+ let closestLod = null;
2927
+ let minDiff = Infinity;
2928
+
2929
+ lods.forEach(lod => {
2930
+ const diff = Math.abs(lod.scale - scale);
2931
+ if (diff < minDiff) {
2932
+ minDiff = diff;
2933
+ closestLod = lod;
2934
+ }
2935
+ });
2936
+
2937
+ // 如果差异在 10% 以内,认为匹配成功
2938
+ if (closestLod && minDiff / scale < 0.1) {
2939
+ return closestLod.level;
2940
+ }
2941
+
2942
+ console.warn(`未找到与 scale ${scale} 匹配的 level`);
2943
+ return null;
2944
+ }
2945
+ };