authenticMap.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. import config from "@/api/config.js";
  2. import * as KMap from "@/utils/ol-map/KMap";
  3. import * as util from "@/common/ol_common.js";
  4. import Style from "ol/style/Style";
  5. import Icon from "ol/style/Icon";
  6. import VectorLayer from "ol/layer/Vector.js";
  7. import WKT from "ol/format/WKT.js";
  8. import { reactive } from "vue";
  9. import Point from "ol/geom/Point.js";
  10. import Feature from "ol/Feature";
  11. import { newPoint } from "@/utils/map.js";
  12. import { Fill, Text } from "ol/style";
  13. import { getArea } from "ol/sphere.js";
  14. import * as proj from "ol/proj";
  15. import proj4 from "proj4";
  16. import { register } from "ol/proj/proj4";
  17. import GeometryCollection from 'ol/geom/GeometryCollection.js';
  18. proj4.defs(
  19. "EPSG:38572",
  20. "+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. );
  22. register(proj4);
  23. export let mapData = reactive({
  24. isEdit: false,
  25. isEditArea: false,
  26. curPointData: {},
  27. point: null,
  28. selectPointArr: [],
  29. isPointHide: null,
  30. });
  31. function resetMapData(){
  32. mapData.isEdit= false
  33. mapData.isEditArea= false
  34. mapData.curPointData= {}
  35. mapData.point= null
  36. mapData.selectPointArr= []
  37. mapData.isPointHide= null
  38. }
  39. /**
  40. * @description 地图层对象
  41. */
  42. class AuthenticMap {
  43. constructor() {
  44. let that = this;
  45. let vectorStyle = new KMap.VectorStyle();
  46. this.vectorStyle = vectorStyle;
  47. // 位置图标
  48. this.clickPointLayer = new KMap.VectorLayer("clickPointLayer", 9999, {
  49. style: (f) => {
  50. const style1 = new Style({
  51. image: new Icon({
  52. src: require(`@/assets/images/map/${f.get("icon")}-icon.png`),
  53. scale: 0.45,
  54. }),
  55. });
  56. const style2 = new Style({
  57. text: new Text({
  58. font: "16px sans-serif",
  59. text: f.get("masterName"),
  60. offsetY: -40,
  61. padding: [4, 3, 2, 106],
  62. fill: new Fill({ color: "#fff" }), // 字体颜色
  63. }),
  64. });
  65. const style3 = new Style({
  66. image: new Icon({
  67. src: require(`@/assets/images/map/${f.get("iconBg")}.png`),
  68. scale: 0.45,
  69. displacement: [0, 90],
  70. }),
  71. });
  72. return [style1, style2, style3];
  73. },
  74. });
  75. this.locationLayer = new KMap.VectorLayer("locationLayer", 9999, {
  76. style: () => {
  77. return new Style({
  78. image: new Icon({
  79. src: require("@/assets/images/map/location.png"),
  80. scale: 0.45,
  81. }),
  82. });
  83. },
  84. });
  85. // 存储绘制的地块特征
  86. // this.drawnFeatures = [];
  87. }
  88. initMap(location, target) {
  89. let level = 16;
  90. let coordinate = util.wktCastGeom(location).getFirstCoordinate();
  91. this.kmap = new KMap.Map(
  92. target,
  93. level,
  94. coordinate[0],
  95. coordinate[1],
  96. null,
  97. 6,
  98. 22
  99. );
  100. this.kmap.initDraw((e) => {
  101. if (e.type === "drawend") {
  102. mapData.isEdit = true;
  103. mapData.point = e.feature;
  104. }
  105. });
  106. this.kmap.modifyDraw((e) => {
  107. mapData.isEditArea = false;
  108. mapData.isEditArea = true;
  109. });
  110. this.kmap.addLayer(this.clickPointLayer.layer);
  111. this.kmap.addLayer(this.locationLayer.layer);
  112. this.addMapSingerClick();
  113. }
  114. fit(geometriesWkt){
  115. let geometries = []
  116. let f = new WKT();
  117. for(let wkt of geometriesWkt){
  118. geometries.push(f.readGeometry(wkt))
  119. }
  120. let extent = new GeometryCollection(geometries).getExtent()
  121. this.kmap.fit(extent)
  122. }
  123. undoLastDraw() {
  124. const features = this.kmap.getLayerFeatures();
  125. features.forEach((feature) => {
  126. // console.log("feature", feature, mapData.point);
  127. const coord = feature.getGeometry().getCoordinates()[0];
  128. });
  129. // this.kmap.setFeatureCursor("move")
  130. // const lastFeature = this.drawnFeatures.pop();
  131. // if (lastFeature) {
  132. // // const features = this.kmap.getLayerFeatures();
  133. // console.log("this", this.kmap.polygonLayer.source);
  134. // this.kmap.polygonLayer.source.removeFeature(lastFeature);
  135. // // this.kmap.getLayers().getArray()[1].getSource().removeFeature(lastFeature);
  136. // }
  137. }
  138. // 取消地块
  139. cancelDraw() {
  140. this.kmap.polygonLayer.source.removeFeature(mapData.point);
  141. }
  142. // 添加点位
  143. addPoint(points) {
  144. const arrPoints = [];
  145. if (points && points.length > 0) {
  146. points.forEach((item) => {
  147. let f = newPoint({ ...item, icon: "point", iconBg: "name-bg" }, "point");
  148. arrPoints.push(f);
  149. });
  150. this.clickPointLayer.source.addFeatures(arrPoints);
  151. }
  152. }
  153. // 设置地图中心点位
  154. setMapCenter(v) {
  155. let arrayOfNumbers = [];
  156. const arrayOfStrings = v.split(",");
  157. arrayOfNumbers = [arrayOfStrings[1], arrayOfStrings[0]];
  158. this.kmap.map.getView().setCenter(arrayOfNumbers);
  159. this.locationLayer.source.clear();
  160. let point = new Feature(new Point(arrayOfNumbers));
  161. this.locationLayer.addFeature(point);
  162. }
  163. // 开始勾画
  164. startDraw() {
  165. this.kmap.setDefaultCursor("crosshair");
  166. this.kmap.startDraw();
  167. this.kmap.endModify();
  168. }
  169. //结束勾画
  170. endDraw() {
  171. this.kmap.endDraw();
  172. this.kmap.endModify();
  173. }
  174. // 开始编辑
  175. startModify() {
  176. this.kmap.startModify();
  177. this.kmap.endDraw();
  178. mapData.point.set("icon", "point-act");
  179. }
  180. //结束编辑
  181. endModify() {
  182. this.kmap.endModify();
  183. }
  184. // 清空单个数据
  185. clearMapData(name, val, id) {
  186. name && (mapData[name] = val);
  187. resetMapData()
  188. this.clickPointLayer.source.forEachFeature((feature) => {
  189. if (feature.get("id") === id) {
  190. feature.set("icon", "point");
  191. feature.set("iconBg", "name-bg");
  192. }
  193. });
  194. const points = this.kmap.getLayerFeatures();
  195. points.forEach((feature) => {
  196. if (feature.get("id") === id) {
  197. feature.set("icon", "point");
  198. this.kmap.polygonStyle(feature);
  199. mapData.isPointHide = feature;
  200. }
  201. });
  202. mapData.selectPointArr = [];
  203. }
  204. //全选
  205. allSelect(ids){
  206. let arr = []
  207. this.clickPointLayer.source.forEachFeature((feature) => {
  208. if(!ids || ids.findIndex((id)=> id == feature.get('id')) > -1){
  209. feature.set("icon", "point-act");
  210. feature.set("iconBg", "name-act-bg");
  211. }
  212. });
  213. const points = this.kmap.getLayerFeatures();
  214. points.forEach((feature) => {
  215. if(!ids || ids.findIndex((id)=> id == feature.get('id')) > -1) {
  216. feature.set("icon", "point-act");
  217. this.kmap.polygonStyle(feature);
  218. mapData.isPointHide = feature;
  219. arr.push(feature)
  220. }
  221. });
  222. mapData.selectPointArr = arr;
  223. }
  224. //no全选
  225. allUnSelect(){
  226. this.clickPointLayer.source.forEachFeature((feature) => {
  227. feature.set("icon", "point");
  228. feature.set("iconBg", "name-bg");
  229. });
  230. const points = this.kmap.getLayerFeatures();
  231. points.forEach((feature) => {
  232. feature.set("icon", "point");
  233. this.kmap.polygonStyle(feature);
  234. mapData.isPointHide = feature;
  235. });
  236. mapData.selectPointArr = [];
  237. }
  238. // 地图点击事件
  239. addMapSingerClick() {
  240. let that = this;
  241. that.kmap.on("singleclick", (evt) => {
  242. let num = 0;
  243. that.kmap.map.forEachFeatureAtPixel(evt.pixel, function (feature, layer) {
  244. // 点击的图层是否是VectorLayer
  245. if (
  246. layer instanceof VectorLayer &&
  247. (layer.get("name") === "clickPointLayer" ||
  248. layer.get("name") === "defaultPolygonLayer")
  249. ) {
  250. // 每次点击,只走一遍该方法
  251. num = num + 1;
  252. if (num === 1) {
  253. that.getSelectPointArr(feature.get("id"));
  254. that.kmap.endDraw();
  255. }
  256. }
  257. });
  258. });
  259. }
  260. setPoint(name) {
  261. const arr = mapData.selectPointArr.filter(
  262. (item) => item.values_.icon === "point-act"
  263. );
  264. if (arr.length > 0) {
  265. mapData.point = arr[0];
  266. mapData.point.set("icon", name);
  267. mapData.isPointHide.set("icon", name);
  268. mapData.point.set("iconBg", "name-bg");
  269. }
  270. if (arr.length === 1) {
  271. mapData.selectPointArr = [];
  272. }
  273. }
  274. //添加地块
  275. setAreaGeometry(geometryArr) {
  276. let that = this;
  277. geometryArr.map((item) => {
  278. item.icon = "point";
  279. item.iconHide = "false";
  280. that.kmap.setLayerWkt(item.featureWkt, item);
  281. });
  282. }
  283. // 移除点的功能
  284. removePoint() {
  285. // console.log('getDefaultCursor',this.kmap.getDefaultCursor());
  286. // this.kmap.setDefaultCursor('text')
  287. // console.log('getDefaultCursor',this.kmap.getDefaultCursor());
  288. // var source = this.kmap.setDefaultCursor('move');
  289. // console.log('source',this.kmap);
  290. // var source = this.kmap.polygonLayer.source
  291. // console.log('mapData.curPointData',mapData.curPointData);
  292. // source.removeFeature(mapData.curPointData)
  293. // source.removeFeature(pointFeature);
  294. // this.kmap.endDraw1()
  295. }
  296. // 获取所有选中点位
  297. getSelectPointArr(id) {
  298. const arr = [];
  299. this.clickPointLayer.source.forEachFeature((feature) => {
  300. if (feature.get("id") === id) {
  301. // 修改当前点位高亮
  302. const icon = feature.get("icon") === "point" ? "point-act" : "point";
  303. const iconBg =
  304. feature.get("iconBg") === "name-bg" ? "name-act-bg" : "name-bg";
  305. feature.set("icon", icon);
  306. feature.set("iconBg", iconBg);
  307. mapData.point = feature;
  308. mapData.curPointData = feature.values_;
  309. }
  310. if (feature.get("icon") === "point-act") {
  311. arr.push(feature);
  312. }
  313. });
  314. const points = this.kmap.getLayerFeatures();
  315. points.forEach((feature) => {
  316. if (feature.get("id") === id) {
  317. const icon = feature.get("icon") === "point" ? "point-act" : "point";
  318. feature.set("icon", icon);
  319. this.kmap.polygonStyle(feature);
  320. mapData.isPointHide = feature;
  321. }
  322. });
  323. mapData.selectPointArr = arr;
  324. }
  325. hidePoint() {
  326. const feature = mapData.isPointHide;
  327. feature.set("iconHide", "true");
  328. this.kmap.polygonStyle(feature);
  329. }
  330. clearLayer() {
  331. this.clickPointLayer.source.clear();
  332. this.kmap.polygonLayer.source.clear();
  333. }
  334. addLayer() {
  335. this.kmap.addLayer(this.kmap.polygonLayer.layer);
  336. this.kmap.addLayer(this.clickPointLayer.layer);
  337. }
  338. //获取地块信息
  339. getAreaGeometry() {
  340. const features = this.kmap.getLayerFeatures();
  341. let geometryArr = [];
  342. let area = 0;
  343. // 获取图层上的Polygon,转成geoJson用于回显
  344. features.forEach((item) => {
  345. geometryArr.push({ featureWkt: new WKT().writeFeature(item) });
  346. let geom = item.getGeometry().clone();
  347. geom.transform(proj.get("EPSG:4326"), proj.get("EPSG:38572"));
  348. let areaItem = getArea(geom);
  349. area = (areaItem + areaItem / 2) / 1000;
  350. });
  351. return { geometryArr, area: area.toFixed(2) };
  352. }
  353. /**
  354. address
  355. farmName
  356. masterName
  357. masterTel
  358. speciesTypeName
  359. ""
  360. * @param form
  361. */
  362. search(form){
  363. const points = this.kmap.getLayerFeatures();
  364. let arr = []
  365. let geomWkt = []
  366. points.forEach((feature) => {
  367. let condition = []
  368. if(form.address != ''){
  369. condition.push(feature.get("address").includes(form.address))
  370. }
  371. if(form.farmName != ''){
  372. condition.push(feature.get("farmName").includes(form.farmName))
  373. }
  374. if(form.masterName != ''){
  375. const text = feature.get("masterName")
  376. if(text!==form.masterName) return
  377. condition.push(feature.get("masterName").includes(form.masterName))
  378. }
  379. if(form.masterTel != ''){
  380. const text = feature.get("masterTel")
  381. if(text!==form.masterTel) return
  382. condition.push(feature.get("masterTel").includes(form.masterTel))
  383. }
  384. if(form.speciesTypeName != ''){
  385. const text = feature.get("speciesTypeName")
  386. if(text!==form.speciesTypeName) return
  387. condition.push(feature.get("speciesTypeName").includes(form.speciesTypeName))
  388. }
  389. let b = false
  390. for(let item of condition){
  391. if(item){
  392. b = true
  393. }else{
  394. b = false
  395. break
  396. }
  397. }
  398. if(b){
  399. arr.push(feature.get("id"))
  400. geomWkt.push(new WKT().writeGeometry(feature.getGeometry()))
  401. }
  402. });
  403. this.allUnSelect()
  404. this.allSelect(arr)
  405. if(geomWkt.length>0){
  406. this.fit(geomWkt)
  407. }
  408. }
  409. }
  410. export default AuthenticMap;