ArcGIS Server 动态地图服务Query 请求问题小结

在ArcGIS Server中对于MapServer查询可调用rest服务接口执行,但是又可以分为以下几种可能:

测试类型

可以在服务器Query功能后台进行测试:
在这里插入图片描述
其他参数可自行填写,可测试GET及POST请求:
在这里插入图片描述
在这里插入图片描述
参数注意JSON格式等的正确性,在后台此界面可以验证服务的可用性及查询参数的正确性。

JS发送请求

1. GET请求
  • 通用URL方式发送Get请求
    请求格式中有些格式需要转义,例如‘’ 、 [ ]等符号,具体可以参考官网示例,或在上面说的query面板中查看GET请求成功的URL具体格式。

例如:

http://IP:6080/arcgis/rest/services/xxx/xxx/MapServer/0/query?where=&text=&objectIds=&time=&geometry=%7B%27rings%27%3A%5B%5B%5B103.526673%2C31.460492%2C0%5D%2C%5B103.434909%2C31.459358%2C0%5D%2C%5B103.474442%2C31.521872%2C0%5D%2C%5B103.526673%2C31.460492%2C0%5D%5D%5D%7D&geometryType=esriGeometryPolygon&inSR=&spatialRel=esriSpatialRelIntersects&distance=&units=esriSRUnit_Meter&relationParam=&outFields=&returnGeometry=true&returnTrueCurves=false&maxAllowableOffset=&geometryPrecision=&outSR=&havingClause=&returnIdsOnly=false&returnCountOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&gdbVersion=&historicMoment=&returnDistinctValues=false&resultOffset=&resultRecordCount=&returnExtentOnly=false&datumTransformation=&parameterValues=&rangeValues=&quantizationParameters=&featureEncoding=esriDefault&f=pjson
  • 使用ArcGIS API发送请求
    使用API中的query接口实现,代码参考:
<html>
  <head>
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="initial-scale=1,maximum-scale=1,user-scalable=no"
    />
    <title>
      Intro to ImageryLayer | Sample | ArcGIS API for JavaScript 4.23
    </title>

    <link
      rel="stylesheet"
      href="https://js.arcgis.com/4.23/esri/themes/light/main.css"
    />
    <script src="https://js.arcgis.com/4.23/"></script>

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

    <script>
      require(["esri/Map", "esri/views/MapView", 
      "esri/rest/query", "esri/rest/query/executeQueryJSON",
      "esri/layers/ImageryLayer"], (
        Map,
        MapView,
        query, executeQueryJSON,
        ImageryLayer
      ) => {

         // url to the layer of interest to query
        let queryUrl = "http://IP:6080/arcgis/rest/services/xxx/xxx/MapServer/0";

        // create the Query object
        query.where = "1=1";
        query.outSpatialReference = { wkid:4326 };
        query.outFields = '*';
        query.spatialRel = 'esriSpatialRelIntersects';
        query.geometryType = 'esriGeometryPolygon';
        query.inSR = 4326;
        query.outSR = 4326;
        query.returnGeometry = true;

        query.geometry = {
            type: "polygon",
            rings: [[
                [x,y,z],
                [x,y,z],
                [x,y,z],
                [x,y,z]]
            ]
        };

        /********************
         * Create image layer
         ********************/

        const layer = new ImageryLayer({
          url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/NLCDLandCover2001/ImageServer",
          format: "jpgpng" // server exports in either jpg or png format
        });

        /**************************
         * Add image layer to map
         *************************/

        const map = new Map({
          basemap: "gray-vector",
          layers: [layer]
        });

        const view = new MapView({
          container: "viewDiv",
          map: map,
          center: [103.6, 31.5],
          zoom: 4
        });

        // call the executeQueryJSON() method
        const symbol = {
              type: 'simple-fill',
              color: [255, 0, 0, 0.9],
              style: 'solid',
              outline: {
                color: '#1bbbb4',
                width: 2,
              },
            };
        
        executeQueryJSON.executeQueryJSON(queryUrl, query).then(function(results){
        // results.graphics contains the graphics returned from query
            console.log(results)
            view.graphics.add(results.features[0]); //array view.graphics.addMany(results.features);
            results.features[0].symbol=symbol;    //
            view.goTo(results.features);
        })
        
      });
    </script>
  </head>

  <body>
    <div id="viewDiv"></div>
  </body>
</html>
  1. POST 请求发送请求
    如果多边形查询面的节点数目过多,GET方式查询可能会受限,需要使用POST方式。
  • 通用URL方式发送POST请求
    这里发送的参数不能再写JSON格式发送,在后台可视化界面测试也可发现,POST请求需以FormData表单形式发送数据。
    在这里插入图片描述代码可参考测试代码:

<html>
  <head>
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="initial-scale=1,maximum-scale=1,user-scalable=no"
    />
    <title>
      Intro to ImageryLayer | Sample | ArcGIS API for JavaScript 4.23
    </title>
    <script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>

    <style>
      html,
      body,
      #viewDiv {
        padding: 0;
        margin: 0;
        height: 100%;
        width: 100%;
      }
    </style>
        
    <script>
        let url = 'http://IP:6080/arcgis/rest/services/XXX/XXX/MapServer/0/query'

        let data = {};
        data.where = "";
        data.geometry = "{'rings' : [[[103.526673,31.460492,0],[103.434909,31.459358,0],[103.474442,31.521872,0],[103.526673,31.460492,0]]]}";
        data.geometryType = "esriGeometryPolygon";
        data.spatialRel = "esriSpatialRelIntersects";
        data.units = "esriSRUnit_Meter";
        data.returnGeometry = true;
        data.f = "pjson";
        data.outFields = "*";
        console.log(data);
        $(document).ready(function(){
        $.ajax({
           type:'post',
           url:url,
           async:false, 
           dataType:'jsonp',
           contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
           data:data,
           success:function(resData){
             let tmpData=resData;
             alert("请求数据成功");
             console.log(tmpData);
           },
           error:function (jqXHR, textStatus, errorThrown) {
              console.log("连接数据的时候出现了:"+textStatus);
            }
 
        })
    })
    </script>
  </head>

  <body>
    <div id="viewDiv"></div>
  </body>
</html>

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙同学的一个笔记本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值