drawRegionMap.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import * as KMap from "@/utils/ol-map/KMap";
  2. import * as util from "@/common/ol_common.js";
  3. import config from "@/api/config.js";
  4. import Style from "ol/style/Style";
  5. import Icon from "ol/style/Icon";
  6. import { Point } from 'ol/geom';
  7. import Feature from "ol/Feature";
  8. import * as proj from "ol/proj";
  9. import { getArea } from 'ol/sphere.js';
  10. import WKT from "ol/format/WKT.js";
  11. import proj4 from "proj4"
  12. import { register } from "ol/proj/proj4";
  13. proj4.defs("EPSG:38572", "+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs");
  14. register(proj4);
  15. /**
  16. * @description 地图层对象
  17. */
  18. class DrawRegionMap {
  19. constructor() {
  20. let that = this;
  21. let vectorStyle = new KMap.VectorStyle();
  22. this.vectorStyle = vectorStyle;
  23. // 位置图标
  24. this.clickPointLayer = new KMap.VectorLayer("clickPointLayer", 9999, {
  25. style: (f) => {
  26. return new Style({
  27. image: new Icon({
  28. src: require("@/assets/img/home/garden-point.png"),
  29. scale: 0.5,
  30. anchor: [0.5, 1],
  31. }),
  32. });
  33. },
  34. });
  35. }
  36. initMap(location, target) {
  37. let level = 16;
  38. let coordinate = util.wktCastGeom(location).getFirstCoordinate();
  39. this.kmap = new KMap.Map(target, level, coordinate[0], coordinate[1], null, 8, 22);
  40. let xyz2 = config.base_img_url3 + "map/lby/{z}/{x}/{y}.png";
  41. this.kmap.addXYZLayer(xyz2, { minZoom: 8, maxZoom: 22 }, 2);
  42. this.kmap.addLayer(this.clickPointLayer.layer);
  43. this.setMapPoint(coordinate)
  44. this.kmap.initDraw((e) => {
  45. // drawend事件:绘制结束后的处理(支持绘制多个地块)
  46. })
  47. this.kmap.startDraw()
  48. this.kmap.modifyDraw()
  49. }
  50. setAreaGeometry(geometryArr, needFitView = false) {
  51. let that = this
  52. geometryArr.map(item => {
  53. // 不使用 setLayerWkt,而是手动添加要素,避免自动缩放视图
  54. const format = new WKT()
  55. const mapProjection = that.kmap.map.getView().getProjection()
  56. let geometry = format.readGeometry(item, {
  57. dataProjection: 'EPSG:4326',
  58. featureProjection: mapProjection
  59. })
  60. let f = new Feature({ geometry: geometry })
  61. that.kmap.polygonLayer.source.addFeature(f)
  62. })
  63. // 根据参数决定是否需要自适应地块范围
  64. if (needFitView) {
  65. this.fitView()
  66. }
  67. }
  68. fitView() {
  69. let extent = this.kmap.polygonLayer.source.getExtent()
  70. // 地图自适应到区域可视范围
  71. this.kmap.getView().fit(extent, { duration: 500, padding: [100, 100, 100, 100] });
  72. }
  73. clearLayer() {
  74. // this.kmap.removeLayer(this.clickPointLayer.layer)
  75. this.kmap.polygonLayer.source.clear();
  76. }
  77. getAreaGeometry() {
  78. const features = this.kmap.getLayerFeatures()
  79. let geometryArr = []
  80. let area = 0
  81. const format = new WKT()
  82. // 获取图层上的Polygon,转成WKT用于回显
  83. features.forEach(item => {
  84. // 使用 writeGeometry 而不是 writeFeature,因为 setLayerWkt 期望的是几何体的 WKT
  85. const geometry = item.getGeometry()
  86. geometryArr.push(format.writeGeometry(geometry, {
  87. dataProjection: 'EPSG:4326',
  88. featureProjection: this.kmap.map.getView().getProjection()
  89. }))
  90. let geom = geometry.clone()
  91. geom.transform(proj.get("EPSG:4326"), proj.get("EPSG:38572"))
  92. let areaItem = getArea(geom)
  93. areaItem = (areaItem + areaItem / 2) / 1000;
  94. area += areaItem
  95. })
  96. return { geometryArr, mianji: area.toFixed(2) } // 修改为 mianji 字段,与创建页面保持一致
  97. }
  98. setMapPosition(center) {
  99. this.kmap.getView().animate({
  100. center,
  101. zoom: 17,
  102. duration: 500,
  103. });
  104. this.setMapPoint(center)
  105. }
  106. setMapPoint(coordinate) {
  107. this.clickPointLayer.source.clear()
  108. let point = new Feature(new Point(coordinate))
  109. this.clickPointLayer.addFeature(point)
  110. }
  111. // 删除当前地块(删除最新绘制的一个地块)
  112. deleteCurrentPolygon() {
  113. if (!this.kmap || !this.kmap.polygonLayer) return;
  114. const features = this.kmap.polygonLayer.source.getFeatures();
  115. if (features && features.length > 0) {
  116. const lastFeature = features[features.length - 1];
  117. this.kmap.polygonLayer.source.removeFeature(lastFeature);
  118. }
  119. }
  120. }
  121. export default DrawRegionMap;