ArcGIS中离线发布路径分析服务,并实现小车根据路径进行运动

ArcGIS中离线发布路径分析服务,您可以按照以下步骤操作:

  1. 准备ArcMap项目

    • 打开ArcMap并加载包含网络分析图层的项目。
    • 在ArcMap中,使用 Network Analyst Toolbar 或 Catalog 创建网络数据集(Network Dataset)。
  2. 导出数据

    • 导出网络数据集以及与路径分析相关的任何其他数据,例如点、线等。
    • 在ArcMap中,右键单击要导出的数据集,选择“数据”>“导出数据”以将其导出到本地文件夹中。
  3. 打包数据为文件地理数据库

    • 将导出的数据集和任何相关数据打包到文件地理数据库中。
    • 在ArcMap中,使用工具 “Create File GDB” 来创建文件地理数据库,并将数据导入其中。
  4. 创建路径分析服务

    • 打开ArcGIS Server Manager,并登录以管理您的服务器。
    • 在服务器管理界面中,选择“发布服务”并选择“新建服务”。
    • 选择好服务类型,通常为 Network Analysis service,并上传您准备好的文件地理数据库。
    • 配置服务的属性,如服务名称、描述、访问权限等。
  5. 发布服务

    • 提交发布任务后,等待服务发布成功。一旦发布成功,您就可以在浏览器中访问该服务的 REST 终端,并在 ArcGIS Online 或 ArcGIS Pro 中使用该服务进行路径分析。
  6. 离线访问

    • 离线访问可以通过在网络不可用时使用本地 REST 终端进行。确保您的网络分析服务已配置为允许离线访问,并相应地操作。
         // 小车旋转角度
            let radian = Cesium.Math.toRadians(3.0);
            // 小车的速度
            let speed = 0.9;
            // 速度矢量
            let speedVector = new Cesium.Cartesian3();
            let scene = viewer.scene;
            // 起始位置
            let position = Cesium.Cartesian3.fromDegrees(108.92719, 34.25243,1.5);
      
            // 用于设置小车方向
            let hpRoll = new Cesium.HeadingPitchRoll();
            let fixedFrameTransforms =  Cesium.Transforms.localFrameToFixedFrameGenerator('north', 'west');
            // 添加小车模型
            let carPrimitive = scene.primitives.add(Cesium.Model.fromGltf({
              url: './/Apps//SampleData//image2d//小车.glb',
              modelMatrix: Cesium.Transforms.headingPitchRollToFixedFrame(position, hpRoll, Cesium.Ellipsoid.WGS84, fixedFrameTransforms),
              scale: 2.1, // 模型的缩放比例
              minimumPixelSize: 15, // 模型的最小像素大小
              maximumScale: 300, // 模型的最大缩放比例
              runAnimations: true, // 是否运行动画
              clampAnimations: true, // 是否限制动画
              show: true // 是否显示模型
            }));
            // 小车状态标志
            let flag = {
              moveUp:false,
              moveDown:false,
              moveLeft:false,
              moveRight:false
            };
      
            // 根据键盘按键返回标志
          function setFlagStatus(key,value) {
            switch (key.keyCode){
              case 37:
                // 左
                flag.moveLeft = value;
                break;
              case 38:
                // 上
                flag.moveUp = value;
                break;
              case 39:
                // 右
                flag.moveRight = value;
                break;
              case 40:
                flag.moveDown = value;
                // 下
                break;
            }
          }
      
            document.addEventListener('keydown',(e)=>{
              setFlagStatus(e, true);
            });
      
            document.addEventListener('keyup',(e)=>{
              setFlagStatus(e, false);
            });
            // 对帧添加监听事件
            viewer.clock.onTick.addEventListener((clock)=>{
      
              if(flag.moveUp){
      
                if(flag.moveLeft){
                  hpRoll.heading -= radian;
                }
      
                if(flag.moveRight){
                  hpRoll.heading += radian;
                }
                moveCar(true);
              }
      
              if(flag.moveDown){
                if(flag.moveLeft){
                  hpRoll.heading -= radian;
                }
      
                if(flag.moveRight){
                  hpRoll.heading += radian;
                }
                moveCar(false);
              }
      
            });
      
            var particleSystem = viewer.scene.primitives.add(new Cesium.ParticleSystem({
      
              image : './/Apps//SampleData//image2d//smoke.png',
              imageSize : new Cesium.Cartesian2(20, 20),
              startScale : 1.0,
              endScale : 4.0,
              // Particle behavior
              particleLife : 1.0,
              speed : 5.0,
              // Emitter parameters
              emitter : new Cesium.CircleEmitter(0.5),
              emissionRate : 5.0,
              modelMatrix : entity.computeModelMatrix(viewer.clock.startTime, new Cesium.Matrix4()),
              lifetime : 16.0
            }));
            // 移动小车
          function moveCar(isUP) {
            // 计算速度矩阵
            if(isUP>0){
              speedVector = Cesium.Cartesian3.multiplyByScalar(Cesium.Cartesian3.UNIT_X,speed,speedVector);
            }else{
              speedVector = Cesium.Cartesian3.multiplyByScalar(Cesium.Cartesian3.UNIT_X,-speed,speedVector);
            }
            // 根据速度计算出下一个位置的坐标
            position = Cesium.Matrix4.multiplyByPoint(carPrimitive.modelMatrix ,speedVector, position);
            // 小车移动
            Cesium.Transforms.headingPitchRollToFixedFrame(position, hpRoll, Cesium.Ellipsoid.WGS84, fixedFrameTransforms, carPrimitive.modelMatrix);
      
            // 添加尾气效果
            particleSystem.modelMatrix = Cesium.Matrix4.fromTranslation(position);
          }

    • let _routeAnalysisResouce = null;
      let _screenSpaceEventHandler=null; 
       /**
         * 路径分析  arcgis 实现
         */
        openRouteAnalysis() {
          map.viewer.dataSources.add(_routeAnalysisResouce);
          loadModules([
            "esri/Graphic",
            "esri/tasks/RouteTask",
            "esri/tasks/support/RouteParameters",
            "esri/tasks/support/FeatureSet",
            "esri/geometry/Point",
            "esri/geometry/support/webMercatorUtils",
            "esri/geometry/SpatialReference"
          ], {
            css: true
          }).then(([Graphic, RouteTask, RouteParameters, FeatureSet, Point, webMercatorUtils, SpatialReference]) => {
            let routeTask = new RouteTask({
              url: "http://127.0.0.1:8888/arcgis/rest/services/jm/road/NAServer/Route"/离线路径分析服务
            });
      
            let routeParams = new RouteParameters({
              stops: new FeatureSet(),
              outSpatialReference: {
                wkid: 3857
              }
            });
            _screenSpaceEventHandler=new Cesium.ScreenSpaceEventHandler(map.viewer.scene.canvas);
            _screenSpaceEventHandler.setInputAction(addStop, Cesium.ScreenSpaceEventType.LEFT_DOWN);
      
            function addStop(event) {
              let cartesian3 = map.viewer.scene.pickPosition(event.position);
      
              let latlon = cartesian3ToVertice(cartesian3);
              let xy = webMercatorUtils.lngLatToXY(latlon.longitude, latlon.latitude);
              let point = new Point(xy[0], xy[1], new SpatialReference({
                wkid: 3857
              }));
              var stop = new Graphic({
                geometry: point
              });
              routeParams.stops.features.push(stop);
      
              let imgUrl = "";
              if (routeParams.stops.features.length == 1) {
                imgUrl = "../../../static/svg/startSite.svg";
              }else if (routeParams.stops.features.length == 2) {
                imgUrl = "../../../static/svg/endSite.svg";
              }
              _routeAnalysisResouce.entities.add({
                position: new Cesium.Cartesian3.fromDegrees(latlon.longitude, latlon.latitude,5),
                billboard: {
                  image: imgUrl,
                  scale: 0.2
                }
              });
              if (routeParams.stops.features.length >= 2) {
                routeTask.solve(routeParams).then(showRoute, () => {
                  routeParams.stops.features = [];
                });
      
              }
            }
      
            function showRoute(data) {
              routeParams.stops.features = [];
              let route = data.routeResults[0].route;
              let linePoints = route.geometry.paths[0];
              let ps = xyToLngLats(linePoints);
              console.log("ps", ps);
              _routeAnalysisResouce.entities.add({
                polyline: {
                  positions: ps,
                  width: 5.0,
                  material: new Cesium.Color(0, 1, 1),
                  clampToGround:true
                }
              });
            }
      
            function xyToLngLats(points) {
              let returns = [];
              points.map(p => {
                let lnglat = webMercatorUtils.xyToLngLat(p[0], p[1]);
                returns.push(Cesium.Cartesian3.fromDegrees(lnglat[0], lnglat[1], 0));
              });
              return returns;
            }
          });
        }
        /**
         * 关闭路径分析
         */
        closeRouteAnalysis() {
          _routeAnalysisResouce.entities.removeAll();
          _screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN);
        }

