Circle.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import Feature from 'ol/Feature'
  2. import Fill from 'ol/style/Fill'
  3. import Stroke from 'ol/style/Stroke'
  4. import Style from 'ol/style/Style'
  5. import * as olExtent from 'ol/extent'
  6. import * as proj from 'ol/proj'
  7. import OLCircle from 'ol/geom/Circle'
  8. import KBaseObject from './KBaseObject'
  9. import Common from './Common'
  10. /**
  11. * @description KMap.Circle 圆标记
  12. */
  13. class Circle extends KBaseObject{
  14. /**
  15. * @description KMap.Circle 构造函数
  16. * @param {JSON Object} lng 必填 param.lat 必填 param
  17. */
  18. /**
  19. * Creates an instance of Circle.
  20. * @param {number} lng 经度 必填
  21. * @param {number} lat 纬度 必填
  22. * @param {number} radius 圆半径 必填
  23. * @param {JSON} param param.storkeWidth圆外线宽度 选填;
  24. * param.strokeColor圆外线颜色 选填;
  25. * param.background 圆背景颜色 选填。
  26. * @param {KMap.Map} [mapInstance=null] map对象,单地图的时候可不传,多地图时候需要传
  27. * @memberof Circle
  28. */
  29. constructor(lng,lat,radius,param,mapInstance = null){
  30. super(mapInstance)
  31. const vm = this
  32. Common.checkLngLat(lng,lat)
  33. vm.lng = lng
  34. vm.lat = lat
  35. vm.radius = radius
  36. //创建默认圆标记图层
  37. vm.source = vm.mapInstance.polygonLayer.getSource()
  38. //构造函数和对象参数
  39. vm.style = vm.initStyle(param)
  40. vm.circle = vm.initFeature()
  41. vm.circle.setStyle(vm.style)
  42. vm.source.addFeature(vm.circle)
  43. }
  44. /**
  45. * @description 初始化圆样式 供内部使用
  46. * @param {JSON} param param.storkeWidth圆外线宽度 选填;
  47. * param.strokeColor圆外线颜色 选填;
  48. * param.background 圆背景颜色 选填。
  49. * @return {Style}
  50. * @memberof Circle
  51. */
  52. initStyle(param){
  53. const vm = this
  54. let background = (param != undefined && param.background != undefined )? param.background : "rgba(255,0,0,.5)"
  55. let strokeWidth = (param != undefined && param.strokeWidth != undefined )? param.strokeWidth : 1
  56. let strokeColor = (param != undefined && param.strokeColor != undefined )? param.strokeColor : "rgba(255,0,0,0)"
  57. let style = new Style({
  58. fill: new Fill({ //矢量图层填充颜色,以及透明度
  59. color: background
  60. }),
  61. stroke: new Stroke({ //边界样式
  62. color: strokeColor,
  63. width: strokeWidth
  64. })
  65. })
  66. return style
  67. }
  68. /**
  69. * @description 初始化Feature 内部函数
  70. * @return {Feature}
  71. * @memberof Circle
  72. */
  73. initFeature(){
  74. const vm = this
  75. vm.center = proj.fromLonLat([vm.lng,vm.lat])
  76. var circle = new OLCircle(vm.center, vm.radius,'XY')
  77. let feature = new Feature({
  78. geometry: circle
  79. })
  80. return feature
  81. }
  82. /**
  83. * @description 修改半径
  84. * @param {number} newRadius 新的半径值
  85. * @memberof Circle
  86. */
  87. setRadius(newRadius) {
  88. const vm = this
  89. vm.radius = newRadius
  90. vm.circle.getGeometry().setRadius(newRadius)
  91. }
  92. /**
  93. * @description 显示圆标记
  94. * @memberof Circle
  95. */
  96. show() {
  97. const vm = this
  98. if(!vm.source.hasFeature(vm.circle)){
  99. vm.source.addFeature(vm.circle)
  100. }
  101. }
  102. /**
  103. * @description 隐藏圆标记
  104. * @memberof Circle
  105. */
  106. hide() {
  107. const vm = this
  108. if(vm.source.hasFeature(vm.circle)){
  109. vm.source.removeFeature(vm.circle)
  110. }
  111. }
  112. /**
  113. * @description 删除圆标记
  114. * @memberof Circle
  115. */
  116. remove() {
  117. const vm = this
  118. if(vm.source.hasFeature(vm.circle)){
  119. vm.source.removeFeature(vm.circle)
  120. }
  121. }
  122. /**
  123. * 地图视角缩放到圆标记范围
  124. * @param duration 动画持续时间(单位:毫秒) 选填,默认0毫秒
  125. */
  126. zoomToExtent(duration) {
  127. const vm = this
  128. duration = (duration)? duration : 0
  129. let extentBound = vm.circle.getGeometry().extent_
  130. vm.map.getView().fit(extentBound,{
  131. duration: duration
  132. })
  133. }
  134. }
  135. export default Circle