arcMap.js 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158
  1. import "ol/ol.css";
  2. import { Map, View } from 'ol';
  3. import TileLayer from 'ol/layer/Tile';
  4. import XYZ from 'ol/source/XYZ'
  5. import { fromLonLat, get, transform , Projection, addProjection } from 'ol/proj';
  6. import MousePosition from 'ol/control/MousePosition';
  7. import VectorLayer from 'ol/layer/Vector';
  8. import VectorSource from 'ol/source/Vector';
  9. import { Fill, Stroke, Circle, Style, Icon, Text } from 'ol/style';
  10. import Feature from 'ol/Feature';
  11. import LinearRing from 'ol/geom/LinearRing';
  12. import Overlay from 'ol/Overlay';
  13. import TileArcGISRest from 'ol/source/TileArcGISRest';
  14. import myMap from "@/utils/map.js";
  15. import request from '@/utils/requestTwo.js'
  16. import EsriJSON from 'ol/format/EsriJSON';
  17. import { getTopLeft, getWidth, buffer, getCenter } from 'ol/extent';
  18. import '@/assets/less/map.less'
  19. import MapConfig from '@/utils/mapconfig';
  20. import GeoJSON from 'ol/format/GeoJSON';
  21. import { getVectorContext } from 'ol/render';
  22. import store from '@/store'
  23. import { GetFieldValue } from "@/api/ghyzt/yztfield.js";
  24. import VectorTileLayer from 'ol/layer/VectorTile';
  25. import VectorTileSource from 'ol/source/VectorTile';
  26. import MVT from 'ol/format/MVT';
  27. import { createXYZ } from 'ol/tilegrid';
  28. import { appendParams } from 'ol/uri';
  29. import axios from "axios";
  30. import { createMapboxStreetsV6Style } from "@/utils/mvt_style.js";
  31. import proj4 from 'proj4';
  32. import { register } from 'ol/proj/proj4'
  33. import WMTS from 'ol/source/WMTS';
  34. import WMTSTileGrid from 'ol/tilegrid/WMTS';
  35. import {
  36. LineString,
  37. MultiLineString,
  38. MultiPoint,
  39. MultiPolygon,
  40. Point,
  41. Polygon,
  42. } from 'ol/geom';
  43. import { baseLayer } from './map.js'
  44. import { assertEnumMember } from "@babel/types";
  45. import { ElMessage } from "element-plus";
  46. proj4.defs("EPSG:4490", "GEOGCS[\"China Geodetic Coordinate System 2000\",DATUM[\"China_2000\",SPHEROID[\"CGCS2000\",6378137,298.257222101,AUTHORITY[\"EPSG\",\"1024\"]],AUTHORITY[\"EPSG\",\"1043\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4490\"]]");
  47. register(proj4);
  48. var map;
  49. const arcMap = (function() {
  50. var myMaps = {
  51. _basemap: null,
  52. _domid: null,
  53. _EPSG: null,
  54. _center: [121.662, 43.798],
  55. EPSG: {
  56. C3857: 'EPSG:3857',
  57. C4326: 'EPSG:4326',
  58. C4490: 'EPSG:4490', //国家2000
  59. C4610: 'EPSG:4610', //西安1980
  60. },
  61. //地图
  62. map: {},
  63. //对比的地图
  64. map1: null,
  65. map2: null,
  66. map3: null,
  67. map4: null,
  68. //比较地图
  69. compareMap(type, view, item, option) {
  70. var imgsource;
  71. if (option.source) {
  72. imgsource = option.source
  73. } else {
  74. if (item.type == 'WMTS') {
  75. imgsource = new XYZ({
  76. url: item.url + `/tile/{z}/{y}/{x}`,
  77. });
  78. } else {
  79. imgsource = new TileArcGISRest({
  80. url: item.url,
  81. });
  82. }
  83. }
  84. myMap[type] = arcMap[type] = new Map({
  85. layers: [
  86. new TileLayer({
  87. name: item.url,
  88. source: imgsource,
  89. })
  90. ],
  91. view: view,
  92. target: type
  93. })
  94. var la = new VectorLayer({
  95. name: "compare-feature",
  96. declutter: false,
  97. source: new VectorSource({
  98. features: [],
  99. }),
  100. style: new Style({
  101. stroke: new Stroke({
  102. color: '#1171d6',
  103. width: 4,
  104. lineDash: [1, 2, 3, 4, 5, 6],
  105. }),
  106. }),
  107. zIndex: 9,
  108. visible: true
  109. });
  110. var la1 = new VectorLayer({
  111. name: "detailedLayer",
  112. declutter: false,
  113. className: 'layer',
  114. source: new VectorSource({
  115. features: [],
  116. }),
  117. style: new Style({
  118. stroke: new Stroke({
  119. color: '#ff0000',
  120. width: 2,
  121. }),
  122. }),
  123. zIndex: 9,
  124. visible: true
  125. });
  126. var pointLayer = new VectorLayer({
  127. zIndex: 999,
  128. declutter: false,
  129. source: new VectorSource(),
  130. visible: false,
  131. });
  132. arcMap.addLayer(pointLayer, type);
  133. // 把绘制了的canvas设置到style里面
  134. var style = new Style({
  135. image: new Icon({
  136. src: new URL('../assets/map/point.png', import.meta.url).href,
  137. // imgSize: [canvas.width, canvas.height],
  138. // rotation: (item.psjd-90) * Math.PI / 180
  139. })
  140. });
  141. //创建一个Feature,并设置好在地图的位置
  142. var shape = new Feature({
  143. geometry: new Point([view.getCenter()[0], view.getCenter()[1]]),
  144. id:'screenCenter'+type,
  145. });
  146. // 应用具有不规则几何图形的样式到Feature
  147. shape.setId('screenCenter'+type)
  148. shape.setStyle(style);
  149. // 将Feature添加到之前的创建的layer中去
  150. pointLayer.getSource().addFeature(shape);
  151. arcMap[type].addLayer(la, type);
  152. arcMap[type].addLayer(la1, type);
  153. if (option.click) {
  154. arcMap[type].on('singleclick', function(evt) {
  155. for (var i = 1; i <= 4; i++) {
  156. if (arcMap['map' + i]) {
  157. arcMap['map' + i].removeOverlay(arcMap['map' + i].getOverlayById("popup_temp" + 'map' + i));
  158. }
  159. }
  160. var lonlat = arcMap.webMercatorToWgs84(evt.coordinate[0], evt.coordinate[1]);
  161. var view = arcMap[type].getView();
  162. arcMap.SearchWfsByLoc(item.url, `${lonlat[0]},${lonlat[1]}`, (view.getResolution() * 6.7), function(d, f) {
  163. if (d.length) {
  164. for (var i = 1; i <= 4; i++) {
  165. if (arcMap['map' + i]) {
  166. var _cmap = arcMap.getLayerByNameAndMap('compare-feature', 'map' + i);
  167. _cmap.getSource().clear();
  168. _cmap.getSource().addFeatures(d);
  169. }
  170. }
  171. if (!item.attrs) {
  172. var data = d[0].getProperties();
  173. var header = [];
  174. for (let key in data) {
  175. if (key != 'geometry') {
  176. header.push({
  177. sxbm: key,
  178. sxmc: key
  179. })
  180. }
  181. }
  182. item.attrs = header;
  183. }
  184. arcMap.popupInfo({
  185. feature: d[0],
  186. type: type,
  187. position: evt,
  188. title: item.name,
  189. attrs: item.attrs
  190. })
  191. arcMap[type].updateSize();
  192. } else {
  193. }
  194. })
  195. });
  196. }
  197. if (option.autoPupop) {
  198. // arcMap[type].on('movestart',function(evt){
  199. // pointLayer.setVisible(false)
  200. // })
  201. arcMap[type].on('moveend',function(evt){
  202. let cur_feature = pointLayer.getSource().getFeatureById('screenCenter'+type)
  203. if(cur_feature){
  204. let CPoint = [arcMap[type].getView().getCenter()[0], arcMap[type].getView().getCenter()[1]]
  205. cur_feature.setGeometry(new Point(CPoint))
  206. var lonlat = arcMap.webMercatorToWgs84(CPoint[0], CPoint[1]);
  207. var view = arcMap[type].getView();
  208. for (var i = 1; i <= 4; i++) {
  209. if (arcMap['map' + i]) {
  210. arcMap['map' + i].removeOverlay(arcMap['map' + i].getOverlayById("popup_temp" + 'map' + i));
  211. }
  212. }
  213. arcMap.SearchWfsByLoc(item.url, `${lonlat[0]},${lonlat[1]}`, (view.getResolution() * 6.7), function(d, f) {
  214. if (d.length) {
  215. for (var i = 1; i <= 4; i++) {
  216. if (arcMap['map' + i]) {
  217. var _cmap = arcMap.getLayerByNameAndMap('compare-feature', 'map' + i);
  218. _cmap.getSource().clear();
  219. _cmap.getSource().addFeatures(d);
  220. }
  221. }
  222. if (!item.attrs) {
  223. var data = d[0].getProperties();
  224. var header = [];
  225. for (let key in data) {
  226. if (key != 'geometry') {
  227. header.push({
  228. sxbm: key,
  229. sxmc: key
  230. })
  231. }
  232. }
  233. item.attrs = header;
  234. }
  235. arcMap.popupInfo({
  236. feature: d[0],
  237. type: type,
  238. position: {coordinate:CPoint} ,
  239. title: item.name,
  240. attrs: item.attrs
  241. })
  242. arcMap[type].updateSize();
  243. }
  244. })
  245. }
  246. // pointLayer.setVisible(true)
  247. })
  248. }
  249. },
  250. loadMap: function(domId, par = {}) {
  251. var _op = {
  252. center: MapCenter.point,
  253. zoom: 8,
  254. base: ["tdtImg", "tdtImgAnn", "tdtVec", "tdtVecAnn", "jxMap", "cityLine"],
  255. view: null
  256. };
  257. var option = Object.assign({}, _op, par);
  258. //构建默认地图视图
  259. if (!option.view) {
  260. option.view = new View({
  261. projection: get('EPSG:3857'),
  262. center: fromLonLat(option.center),
  263. zoom: option.zoom,
  264. units: 'm',
  265. minZoom: 2,
  266. })
  267. }
  268. arcMap._EPSG = arcMap.EPSG.C3857;
  269. this._domid = domId;
  270. this._basemap = [];
  271. for (var i = 0; i < option.base.length; i++) {
  272. var _layer = baseLayer[option.base[i]]();
  273. if (_layer) {
  274. if (i == 0) {
  275. _layer.setVisible(true);
  276. }
  277. arcMap._basemap.push(_layer);
  278. }
  279. }
  280. map = myMap.map = arcMap.map = new Map({
  281. target: domId,
  282. layers: this._basemap,
  283. view: option.view
  284. });
  285. this.tempLayers.init();
  286. if (!option.hideCity)
  287. this.cityLineDefault(!par.zoom)
  288. else if (!par.zoom)
  289. myMap.zoomToextent(MapCenter.extent)
  290. },
  291. tempLayers: {
  292. _draw: "dview_draw_Layer",
  293. _search: "dview_search_Layer",
  294. dview_draw_Layer: null,
  295. dview_search_Layer: null,
  296. init: function() {
  297. if (!arcMap.getLayer(this._draw)) {
  298. arcMap.addLayer(arcMap.CreateVecLayer(this._draw));
  299. this.dview_draw_Layer = arcMap.getLayer(this._draw);
  300. }
  301. if (!arcMap.getLayer(this._search)) {
  302. arcMap.addLayer(arcMap.CreateVecLayerOfPopup(this._search));
  303. this.dview_search_Layer = arcMap.getLayer(this._search);
  304. this.dview_search_Layer.setStyle(arcMap.SetSelectStyle);
  305. }
  306. },
  307. clear: function(layer) {
  308. if (layer) {
  309. layer.getSource().clear();
  310. } else {
  311. this.dview_draw_Layer.getSource().clear();
  312. this.dview_search_Layer.getSource().clear();
  313. }
  314. }
  315. },
  316. cityLineDefault(zoom) {
  317. request({
  318. url: `/js/${XZQ_DM}.geojson`,
  319. method: 'get',
  320. }).then(res => {
  321. var f = new GeoJSON().readFeatures(Base64.decode(res));
  322. var city = baseLayer.cityLine();
  323. city.getSource().addFeatures(f);
  324. city.setVisible(true);
  325. arcMap.addLayer(city);
  326. if (zoom)
  327. arcMap.zoomToextent(f[0].getGeometry().getExtent())
  328. })
  329. },
  330. //按name获取
  331. getLayer: function(name) {
  332. var layer_ = null;
  333. this.map.getLayers().forEach(function(layer, i) {
  334. if (layer && layer.get("name") && layer.get("name") == name.toString()) {
  335. layer_ = layer;
  336. return;
  337. }
  338. });
  339. return layer_;
  340. },
  341. //按id获取
  342. getLayerById: function(id) {
  343. var layer_ = null;
  344. this.map.getLayers().forEach(function(layer, i) {
  345. if (layer && layer.get("id") && layer.get("id") == id.toString()) {
  346. layer_ = layer;
  347. return;
  348. }
  349. });
  350. return layer_;
  351. },
  352. //获取指定地图的图层
  353. getLayerByNameAndMap: function(name, type) {
  354. var layer_ = null;
  355. this[type].getLayers().forEach(function(layer) {
  356. if (layer && layer.get("name") && layer.get("name") == name) {
  357. layer_ = layer;
  358. return;
  359. }
  360. });
  361. return layer_;
  362. },
  363. zoomToextent: function(extent, meters) {
  364. meters = meters || 1000
  365. var view = arcMap.map.getView()
  366. view.fit(buffer(extent, meters), arcMap.map.getSize());
  367. },
  368. zoomToFeature: function(feature, meters) {
  369. meters = meters || 1000;
  370. let extent;
  371. //添加支持多个feature sky220622
  372. if (Array.isArray(feature)) {
  373. let cords = [];
  374. for (let i = 0; i < feature.length; i++) {
  375. let cord = feature[i].getGeometry().getExtent();
  376. cords.push([cord[0], cord[1]]);
  377. cords.push([cord[2], cord[3]]);
  378. }
  379. let testfs = new Feature({ geometry: new LineString(cords) })
  380. extent = testfs.getGeometry().getExtent();
  381. } else {
  382. extent = feature.getGeometry().getExtent();
  383. }
  384. arcMap.map.zoomToextent(feature.getGeometry().getExtent(), meters)
  385. },
  386. //缩放到中心点
  387. zoomToCenter: function(zoom, center) {
  388. var view = arcMap.map.getView()
  389. view.setZoom(zoom || 12);
  390. view.setCenter(fromLonLat(center || myMaps._center));
  391. },
  392. //缩放到图层
  393. zoomToLayer: function(layurl, cl) {
  394. var url = layurl + '?f=pjson' //空间查询url;
  395. request({
  396. method: 'get',
  397. url: url,
  398. }).then(res => {
  399. var extent = [res.fullExtent.xmin, res.fullExtent.ymin, res.fullExtent.xmax, res.fullExtent.ymax];
  400. myMaps.zoomToextent(extent, 20000)
  401. if (cl) cl(extent);
  402. })
  403. },
  404. //移动
  405. moveToFeature: function(feature) {
  406. let extent;
  407. //sky220622 添加支持多个feature
  408. if (Array.isArray(feature)) {
  409. let cords = [];
  410. for (let i = 0; i < feature.length; i++) {
  411. let cord = feature[i].getGeometry().getExtent();
  412. cords.push([cord[0], cord[1]]);
  413. cords.push([cord[2], cord[3]]);
  414. }
  415. let testfs = new Feature({ geometry: new LineString(cords) })
  416. extent = testfs.getGeometry().getExtent();
  417. } else {
  418. extent = feature.getGeometry().getExtent();
  419. }
  420. var center = getCenter(extent)
  421. var view = arcMap.map.getView()
  422. view.setCenter(center);
  423. arcMap.map.render();
  424. },
  425. addLayer: function(layer, type) {
  426. if (type) {
  427. this[type].addLayer(layer);
  428. } else {
  429. this.map.addLayer(layer);
  430. }
  431. },
  432. //删除图层
  433. removeLayer: function(layer) {
  434. var _layer = layer
  435. if (typeof(layer) == "string")
  436. _layer = arcMap.getLayer(layer)
  437. if (_layer)
  438. _layer.setVisible(false);
  439. this.map.removeLayer(_layer);
  440. },
  441. CreateVecLayer: function(layername, style, popup) {
  442. style = style || new Style({
  443. fill: new Fill({
  444. color: 'rgba(255, 255, 255, 0.2)'
  445. }),
  446. stroke: new Stroke({
  447. color: '#00008B',
  448. width: 2
  449. }),
  450. image: new Circle({
  451. radius: 7,
  452. fill: new Fill({
  453. color: '#00008B'
  454. })
  455. })
  456. });
  457. if (typeof(style) == "string") {
  458. style = MapConfig[style].style;
  459. }
  460. var _VectorLayer = new VectorLayer({
  461. zIndex: 9,
  462. declutter: false,
  463. source: new VectorSource(),
  464. name: layername,
  465. style: style,
  466. visible: true
  467. });
  468. if (popup) this.CreateLayerPopup(_VectorLayer, popup);
  469. return _VectorLayer;
  470. },
  471. SetSelectStyle: function(feature, resolution) {
  472. return new Style({
  473. fill: new Fill({
  474. color: 'rgba(255, 255, 255, 0.2)'
  475. }),
  476. stroke: new Stroke({
  477. color: '#ffcc33',
  478. width: 2
  479. }),
  480. image: new Circle({
  481. radius: 7,
  482. fill: new Fill({
  483. color: '#ffcc33'
  484. })
  485. }),
  486. });
  487. },
  488. //地图平移
  489. animateByGeom(g) {
  490. var view = arcMap.map.getView();
  491. var center = g.getCenter();
  492. view.animate({
  493. center: fromLonLat([center[0], center[1]]),
  494. zoom: arcMap.map.getView().getZoom(),
  495. duration: 1000,
  496. });
  497. },
  498. CreateVecLayerOfPopup: function(layername, style) {
  499. return this.CreateVecLayer(layername, style, true);
  500. },
  501. CreateLayerPopup: function(layer, popup) {
  502. if (layer && typeof(layer) != "object")
  503. layer = arcMap.getLayer(layer);
  504. if (layer)
  505. layer.popupInfo = popup;
  506. return layer;
  507. },
  508. lonLatToWebMercator: function(lon, lat) {
  509. var x = lon * 20037508.34 / 180;
  510. var y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);
  511. y = y * 20037508.34 / 180;
  512. return [x, y];
  513. },
  514. webMercatorToWgs84: function(x, y) {
  515. var lon = x / 20037508.34 * 180;
  516. var lat = y / 20037508.34 * 180;
  517. lat = 180 / Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);
  518. return [lon, lat];
  519. },
  520. LonLatDisplay: function() {
  521. var mousePositionControl = new MousePosition({
  522. coordinateFormat: function(e) {
  523. var es = arcMap.webMercatorToWgs84(e[0], e[1])
  524. return "经度:" + es[0].toFixed(2) + "° , 纬度:" + es[1].toFixed(2) + "°";
  525. },
  526. projection: get('EPSG:3857'),
  527. className: 'lonlat',
  528. target: document.getElementById('lonlat'),
  529. undefinedHTML: '&nbsp;',
  530. });
  531. mousePositionControl.setMap(arcMap.map);
  532. },
  533. removePopupOverlay: function() {
  534. arcMap.map.removeOverlay(arcMap.getPopupOverlay());
  535. },
  536. getPopupOverlay: function() {
  537. return this.map.getOverlayById("popup_temp");
  538. },
  539. addOverlay: function(Overlay, type) {
  540. if (type) {
  541. this[type].addOverlay(Overlay);
  542. } else {
  543. this.map.addOverlay(Overlay);
  544. }
  545. },
  546. //地图弹窗--点
  547. popupInfo: function(option) {
  548. var feature = option.feature;
  549. var evt = option.position;
  550. var _popupId_ = option.type ? "popup_temp" + option.type : "popup_temp";
  551. if (typeof(option.type) == 'string') {
  552. arcMap[option.type].removeOverlay(this.map.getOverlayById(_popupId_));
  553. } else {
  554. option.type = null;
  555. arcMap.map.removeOverlay(arcMap.getPopupOverlay());
  556. }
  557. var html = arguments[1];
  558. if (!html) {
  559. html = "<div id='" + _popupId_ + "' class='map-popupinfo'>";
  560. html += "<div class='popupinfo-title' >" + option.title + "<el-icon class='pointer popupinfo-close' id='closePop'><close /></el-icon></div>";
  561. html += "<ul class='popupinfo-content'>";
  562. if (Object.keys(option.attrs).length > 0) {
  563. for (var p in option.attrs) {
  564. var _value = feature.get(option.attrs[p].sxmc);
  565. if (option.attrs[p].callback) {
  566. _value = option.attrs[p].callback(_value)
  567. }
  568. if (_value == null) {
  569. _value = ''
  570. }
  571. html += "<li><span>" + (option.attrs[p].sxbm || option.attrs[p].name) + ":</span><span>" + _value + "</span></li>";
  572. }
  573. }
  574. }
  575. html += "</ul><div class='popupinfo-poi'></div></div>";
  576. var para = document.createElement("p");
  577. para.innerHTML = html;
  578. var text = option.type ? document.getElementById(option.type) : document.getElementById(myMap._domid)
  579. text.appendChild(para);
  580. if (option.type) {
  581. document.getElementById("closePop").onclick = function() {
  582. arcMap[option.type].removeOverlay(arcMap[option.type].getOverlayById(_popupId_));
  583. }
  584. } else {
  585. document.getElementById("closePop").onclick = function() {
  586. arcMap.map.removeOverlay(arcMap.getPopupOverlay());
  587. }
  588. }
  589. var popupElement = document.getElementById(_popupId_);
  590. var coord = evt ? evt.coordinate : feature.getGeometry().getCoordinates();
  591. var _overlay = new Overlay({
  592. id: _popupId_,
  593. position: coord,
  594. positioning: 'bottom-center',
  595. element: popupElement,
  596. stopEvent: true,
  597. autoPan: true,
  598. autoPanAnimation: {
  599. duration: 250,
  600. }
  601. });
  602. arcMap[option.type].addOverlay(_overlay, option.type);
  603. popupElement.parentElement.style.zIndex = 1;
  604. return _overlay;
  605. },
  606. SearchWfsByLoc: function(layers, feature, buffer, callback,layerParams) {
  607. if (typeof(feature) == "string") {
  608. var lonlat = (feature || '').split(",");
  609. var point = fromLonLat(transform([lonlat[0], lonlat[1]], 'EPSG:3857', 'EPSG:4326'));
  610. feature = new Feature({ geometry: new Point(arcMap.lonLatToWebMercator(point[0], point[1])) });
  611. }
  612. var geom;
  613. var bf;
  614. if (buffer) {
  615. var ol3 = new jsts.io.OL3Parser();
  616. ol3.inject(
  617. Point,
  618. LineString,
  619. LinearRing,
  620. Polygon,
  621. MultiPoint,
  622. MultiLineString,
  623. MultiPolygon
  624. );
  625. bf = new Feature({
  626. geometry: ol3.write(ol3.read(feature.getGeometry()).buffer(buffer))
  627. });
  628. geom = bf.getGeometry();
  629. } else {
  630. geom = feature.getGeometry();
  631. }
  632. arcMap.SearchWfsData(layers, geom, function(datas, res) {
  633. callback(datas, bf, res);
  634. },layerParams)
  635. },
  636. //WFS查询
  637. SearchWfsData: function(layers, data, cl, layerParams) {
  638. if (!layers) {
  639. console.warn("查询图层为空")
  640. return;
  641. }
  642. var geo = new EsriJSON().writeGeometry(data);
  643. var geometryType = 'esriGeometryPolygon';
  644. if (data.getType() == 'Point') {
  645. geometryType = 'esriGeometryPoint'
  646. }
  647. var params = {
  648. "f": "json",
  649. geometry: geo,
  650. geometryType: geometryType,
  651. inSR: 3857,
  652. outSR: 3857,
  653. returnGeometry: true,
  654. spatialRel: 'esriSpatialRelIntersects',
  655. outFields: "*"
  656. };
  657. const formData = new FormData();
  658. for (let key in params) {
  659. formData.append(key, params[key])
  660. }
  661. var url = layers.endsWith('query') ? layers : layers + '/0/query' //空间查询url;
  662. request({
  663. method: 'post',
  664. url: url,
  665. data: formData,
  666. dataType: "json",
  667. }).then(res => {
  668. var features = new EsriJSON().readFeatures(res);
  669. let aliases = res.fieldAliases
  670. if (layerParams && layerParams.bsm) {
  671. // 对字典表进行优化,避免同一图层多次查询,vuex保存字典
  672. let haveDict = store.state.zyll.layerDict[layerParams.bsm]
  673. if (haveDict && Object.keys(haveDict).length > 0) {
  674. aliases = haveDict
  675. if (cl) cl(features, aliases);
  676. }else{
  677. // 查询字典维护表,若配置过有数据则查字典进行汉化,否则去查询server别名
  678. GetFieldValue({bsm:layerParams.bsm}).then(res=>{
  679. if (res.success) {
  680. if (res.data.length > 0) {
  681. let obj = {},dicObj = {}
  682. res.data.map(t=>{
  683. obj[t.fieldname] = t.fieldaliasname
  684. })
  685. dicObj[layerParams.bsm] = obj
  686. store.commit("SET_LAYERDICT", dicObj);
  687. aliases = obj
  688. }
  689. }
  690. }).finally(()=>{ if (cl) cl(features, aliases);})
  691. }
  692. }else{
  693. if (cl) cl(features, aliases);
  694. }
  695. })
  696. },
  697. //wfs属性查询
  698. SearchWfsFilter(layers, filter, cl, layerParams) {
  699. if (!layers) {
  700. console.warn("查询图层为空")
  701. return;
  702. }
  703. var url = layers.endsWith('query') ? layers : layers + '/0/query' //空间查询url;
  704. arcMap.SearchWfsFilter2(url, filter, cl, layerParams);
  705. },
  706. //wfs属性查询
  707. SearchWfsFilter2(url, filter, cl, layerParams) {
  708. const formData = new FormData();
  709. var params = {
  710. "f": "pjson",
  711. inSR: 3857,
  712. outSR: 3857,
  713. where: filter,
  714. outFields: "*"
  715. };
  716. for (let key in params) {
  717. formData.append(key, params[key])
  718. }
  719. request({
  720. method: 'post',
  721. url: url,
  722. data: formData,
  723. dataType: "json",
  724. }).then(res => {
  725. var features;
  726. if (res.error && res.error.code == 400) {
  727. features = res.error
  728. } else {
  729. features = new EsriJSON().readFeatures(res);
  730. let aliases = res.fieldAliases
  731. if (layerParams && layerParams.bsm) {
  732. // 对字典表进行优化,避免同一图层多次查询,vuex保存字典
  733. let haveDict = store.state.zyll.layerDict[layerParams.bsm]
  734. if (haveDict && Object.keys(haveDict).length > 0) {
  735. aliases = haveDict
  736. if (cl) cl(features, aliases);
  737. }else{
  738. // 查询字典维护表,若配置过有数据则查字典进行汉化,否则去查询server别名
  739. GetFieldValue({bsm:layerParams.bsm}).then(res=>{
  740. if (res.success) {
  741. if (res.data.length > 0) {
  742. let obj = {},dicObj = {}
  743. res.data.map(t=>{
  744. obj[t.fieldname] = t.fieldaliasname
  745. })
  746. dicObj[layerParams.bsm] = obj
  747. store.commit("SET_LAYERDICT", dicObj);
  748. aliases = obj
  749. }
  750. }
  751. }).finally(()=>{ if (cl) cl(features, aliases);})
  752. }
  753. }else{
  754. if (cl) cl(features, aliases);
  755. }
  756. }
  757. })
  758. },
  759. // 获取字段
  760. getField:function (layers, cl) {
  761. var url = layers.url + '/0?f=pjson' //空间查询url;
  762. request({
  763. method: 'get',
  764. url: url,
  765. }).then(res => {
  766. let aliases = {}
  767. res.fields.map(t=>{
  768. aliases[t.name] = t.alias
  769. })
  770. if (layers && layers.bsm) {
  771. // 对字典表进行优化,避免同一图层多次查询,vuex保存字典
  772. let haveDict = store.state.zyll.layerDict[layers.bsm]
  773. if (haveDict && Object.keys(haveDict).length > 0) {
  774. aliases = haveDict
  775. if (cl) cl(aliases);
  776. }else{
  777. // 查询字典维护表,若配置过有数据则查字典进行汉化,否则去查询server别名
  778. GetFieldValue({bsm:layers.bsm}).then(res=>{
  779. if (res.success) {
  780. if (res.data.length > 0) {
  781. let obj = {},dicObj = {}
  782. res.data.map(t=>{
  783. obj[t.fieldname] = t.fieldaliasname
  784. })
  785. dicObj[layers.bsm] = obj
  786. store.commit("SET_LAYERDICT", dicObj);
  787. aliases = obj
  788. }
  789. }
  790. }).finally(()=>{ if (cl) cl(aliases);})
  791. }
  792. }else{
  793. if (cl) cl(aliases);
  794. }
  795. })
  796. },
  797. //获取图例
  798. getLegend: function(layers, cl) {
  799. var url = layers + '/legend?f=pjson' //空间查询url;
  800. request({
  801. method: 'get',
  802. url: url,
  803. }).then(res => {
  804. if (cl) cl(res.layers);
  805. })
  806. },
  807. WMSTile: function(record) {
  808. var _layer = new TileLayer({
  809. name: record.url,
  810. id: record.id,
  811. source: new TileArcGISRest({
  812. url: record.url,
  813. }),
  814. });
  815. arcMap.addLayer(_layer);
  816. },
  817. XYZTile: function(record) {
  818. var imgsource = new XYZ({
  819. crossOrigin: 'anonymous',
  820. url: record.url,
  821. });
  822. var untiled = new TileLayer({
  823. name: record.url,
  824. id: record.id,
  825. source: imgsource,
  826. });
  827. arcMap.addLayer(untiled);
  828. },
  829. TILE: function(record, call, zoom) {
  830. var imgsource = new XYZ({
  831. crossOrigin: 'anonymous',
  832. url: record.url,
  833. });
  834. var untiled = new TileLayer({
  835. name: record.url,
  836. id: record.bsm || record.id,
  837. source: imgsource,
  838. zIndex: (record.sort || 1) * -1
  839. });
  840. if (call) {
  841. return untiled;
  842. }
  843. arcMap.addLayer(untiled);
  844. //ZOOM
  845. if (zoom) {
  846. arcMap.zoomToLayer(record.url);
  847. }
  848. },
  849. // 矢量切片渲染
  850. VectorTile: function (record, call, zoom) {
  851. // var GDALPath = "../../.." + import.meta.env.VITE_APP_BASE_API
  852. var GDALPath = import.meta.env.VITE_APP_BASE_API
  853. var tilesize = 512;
  854. var layerWkid = 3857;
  855. let LAYERDEF = {
  856. DATAURI: record.DATAURI,
  857. LAYERNAME: record.LAYERNAME,
  858. SPATIALREF: !record.SPATIALREF ? 'EPSG:' + layerWkid : record.SPATIALREF,
  859. }
  860. axios.post(GDALPath + "/vector/gdb/cachelayer", { 'LAYERDEF': LAYERDEF }).then(function (data) {
  861. if(data.code && data.code == 500){
  862. ElMessage.warning(!data.msg ? '服务未找到' : data.msg)
  863. return
  864. }
  865. if(!data.data.LAYERINFO.EXTENT){
  866. ElMessage.warning(`${record.LAYERNAME}图层要素为空!`)
  867. return
  868. }
  869. var layerId = data.data.LAYERID;
  870. var tilegrid = createXYZ({
  871. extent: get('EPSG:' + layerWkid).getExtent(),
  872. maxZoom: 22,
  873. tileSize: [tilesize, tilesize]
  874. });
  875. var untiled = new VectorTileLayer({
  876. layerid: layerId,
  877. id: record.id,
  878. source: new VectorTileSource({
  879. format: new MVT(),
  880. projection: new Projection({code: 'EPSG:' + layerWkid, units: 'm'}),
  881. //切片格网直接有4326坐标系统的坐标范围与缩放大小指定,因此每一级的都是固定的
  882. tileGrid: tilegrid,
  883. tileUrlFunction: function (tileCoord) {
  884. var extent = tilegrid.getExtent();
  885. var origin = getTopLeft(extent);
  886. var height = getWidth(extent);
  887. var tilemetric = height / (1 << tileCoord[0]);
  888. var minX = origin[0] + tilemetric * tileCoord[1];
  889. var maxX = minX + tilemetric;
  890. var maxY = origin[1] - tilemetric * tileCoord[2];
  891. var minY = maxY - tilemetric;
  892. var params = {};
  893. params["MINX"] = minX;
  894. params["MINY"] = minY;
  895. params["MAXX"] = maxX;
  896. params["MAXY"] = maxY;
  897. params["TILESIZE"] = tilesize;
  898. return appendParams(GDALPath + "/vector/gdb/gettile?LAYERID=" + layerId, params);
  899. }
  900. }),
  901. });
  902. if(record.style){
  903. untiled.setStyle(new Style({
  904. fill: new Fill({
  905. color:record.style.fillColor
  906. }),
  907. stroke: new Stroke({
  908. color:record.style.strokeColor,
  909. width: 1
  910. }),
  911. }))
  912. }
  913. if(record.styleByField){
  914. untiled.setStyle(createMapboxStreetsV6Style(Style, Fill,Stroke, Icon,Text))
  915. }
  916. if (call) {
  917. return untiled;
  918. }
  919. arcMap.addLayer(untiled);
  920. var extent = [
  921. data.data.LAYERINFO.EXTENT.MINX,
  922. data.data.LAYERINFO.EXTENT.MINY,
  923. data.data.LAYERINFO.EXTENT.MAXX,
  924. data.data.LAYERINFO.EXTENT.MAXY,
  925. ];
  926. arcMap.zoomToextent(extent);
  927. //ZOOM
  928. if (zoom) {
  929. arcMap.zoomToLayer(record.url);
  930. }
  931. }).catch(function (error) {
  932. console.log(error);
  933. ElMessage.warning('服务未找到')
  934. });
  935. },
  936. WMS: function(record, call, zoom) {
  937. var sou = { url: record.url };
  938. if (record.show) {
  939. sou.params = {
  940. layers: "show:" + record.show
  941. }
  942. }
  943. var untiled = new TileLayer({
  944. name: record.url,
  945. id: record.bsm || record.id,
  946. source: new TileArcGISRest(sou),
  947. zIndex: (record.sort || 1) * -1
  948. });
  949. if (call) {
  950. return untiled;
  951. }
  952. arcMap.addLayer(untiled);
  953. },
  954. IMG: function(record, call, zoom) {
  955. var imgsource = new TileArcGISRest({
  956. url: record.url
  957. });
  958. var untiled = new TileLayer({
  959. name: record.url,
  960. id: record.bsm || record.id,
  961. source: imgsource,
  962. zIndex: (record.sort || 1) * -1
  963. });
  964. if (call) {
  965. return untiled;
  966. }
  967. arcMap.addLayer(untiled);
  968. },
  969. WMTS: function(record, call, zoom) {
  970. // debugger
  971. var imgsource = new XYZ({
  972. crossOrigin: 'anonymous',
  973. url: record.url + `/tile/{z}/{y}/{x}`,
  974. });
  975. var untiled = new TileLayer({
  976. name: record.url,
  977. id: record.bsm || record.id,
  978. source: imgsource,
  979. zIndex: (record.sort || 1) * -1
  980. });
  981. if (call) {
  982. return untiled;
  983. }
  984. arcMap.addLayer(untiled);
  985. //ZOOM
  986. if (zoom) {
  987. arcMap.zoomToLayer(record.url);
  988. }
  989. },
  990. add4490(){
  991. const projection = new Projection({ code: 'EPSG:4490', units: 'degrees', axisOrientation: 'neu' })
  992. projection.setExtent([-180, -90, 180, 90]);
  993. projection.setWorldExtent([-180, -90, 180, 90]);
  994. addProjection(projection);
  995. return projection
  996. },
  997. rest: function (record, call, zoom) {
  998. // 获取投影信息
  999. let projection = arcMap.add4490();
  1000. const tileSizePixels = 256;
  1001. const tileSizeMtrs = getWidth(projection.getExtent()) / tileSizePixels;
  1002. // 创建WMTS瓦片网格
  1003. const matrixIds = [];
  1004. const resolutions = [];
  1005. for (let i = 0; i <= 16; i++) {
  1006. matrixIds[i] = i;
  1007. resolutions[i] = tileSizeMtrs / Math.pow(2, i);
  1008. }
  1009. // 创建WMTS源
  1010. const wmtsSource = new WMTS({
  1011. url: record.url,//'http://10.255.134.70:8090/iserver/services/map-dwd_res_gov_hbdk/wmts100',
  1012. layer: record.sde,//'dwd_res_gov_hbdk@gtkjzl_db',
  1013. style: 'default',
  1014. version: '1.0.0',
  1015. matrixSet: record.icon + record.sde, //'CUSTOM_dwd_res_gov_hbdk@gtkjzl_db',
  1016. format: 'image/png',
  1017. projection,
  1018. tileGrid: new WMTSTileGrid({
  1019. origin: getTopLeft(projection.getExtent()),
  1020. resolutions: resolutions,
  1021. matrixIds: matrixIds
  1022. }),
  1023. wrapX: true,
  1024. // attributions: 'zhx © 版权信息'
  1025. });
  1026. const untiled = new TileLayer({
  1027. source: wmtsSource,
  1028. });
  1029. if (call) {
  1030. return untiled;
  1031. }
  1032. arcMap.addLayer(untiled);
  1033. // arcMap.map.getView().setCenter([108.53 , 39.2 ])
  1034. //ZOOM
  1035. if (zoom) {
  1036. arcMap.zoomToLayer(record.url);
  1037. }
  1038. },
  1039. //加载图层
  1040. addProLayer: function(record, call, zoom) {
  1041. const formData = new FormData();
  1042. var params = {
  1043. "f": "pjson",
  1044. 'clipping': {
  1045. "hasZ": false,
  1046. "hasM": false,
  1047. "rings": [
  1048. [
  1049. [11817057.906963758, 4591719.129383848],
  1050. [11817057.906963758, 4666026.131804026],
  1051. [11876165.754922504, 4666026.131804026],
  1052. [11876165.754922504, 4591719.129383848],
  1053. [11817057.906963758, 4591719.129383848]
  1054. ]
  1055. ]
  1056. }
  1057. }
  1058. for (let key in params) {
  1059. formData.append(key, params[key])
  1060. }
  1061. var imgsource = new TileArcGISRest({
  1062. url: record.url,
  1063. params: JSON.stringify(params)
  1064. });
  1065. var untiled = new TileLayer({
  1066. url: record.url,
  1067. name: record.url,
  1068. id: record.bsm || record.id,
  1069. source: imgsource,
  1070. zIndex: (record.sort || 1) * -1,
  1071. });
  1072. if (call) {
  1073. return untiled;
  1074. }
  1075. arcMap.addLayer(untiled);
  1076. },
  1077. //feature转coordinates
  1078. featureToCoordinates(feature) {
  1079. console.log(feature)
  1080. var geo = feature.geometry;
  1081. console.log(geo)
  1082. },
  1083. //条件查询地图切片
  1084. mapQueryTile(features, layurl, name, field) {
  1085. var objList = []
  1086. features.map((res, i) => {
  1087. objList.push(res.get(field || 'OBJECTID'));
  1088. })
  1089. var _layer = new TileLayer({
  1090. url: layurl,
  1091. name: name || 'QueryTile_Lay',
  1092. source: new TileArcGISRest({
  1093. url: layurl,
  1094. params: {
  1095. layerDefs: JSON.stringify({ "0": `${field || 'OBJECTID'} in (${objList.join(',')})` }),
  1096. }
  1097. })
  1098. });
  1099. //如果名称是空,那就先移除之前的图层
  1100. if (!name) arcMap.removeLayer('QueryTile_Lay');
  1101. arcMap.addLayer(_layer);
  1102. return _layer;
  1103. },
  1104. //地图裁剪
  1105. mapClip(feature, layer) {
  1106. layer.on('prerender', function(event) {
  1107. var ctx = event.context;
  1108. const vectorContext = getVectorContext(event);
  1109. ctx.save();
  1110. vectorContext.drawGeometry(feature.getGeometry());
  1111. ctx.clip();
  1112. });
  1113. layer.on('postrender', function(event) {
  1114. var ctx = event.context;
  1115. ctx.restore();
  1116. });
  1117. },
  1118. //地图裁剪2
  1119. mapClip2(feature, layer) {
  1120. var map = this.map;
  1121. // layer.on('prerender', function (event) {
  1122. // console.log(123456,event)
  1123. // var ctx = event.context;
  1124. // const vectorContext = getVectorContext(event);
  1125. // ctx.save();
  1126. // vectorContext.drawGeometry(feature.getGeometry());
  1127. // ctx.clip();
  1128. // });
  1129. layer.on('postrender', function(event) {
  1130. let vectorContext = getVectorContext(event);
  1131. event.context.globalCompositeOperation = 'destination-in';
  1132. vectorContext.drawFeature(feature, new Style({
  1133. fill: new Fill({
  1134. color: 'black', // 必需设置颜色
  1135. })
  1136. }));
  1137. event.context.globalCompositeOperation = 'source-over';
  1138. });
  1139. }
  1140. }
  1141. return myMaps;
  1142. })();
  1143. export default arcMap;