1. 程式人生 > >ArcGIS API for Javascript4.8 路徑網路分析、最短路徑查詢

ArcGIS API for Javascript4.8 路徑網路分析、最短路徑查詢

程式碼是在官方demo上修改來的,官方的demo是需要裝置代理伺服器,才能顯示效果的,這裡我直接設定了ArcGIS Server允許跨域,所以不需要設定代理。

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8"/>
    <title>ArcGIS demo</title>
    <link type="text/css" rel="stylesheet" href="http://localhost/arcgis_js_api/library/4.8/esri/css/main.css"/>
    <script src="http://localhost/arcgis_js_api/library/4.8/init.js"></script>

    <style>
        html,
        body,
        #viewDiv {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
        }
    </style>
</head>

<body>
<div id="viewDiv"></div>
<script>
    require(["esri/Map",
        "esri/config",
        "esri/views/MapView",
        "esri/layers/MapImageLayer",
        "esri/geometry/Extent",
        "esri/Graphic",
        "esri/layers/GraphicsLayer",
        "esri/tasks/RouteTask",
        "esri/tasks/support/RouteParameters",
        "esri/tasks/support/FeatureSet",
        "dojo/on",
        "dojo/domReady"
    ], function (Map,
                 esriConfig,
                 MapView,
                 MapImageLayer,
                 Extent,
                 Graphic,
                 GraphicsLayer,
                 RouteTask,
                 RouteParameters,
                 FeatureSet,
                 on
    ) {
        esriConfig.request.corsEnabledServers.push("localhost:6080");//設定地圖伺服器已允許跨域
        var routeLayer = new GraphicsLayer();
        //layer為原始路網資料層,可以不新增
        var layer=new MapImageLayer({
            url:"http://localhost:6080/arcgis/rest/services/route/MapServer"
        });
        var map = new Map({
           basemap: "streets",
            layers:[layer,routeLayer]
        });
        //起始點樣式
        var stopSymbol = {
            type: "simple-marker", // autocasts as new SimpleMarkerSymbol()
            style: "cross",
            size: 15,
            outline: { // autocasts as new SimpleLineSymbol()
                width: 4
            }
        };
        //返回路線樣式
        var routeSymbol = {
            type: "simple-line", // autocasts as SimpleLineSymbol()
            color: [0, 0, 255, 0.5],
            width: 5
        };
        //查詢引數
        var routeParams = new RouteParameters({

            stops: new FeatureSet(),//停靠點
            // barriers:new FeatureSet(),//可通過此屬性設定障礙點
            outSpatialReference: { // 輸出投影
                wkid: 3857
            }
        });
        //ArcGIS Server NA服務地址,NAServer/後為NAServer裡的圖層名稱,不支援中文,建議在釋出服務前改掉
        var routeTask = new RouteTask({
            url: "http://localhost:6080/arcgis/rest/services/routeService/NAServer/path"
        });
        // 二維檢視
        var view = new MapView({
            map: map,
            container: "viewDiv"
        });

        view.ui.remove("attribution");//移除底部ESRI logo
        //初始化位置
        view.when(function () {
            view.extent = new Extent({
                xmin: 9170813.75677811,
                ymin: 5213570.648163019,
                xmax: 1.521319180644298E7,
                ymax: 8073715.481906304,
                spatialReference: {
                    wkid: 3857
                }
            })
        });
        //點選地圖新增停靠點
        on(view, "click", addStop);
        function addStop(event) {
            // 將停靠點新增在地圖上
            var stop = new Graphic({
                geometry: event.mapPoint,
                symbol: stopSymbol
            });
            routeLayer.add(stop);

            // 將點選點加入到計算引數中,超過兩個點則開始計算路線
            routeParams.stops.features.push(stop);
            if (routeParams.stops.features.length >= 2) {
                // 進行查詢
                routeTask.solve(routeParams).then(showRoute,logError);
            }
        }
        //輸出查詢的結果
        function showRoute(data) {
            var routeResult = data.routeResults[0].route;
            routeResult.symbol = routeSymbol;
            routeLayer.add(routeResult);
        }
        //輸出查詢錯誤資訊
        function logError(error) {
            console.error(error);
        }
    })
</script>
</body>

</html>