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);
        }
相关推荐
新生GIS17 小时前
arcgis-提取范围中最大占比面积的信息或唯一值
arcgis
圆周率的后六位1 天前
GIS相关调研
arcgis·gis·supermap·gisbox·gis组件
tomelrg2 天前
多台服务器批量发布arcgisserver服务并缓存切片
服务器·python·arcgis
FL16238631293 天前
windows下ArcGIS 10.8.2下载安装教程
arcgis
allenjiao10 天前
Cesium粒子系统模拟风场动态效果
javascript·arcgis·gis·webgl·cesium·三维·风场
杨超越luckly11 天前
HTML应用指南:利用GET请求获取全国Apple Store 零售店位置信息
大数据·前端·arcgis·html·数据可视化·门店
典学长编程12 天前
前端开发(HTML,CSS,VUE,JS)从入门到精通!第八天(Vue框架及其安装)(完结篇) 重点 ! ! !
arcgis·vue·vue路由·vue脚手架·router
Wild Iris14 天前
【ArcGIS】分区统计中出现Null值且Nodata无法忽略的问题以及shp擦除(erase)的使用——以NDVI去水体为例
arcgis
新中地GIS开发老师16 天前
2025Mapbox零基础入门教程(14)定位功能
前端·javascript·arcgis·gis·mapbox·gis开发·地理信息科学
杨超越luckly20 天前
HTML应用指南:利用GET请求获取全国小米之家门店位置信息
前端·arcgis·html·数据可视化·shp