• ArcGIS for js 缓冲(vue项目)


    示例:

    一、页面布局

    1. <template>
    2. <div id="viewDiv">
    3. <div class="content">
    4. <el-button-group class="btnGroup">
    5. <el-button type="button" @click="toolClick('point')" title="缓冲点">缓冲点</el-button>
    6. <el-button type="button" @click="toolClick('polygon')" title="缓冲面">缓冲面</el-button>
    7. <el-button type="button" @click="toolClick('rectangle')" title="缓冲矩形">缓冲矩形</el-button>
    8. </el-button-group>
    9. </div>
    10. </div>
    11. </template>
    12. <script setup>
    13. ***
    14. ***
    15. </script>
    16. <style lang="less" scoped>
    17. .map ::v-deep .esri-view-surface.esri-view-surface--touch-none:focus::after {
    18. outline: none !important;
    19. }
    20. .map {
    21. width: 100%;
    22. /* height: 185vw; */
    23. position: absolute;
    24. top: 0;
    25. left: 0;
    26. right: 0;
    27. bottom: 0;
    28. }
    29. #viewDiv {
    30. padding: 0;
    31. margin: 0;
    32. height: 100vh;
    33. width: 100%;
    34. }
    35. .content{
    36. width:20%;
    37. left: 40%;
    38. right:40%;
    39. position: absolute;
    40. margin: 10;
    41. }
    42. </style>

    二、引入依赖
     

    1. import {onMounted, ref} from 'vue';
    2. import Map from "@arcgis/core/Map";
    3. import Color from "@arcgis/core/Color";
    4. import Graphic from "@arcgis/core/Graphic.js";
    5. import MapView from "@arcgis/core/views/MapView";
    6. import "@arcgis/core/assets/esri/themes/light/main.css";
    7. import WebTileLayer from "@arcgis/core/layers/WebTileLayer";
    8. import FeatureLayer from "@arcgis/core/layers/FeatureLayer.js";
    9. import Point from "@arcgis/core/geometry/Point.js";
    10. import SimpleFillSymbol from "@arcgis/core/symbols/SimpleFillSymbol";
    11. import SimpleLineSymbol from "@arcgis/core/symbols/SimpleLineSymbol";
    12. import * as geometryService from "@arcgis/core/rest/geometryService.js";
    13. import * as geometryEngine from "@arcgis/core/geometry/geometryEngine.js";
    14. import SketchViewModel from "@arcgis/core/widgets/Sketch/SketchViewModel.js";
    15. import GraphicsLayer from "@arcgis/core/layers/GraphicsLayer.js";
    16. import BufferParameters from "@arcgis/core/rest/support/BufferParameters.js";

    三、实现代码

    1. <script setup>
    2. ***
    3. ***
    4. let sketchViewModel = null;
    5. let graphicsLayer = null;
    6. let graphicsLayerId = "graphicsLayer";
    7. let engineGraphicGeometry = null;
    8. onMounted(()=>{
    9. view.container = "viewDiv";
    10. createGraphicsLayer();
    11. createSketchViewModel();
    12. bufferMethod();
    13. });
    14. function toolClick(type){
    15. switch(type){
    16. case "point":
    17. graphicsLayer.removeAll();//清除绘制图层
    18. // 绘制点
    19. sketchViewModel.create("point", { "mode": "click" });
    20. break;
    21. case "polygon":
    22. graphicsLayer.removeAll();//清除绘制图层
    23. // 绘制面
    24. sketchViewModel.create("polygon", { mode: "click" });
    25. break;
    26. case "rectangle":
    27. graphicsLayer.removeAll();//清除绘制图层
    28. // 绘制矩形
    29. sketchViewModel.create("rectangle", { mode: "click" });
    30. break;
    31. }
    32. }
    33. // 地图
    34. const dzLayer = new WebTileLayer({
    35. urlTemplate: "http://{subDomain}.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={col}&TILEROW={row}&TILEMATRIX={level}&tk=7b79e37115f10c512f76cdecda599902",
    36. subDomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7']
    37. });
    38. // 标注
    39. const dzbzLayer = new WebTileLayer({
    40. urlTemplate: "https://{subDomain}.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={col}&TILEROW={row}&TILEMATRIX={level}&tk=7b79e37115f10c512f76cdecda599902",
    41. subDomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7']
    42. });
    43. const featureLayer = new FeatureLayer({
    44. url:"http://116.141.0.114:48080/geoscene/rest/services/%E8%80%95%E4%BF%9D/%E5%8F%8C%E9%98%B3%E5%8C%BA%E5%9B%BE%E6%96%91/FeatureServer/0",
    45. outFields: ["*"], //加载所有要素字段
    46. opacity:0.5,//透明度
    47. //popupTemplate: TuCeng03TC, //加载模板,
    48. //definitionExpression: "",// 筛查
    49. // 渲染
    50. renderer: {
    51. type: "simple",
    52. symbol: {
    53. type: "simple-fill",//simple-line(线)、simple-fill(面)
    54. style: "solid",// solid 全部填充、cross十字交错、diamond菱形、square矩形、triangle三角形
    55. color: [255,20,60, 0.4],
    56. outline: {
    57. color: [255, 0, 0, 1],
    58. width: 2,
    59. },
    60. },
    61. }
    62. });
    63. const map = new Map({
    64. basemap: {
    65. baseLayers: [dzLayer,featureLayer],
    66. referenceLayers:[dzbzLayer]
    67. }
    68. });
    69. const view = new MapView({
    70. // 长春坐标系
    71. center:[125.331345,43.8328],
    72. // 初始层级
    73. zoom:10,
    74. //container:"viewDiv",
    75. map:map,
    76. constraints: {
    77. minZoom: 10,// 最小层级
    78. maxZoom: 19 // 最大层级
    79. }
    80. });
    81. // 创建绘制图层
    82. function createGraphicsLayer(){
    83. graphicsLayer = map.findLayerById(graphicsLayerId)
    84. if (graphicsLayer === null || graphicsLayer === undefined) {
    85. graphicsLayer = new GraphicsLayer({id: graphicsLayerId})
    86. map.add(graphicsLayer)
    87. }
    88. //清空上次绘制图形
    89. graphicsLayer.removeAll();
    90. }
    91. // 创建绘制图层模板
    92. function createSketchViewModel(){
    93. if (sketchViewModel == null || sketchViewModel == undefined) {
    94. sketchViewModel = new SketchViewModel({
    95. view: view,
    96. layer: graphicsLayer, //view不可编辑,map的可编辑
    97. });
    98. }
    99. }
    100. function bufferMethod(){
    101. sketchViewModel.on("create",function(event){
    102. if(event.state === "complete"){
    103. if(event.graphic.geometry.type == "point"){
    104. let point = new Point({
    105. x:event.graphic.geometry.x,
    106. y: event.graphic.geometry.y,
    107. spatialReference: event.graphic.geometry.spatialReference,
    108. });
    109. //
    110. const centerPoint = new Graphic({
    111. geometry: point,
    112. symbol:{
    113. type:"simple-marker",
    114. color:[255,0,0],
    115. outline:{
    116. color:[255,255,255],
    117. width:1
    118. },
    119. size:7
    120. }
    121. // 图片
    122. // symbol: {
    123. // type: "picture-marker",
    124. // url: new URL(icons, import.meta.url).href,
    125. // width: "40px",
    126. // height: "40px",
    127. // },
    128. });
    129. // 点添加到绘制图层
    130. graphicsLayer.add(centerPoint);
    131. // 点赋值给engineGraphicGeometry
    132. engineGraphicGeometry=centerPoint.geometry;
    133. }else if(event.graphic.geometry.type == "polygon" || event.graphic.geometry.type == "rectangle"){
    134. // 矩形
    135. let symbol = new SimpleFillSymbol({
    136. style: "solid",
    137. outline: new SimpleLineSymbol({
    138. style: "solid",
    139. color: new Color([255, 0, 0]),
    140. width: 2,
    141. }),
    142. color: new Color([255, 255, 0, 0.25]),
    143. });
    144. let handgraphic = new Graphic({
    145. geometry: event.graphic.geometry,
    146. symbol: symbol,
    147. });
    148. // 添加矩形
    149. graphicsLayer.add(handgraphic);
    150. // 矩形赋值给engineGraphicGeometry
    151. engineGraphicGeometry = handgraphic.geometry;
    152. }
    153. /*
    154. // 使用geometryService生成缓冲区
    155. const url = "https://utility.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer";
    156. //创建缓冲区参数
    157. let params = new BufferParameters({
    158. geometries: [event.graphic.geometry],
    159. distances: [10],
    160. unit: "kilometers",//meters-米;kilometers-千米",
    161. outSpatialReference: view.spatialReference,
    162. bufferSpatialReference:view.spatialReference,
    163. });
    164. geometryService.buffer(url,params).then(function(results){
    165. let symbol = new SimpleFillSymbol({
    166. style: "solid",
    167. outline: new SimpleLineSymbol({
    168. style: "solid",
    169. color: new Color([160, 219, 211, 0.8]),
    170. width: 1,
    171. }),
    172. color: new Color([217, 236, 219, 0.4]),
    173. });
    174. let graphic = new Graphic({
    175. geometry: results[0],
    176. symbol: symbol,
    177. });
    178. graphicsLayer.add(graphic);
    179. });
    180. */
    181. //使用geometryEngine生成缓冲区
    182. const buffer = geometryEngine.geodesicBuffer(engineGraphicGeometry,10,"kilometers");
    183. // 缓冲区样式
    184. let symbol = new SimpleFillSymbol({
    185. style: "solid",
    186. outline: new SimpleLineSymbol({
    187. style: "solid",
    188. color: new Color([160, 219, 211, 0.8]),
    189. width: 1,
    190. }),
    191. color: new Color([217, 236, 219, 0.4]),
    192. });
    193. // 缓冲图形
    194. const bufferLayer = new Graphic({
    195. geometry:buffer,
    196. symbol:symbol,
    197. });
    198. graphicsLayer.add(bufferLayer);
    199. }
    200. });
    201. }

  • 相关阅读:
    【k8s】【网络】网络连通性问题排查
    idea的插件这么赞,你竟不知道?
    充气膜结构的应用领域
    Python内置数据类型
    【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
    【Python】python入门,这一篇就够了
    链式队列(附带测试代码)
    机器学习中参数优化调试方法
    luffy项目之后台项目搭建、目录调整、封装日志、全局异常、Response、数据库连接
    行人属性识别二:添加新网络训练和自定义数据集训练
  • 原文地址:https://blog.csdn.net/qq_19688207/article/details/140955698