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);
        }
相关推荐
杨超越luckly2 天前
ArcGISPro应用指南:ArcGISPro制图全流程详解
arcgis·信息可视化·gis·制图·arcgispro
~央千澈~3 天前
UniApp完全支持快应用QUICKAPP-以及如何采用 Uni 模式开发发行快应用优雅草卓伊凡
arcgis
敲敲敲-敲代码3 天前
【ArcGIS10.2】网络数据集构建---最短路径分析
网络·arcgis
人工智能教学实践3 天前
【基于Echarts的地图可视化】
arcgis
Cacciatore->4 天前
Electron 快速上手
javascript·arcgis·electron
南草徽13 天前
arcgis分割 (Split)
arcgis
野生工程师15 天前
【ArcGIS】在线影像底图调用
arcgis
装疯迷窍_A15 天前
ARCGIS国土超级工具集1.6更新说明
arcgis·插件·尖锐角·电子报盘·批量分割矢量
@菜菜_达16 天前
AgGrid学习笔记
笔记·学习·arcgis
德育处主任Pro16 天前
AntV G 入门教程
arcgis