相关推荐

  1. 根据PID查看进程执行路径

    2024-05-25 22:22:40       21 阅读
  2. Linux根据进程ID查看进程的文件路径

    2024-05-25 22:22:40       39 阅读
  3. 如何在Ingress进行路径重写

    2024-05-25 22:22:40       65 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-25 22:22:40       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-25 22:22:40       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-25 22:22:40       87 阅读
  4. Python语言-面向对象

    2024-05-25 22:22:40       96 阅读

热门阅读

  1. 如何识别和使用GRS证书

    2024-05-25 22:22:40       36 阅读
  2. 需求分析简介

    2024-05-25 22:22:40       31 阅读
  3. pod 库发布脚本

    2024-05-25 22:22:40       37 阅读
  4. github下载代码

    2024-05-25 22:22:40       21 阅读
  5. Flink 部署执行模式

    2024-05-25 22:22:40       27 阅读
  6. 华为UPS关机软件NetShutdown Ubuntu 开机自启动

    2024-05-25 22:22:40       31 阅读
  7. Django的model中的Manager对象

    2024-05-25 22:22:40       33 阅读
  8. Kubernetes 之 Pod 容忍度与节点污点

    2024-05-25 22:22:40       32 阅读
  9. clickhouse生产运维以及调优

    2024-05-25 22:22:40       29 阅读
  10. Android Studio 问题集锦

    2024-05-25 22:22:40       38 阅读