farmMap.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. import Layer from "ol/layer/Vector";
  2. import config from "@/api/config.js";
  3. import * as KMap from "@/utils/ol-map/KMap";
  4. import Stroke from "ol/style/Stroke";
  5. import * as util from "@/common/ol_common.js";
  6. import Style from "ol/style/Style";
  7. import Icon from "ol/style/Icon";
  8. import { Point } from 'ol/geom';
  9. import Feature from "ol/Feature";
  10. import VectorLayer from "ol/layer/Vector.js";
  11. import WKT from "ol/format/WKT";
  12. import { Cluster, Vector as VectorSource } from "ol/source";
  13. import { newAreaFeature, newAreaPoint, newPolymerFeature, newPoint } from "@/utils/map.js";
  14. import { GARDEN_STATUS_ENUM as STATUS_ENUM } from "@/api/enum.js"
  15. import { getArea } from 'ol/sphere.js';
  16. import * as proj from "ol/proj";
  17. import { register } from "ol/proj/proj4";
  18. import proj4 from "proj4"
  19. import eventBus from "@/api/eventBus";
  20. 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");
  21. register(proj4);
  22. /**
  23. * @description 智能巡园地图层对象
  24. */
  25. class FarmMap {
  26. constructor() {
  27. let that = this;
  28. let vectorStyle = new KMap.VectorStyle();
  29. this.vectorStyle = vectorStyle;
  30. this.treeClusterLayer = new KMap.VectorLayer("tree-cluster", 999, {
  31. minZoom: 15,
  32. style: (f) => this.getStyle(f)
  33. })
  34. this.areaLayer = new KMap.VectorLayer("areaLayer", 999, { style: (f) => that.vectorStyle.getPolygonStyle("#00000010", "#000000", 3) })
  35. this.subAreaLayer = new KMap.VectorLayer("subAreaLayer", 1000, {
  36. style: (f) => {
  37. return that.vectorStyle.getPolygonStyle(f.get("fillColor"), f.get("strokeColor"), 2)
  38. }
  39. })
  40. that.areaVal = 0
  41. this.treeCacheStyle = {}
  42. this.treeStyle = (f) => {
  43. let key = f.get("imgSrc");
  44. if (that.treeCacheStyle[key]) {
  45. return that.treeCacheStyle[key]
  46. }
  47. let style = new Style({
  48. image: new Icon({
  49. src: f.get("imgSrc"),
  50. scale: 1,
  51. anchor: [0.5, 1],
  52. })
  53. });
  54. that.treeCacheStyle[key] = style
  55. return style
  56. }
  57. this.treeLayer = new KMap.VectorLayer("statusPointLayer", 999, { style: that.treeStyle })
  58. this.blueRegionLayer = new KMap.VectorLayer("blueRegionLayer", 99, {
  59. minZoom: 1,
  60. maxZoom: 22,
  61. style: function (f) {
  62. const selected = f.get('selected');
  63. if (selected) {
  64. return that.vectorStyle.getPolygonStyle("rgba(23, 99, 110, 0.43)", "rgba(37, 227, 255, 0.7)", 2)
  65. }
  66. return that.vectorStyle.getPolygonStyle("rgba(0, 0, 0, 0.5)", "rgba(255, 255, 255, 0.2)", 1)
  67. }
  68. });
  69. }
  70. initMap(location, target) {
  71. let level = 16;
  72. let coordinate = util.wktCastGeom(location).getFirstCoordinate();
  73. this.kmap = new KMap.Map(target, level, coordinate[0], coordinate[1], null, 1, 22, "vec", true, true);
  74. this.kmap.addLayer(this.areaLayer.layer)
  75. this.kmap.addLayer(this.subAreaLayer.layer)
  76. this.kmap.addLayer(this.treeLayer.layer)
  77. this.kmap.addLayer(this.blueRegionLayer.layer)
  78. this.kmap.addLayer(this.treeClusterLayer.layer)
  79. this.addMapSingerClick()
  80. }
  81. initData(farmId, regionId) {
  82. let that = this
  83. VE_API.image.pointByRegionId({ farmId, regionId }).then(({ data }) => {
  84. let features = []
  85. for (let item of data) {
  86. item.iconName = 'defalut'
  87. that.getIcon(item)
  88. let point = newPoint(item);
  89. features.push(point)
  90. }
  91. if (this.treeClusterLayer && this.treeClusterLayer.layer.getSource()) {
  92. // this.treeClusterLayer.layer.getSource().getSource().clear()
  93. }
  94. that.clusterSource = new Cluster({
  95. distance: 15,
  96. minDistance: 60,
  97. source: new VectorSource({
  98. features: features,
  99. }),
  100. });
  101. that.treeClusterLayer.layer.setSource(that.clusterSource)
  102. setTimeout(()=>{
  103. that.kmap.fit(that.clusterSource.source.getExtent(), {padding:[100,100,100,100]})
  104. },100)
  105. })
  106. }
  107. //多点的过滤方法
  108. manyFeatureFilter(features) {
  109. let res = features[0]
  110. if (features.length == 1) {
  111. return res
  112. }
  113. for (let item of features) {
  114. res = res.get('status') > item.get('status') ? res : item
  115. }
  116. return res;
  117. }
  118. //得到点样式
  119. getStyle(feature) {
  120. feature = this.manyFeatureFilter(feature.get('features'))
  121. return this.getIconStyle(feature)
  122. }
  123. getIconStyle(feature) {
  124. let style = new Style({
  125. image: new Icon({
  126. src: feature.get('icon'),
  127. // src: require(`@/assets/images/map/${feature.get('iconName')}-icon.png`),
  128. scale: feature.get('scale'),
  129. })
  130. });
  131. return style
  132. }
  133. getIcon(item) {
  134. // let imgSrc = require(`@/assets/images/map/${item.iconName}-icon.png`)
  135. let imgSrc = require('@/assets/images/map/status/status-zc.png')
  136. let scale = 0.8
  137. if (item.status == 1) {
  138. imgSrc = require('@/assets/images/map/status/status-szyc.png')
  139. }
  140. if (item.status == 2) {
  141. imgSrc = require('@/assets/images/map/status/status-bh.png')
  142. }
  143. if (item.status == 3) {
  144. imgSrc = require('@/assets/images/map/status/status-ch.png')
  145. }
  146. item["icon"] = imgSrc
  147. item["scale"] = scale
  148. }
  149. // 重新渲染地图
  150. updateMap() {
  151. setTimeout(() => {
  152. this.kmap.map.updateSize()
  153. }, 1000);
  154. }
  155. fit(geomOrExtent, padding) {
  156. this.kmap.fit(geomOrExtent, padding);
  157. }
  158. addMapSingerClick() {
  159. let that = this
  160. this.kmap.on("singleclick", (evt) => {
  161. that.kmap.map.forEachFeatureAtPixel(evt.pixel, function (feature, layer) {
  162. if (layer instanceof VectorLayer && layer.get("name") === "blueRegionLayer") {
  163. feature.set('selected', feature.get("selected") ? false : true);
  164. let geom = feature.getGeometry().clone()
  165. geom.transform(proj.get("EPSG:4326"), proj.get("EPSG:38572"))
  166. let areaItem = getArea(geom)
  167. areaItem = (areaItem + areaItem / 2) / 1000;
  168. if (feature.get('selected') === true) {
  169. that.areaVal += areaItem
  170. } else {
  171. that.areaVal -= areaItem
  172. }
  173. eventBus.emit("editNsMap:areaVal", that.areaVal)
  174. }
  175. })
  176. })
  177. }
  178. // 状态图例
  179. handleStatusIcon(obj) {
  180. let key = this.afterDayNum == 3 ? "ycStatus" : this.afterDayNum == 5 ? "ycStatus5d" : "ycStatus7d"
  181. let hasStatus = false
  182. let imgSrc = null
  183. if (obj[key] == 3) {
  184. hasStatus = true
  185. imgSrc = require('@/assets/status/status_bcyc.png')
  186. return { hasStatus, imgSrc }
  187. }
  188. if (obj[key] == 2) {
  189. hasStatus = true
  190. imgSrc = require('@/assets/status/status_szyc.png')
  191. return { hasStatus, imgSrc }
  192. }
  193. // if (obj[key] == 1) {
  194. // hasStatus = true
  195. // imgSrc = require('@/assets/status/status_dfh.png')
  196. // return { hasStatus, imgSrc }
  197. // }
  198. // if (obj[key] == 0) {
  199. // hasStatus = true
  200. // imgSrc = require('@/assets/status/status_xfdw.png')
  201. // return { hasStatus, imgSrc }
  202. // }
  203. return { hasStatus, imgSrc }
  204. }
  205. // 区级颜色
  206. handleStatusColor(key) {
  207. let fillColor = '#ffffff00'
  208. let strokeColor = '#ffffff'
  209. switch (key) {
  210. case STATUS_ENUM.DONE:
  211. fillColor = 'rgba(95,255,197,0)'
  212. strokeColor = '#ffffff'
  213. break;
  214. case STATUS_ENUM.ABNORMAL_GROWTH:
  215. fillColor = 'rgba(255,189,5,0.2)'
  216. strokeColor = '#FFE44E'
  217. break;
  218. case STATUS_ENUM.ABNORMAL_Pest:
  219. fillColor = 'rgba(51,11,3,0.52)'
  220. strokeColor = '#F55A5A'
  221. break;
  222. case STATUS_ENUM.PENDING_REVIEW:
  223. fillColor = 'rgba(3,40,51,0.2)'
  224. strokeColor = '#032833'
  225. break;
  226. case STATUS_ENUM.REVIEWED:
  227. fillColor = 'rgba(95,255,197,0.1)'
  228. strokeColor = '#5FFFC5'
  229. break;
  230. default:
  231. break;
  232. }
  233. return { fillColor, strokeColor }
  234. }
  235. initArea(data, callback) {
  236. let that = this
  237. this.areaLayer.refresh()
  238. for (let item of data) {
  239. that.areaLayer.addFeature(newAreaFeature(item))
  240. that.areaPointLayer.addFeature(newAreaPoint(item))
  241. }
  242. callback && callback()
  243. }
  244. initSubArea(organId, callback) {
  245. let that = this
  246. this.subAreaLayer.refresh()
  247. VE_API.sub_area.list({ organId }).then(({ data, code }) => {
  248. for (let item of data) {
  249. item.fillColor = that.handleStatusColor(item.status).fillColor
  250. item.strokeColor = that.handleStatusColor(item.status).strokeColor
  251. that.subAreaLayer.addFeature(newPolymerFeature(item))
  252. }
  253. callback && callback()
  254. })
  255. }
  256. toggleLegend(val) {
  257. // this.treeLayer.layer.setVisible(val)
  258. this.treeClusterLayer.layer.setVisible(val)
  259. }
  260. getBlueRegion({ gardenId, regionId }, callback) {
  261. this.blueRegionLayer.source && this.blueRegionLayer.source.clear()
  262. VE_API.farm.blueRegionList({ farmId: gardenId, regionId }).then(({ data, code }) => {
  263. for (let item of data) {
  264. item.wkt = item.geom
  265. item.id = item.blueZoneCode
  266. let feature = newAreaFeature(item);
  267. this.blueRegionLayer.addFeature(feature)
  268. }
  269. this.kmap.fit(this.blueRegionLayer.source.getExtent(), [0, 0, 0, 0])
  270. callback && callback(data.length)
  271. })
  272. }
  273. setBlueRegion(data) {
  274. this.blueRegionLayer.source.getFeatures().forEach(feature => {
  275. // 检查 feature 的属性中是否有 selected 属性且为 true
  276. data.map(item => {
  277. if (item.id === feature.get('id')) {
  278. feature.set('selected', true)
  279. }
  280. })
  281. });
  282. }
  283. toggleAllArea(val) {
  284. let that = this
  285. that.areaVal = 0
  286. this.blueRegionLayer.source.getFeatures().forEach(feature => {
  287. feature.set('selected', val)
  288. if (val === true) {
  289. let geom = feature.getGeometry().clone()
  290. geom.transform(proj.get("EPSG:4326"), proj.get("EPSG:38572"))
  291. let areaItem = getArea(geom)
  292. areaItem = (areaItem + areaItem / 2) / 1000;
  293. that.areaVal += areaItem
  294. }
  295. eventBus.emit("editNsMap:areaVal", that.areaVal)
  296. });
  297. }
  298. getSelectedBlueRegion() {
  299. // 用于存储 selected 为 true 的 feature 的 id
  300. const selectedFeatureIds = [];
  301. // 遍历所有 features
  302. this.blueRegionLayer.source.getFeatures().forEach(feature => {
  303. // 检查 feature 的属性中是否有 selected 属性且为 true
  304. if (feature.get('selected') === true) {
  305. // 获取 feature 的 id
  306. const id = feature.get('id');
  307. // 将 id 添加到数组中
  308. selectedFeatureIds.push({ id });
  309. }
  310. });
  311. return selectedFeatureIds;
  312. }
  313. }
  314. export default FarmMap;