ArcGIS REST API提供了简单、开放的接口来访问和使用ArcGIS Server发布的服务。使用ArcGIS REST API通过URL可以获取和操作每一个服务中的所有资源和操作。

1、使用步骤

1)构建请求网址

  A、确定端点:每个GIS服务都有一个端点。例如,ArcGIS Server上Demographics文件夹下名为ESRI_Census_USA的一个地图服务sampleserver1.arcgisonline.com的端点为:http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer.

  B、确定操作:不同地理信息系统服务支持不同的操作。不同的操作会返回不同的结果。地图服务可以地图输出,点击查看,查找和生成KML。输出地图可以生成地图,同时可以点击产看是否给出地图服务图层的属性表。

  C、确定参数:不同的操作需要不同的参数。例如,如果请求地图图片,需要提供地图范围的四周角点坐标参数,也就是地图覆盖范围。

  D、确定输出格式:REST API支持很多输出格式,例如JSON,KMZ,图片和HTML。确定输出格式的重要参数是f。在URL请求的查询字符串后面加上”f=<你的格式>”来确定输出格式。例如:f=html返回的数据格式为html;f=json返回的数据格式为json;f=image返回的格式为image等等。

我们就以上面的4个步骤来构建自己需要的URL。一般来说,格式如下:

  http://{ArcGIS Server name}/ArcGIS/rest/services/{foldername}/{service name}/{service type}/{operation}?{{parameter1}={somevalues}&{parameter2}={some values}&…&{parameter}={some values}}

  可以看到,整个URL请求分为两个部分,第一部分是服务的端点和操作类型,也就是“?”前面的部分;第二部分是查询字符串,即请求参数,“?”后面的部分。

  2)发送请求到ArcGIS Server

  提交URL请求到ArcGIS Server Sending,可以不通过编程发送URL请求。例如,只需在网页浏览器的地址栏输入网址,如IE或Firefox。每种编程语言都用不同的提出请求方式。

  3)接受服务器的响应

  接受ArcGISServer的响应,ArcGIS Server处理请求并返回响应到客户端。对于一个同步的工作,客户端一直等待收到服务器的响应。对于一部工作,服务器发送一份工作编号来定期跟踪客户端的工作状态。

  4)解析服务器响应

  ArcGIS Server REST Web服务的响应可以是多种格式,例如JSON,KML,图片和HTML。客户端可判断响应时成功还是失败。如果失败了,客户端可以判断错误信息。如果响应是成功的,客户端可以解析响应所需的信息,并恰当地利用这些信息。

2、编程使用

代码以ArcGIS API for WPF为例,操作为addFeatures,这里只是add一个要素点,参考ArcGIS官方文档说明:http://sampleserver3.arcgisonline.com/ArcGIS/SDK/REST/index.html?fsadd.html

参考代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ESRI.ArcGIS.Client;
using ESRI.ArcGIS.Client.Geometry;
using ESRI.ArcGIS.Client.Tasks;
using System.Net;
using System.IO;namespace ArcGISDemo
{//自定义的Featureclass FeatureItem{public Geometry Geometry { set; get; }public IDictionary<string, object> Attributes { set; get; }};class Program{static bool AddFeature(string layerUrl, FeatureItem featureItem){string url = layerUrl+"/addFeatures";string data = "f=json"; //以json格式返回结果
ESRI.ArcGIS.Client.Graphic g = new ESRI.ArcGIS.Client.Graphic(){//Graphic的Attributes在ArcGIS API for WPF 中是只读的//如果是可写的,就可以直接使用Graphic的Attributes,而不需要拼接json//Attributes = featureItem.Attributes, Geometry = featureItem.Geometry};FeatureSet fs = new FeatureSet();fs.Features.Add(g);//使用FeatureSet自带的ToJson函数转换,可以帮助转换Feature的Geometry对象//ArcGIS的Geometry对象序列化为json字符串时和标准的json不太一样string json = fs.ToJson();int begin = json.IndexOf("[");int end = json.IndexOf("]", begin);string featuresJson = json.Substring(begin, end - begin + 1);string features = string.Format("&features={0}", featuresJson);data += features;//使用fastJson转换Attributes//fastJSON.JSON.Instance.Parameters.UseEscapedUnicode = false;//string attr = fastJSON.JSON.Instance.ToJSON(featureItem.Attributes);string attr = Newtonsoft.Json.JsonConvert.SerializeObject(featureItem.Attributes);//int attrPos = data.IndexOf("attributes");//将原来空的Attributes替换掉,以自己转换的json字符串实际情况为准string para = data.Replace("\"attributes\":{}","\"attributes\":"+attr);string res = PostData(url, para);//处理返回的结果if (res.Contains("error"))return false;Dictionary<string, List<Dictionary<string, object>>> resDic = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, List<Dictionary<string, object>>>>(res);if (resDic.ContainsKey("addResults")){List<Dictionary<string, object>> addRes = resDic["addResults"];foreach (Dictionary<string, object> dic in addRes){if (dic.ContainsKey("success")){if (dic["success"].ToString().ToLower() == "true")return true;else return false;}}}return false;}static string PostData(string url, string data){HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded";byte[] bs = Encoding.UTF8.GetBytes(data);Stream reqStream = request.GetRequestStream();reqStream.Write(bs, 0, bs.Length);reqStream.Close();string responseString = null;using (HttpWebResponse response = request.GetResponse() as HttpWebResponse){StreamReader reader = new StreamReader(response.GetResponseStream());responseString = reader.ReadToEnd();reader.Close();}return responseString;}static void Main(string[] args){string url = "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Fire/Sheep/FeatureServer/0";MapPoint point = new MapPoint(105, 30);FeatureItem fi = new FeatureItem();fi.Geometry = point;fi.Attributes = new Dictionary<string, object>();fi.Attributes.Add("description", "测试点");bool res = AddFeature(url, fi);if (res){Console.WriteLine("添加要素成功!");}else{Console.WriteLine("添加要素失败!");}Console.ReadKey();}}
}

代码只是简单的在一个图层上加了一个点,注意以下2点:

(1)确定参数的json格式
  ArcGIS API for WPF中FeatureSet有ToJson()可以把对象序列化json字符串,FromJson()将json字符串反序列化为一个对象,这里之所以使用FeatureSet的ToJson,然后拼接一个json字符串参数,是因为使用FeatureSet自带的ToJson函数可以帮助转换每个Feature的Geometry对象,如果全部使用Newtonsoft.Json来转换,得到的json字符串中Geometry对象和ArcGIS规定的格式不一样(对于Point是一样的,但是对于Multipoint Polyline等不一样),可以参考ArcGIS文档中对Geometry对象json格式的说明:http://sampleserver3.arcgisonline.com/ArcGIS/SDK/REST/index.html?fsadd.html

(2)解析响应结果
  对于{"addResults":[{"objectId":6,"globalId" : null,"success":true}]}这样的json字符串构造了一个Dictionary<string, List<Dictionary<string, object>>>复杂的对象来保存结果,如果是调用Query操作,返回的结果是一个FeatureSet,可以使用FeatureSet的FromJson来得到结果。

Newtonsoft.Json(Json.Net)下载:
http://json.codeplex.com/

参考:

1、基于 REST 的 Web 服务:基础
http://www.ibm.com/developerworks/cn/webservices/ws-restful/

2、ArcGIS客户端开发学习笔记(五)——ArcGIS REST API基础
http://www.cnblogs.com/carlbiao/archive/2010/09/09/1822419.html

3、Java中调用ArcGIS Server REST API
http://www.cnblogs.com/esrichina/archive/2013/02/01/2889224.html

C#调用ArcGIS REST服务相关推荐

  1. openlayes调用arcgis wms服务跨域问题(arcgis server10.2)

    在使用ol5调用arcgis wms服务使用canvas导处图片的时候会出现跨域问题. wms图层加载方式 new ol.layer.Image({ source: new ol.source.Ima ...

  2. Java调用arcgis导入shape,java for arcgis 之——将shapefile导入SDE

    环境:1.安装arcgis客户端(百度有) 2.在该路径下ArcGIS\Desktop10.2\java\lib 找到arcobject.jar  这是java对arcgis二次开发所需的jar包,添 ...

  3. geoserver发布arcgis瓦片服务,和503错误解决

    geoserver发布arcgis瓦片服务,根据网上教程经常报503错误,一般有两个原因,一个是网上长说的瓦片地址错误,第二个是geoserver集成的GeoWebCache缺少arcgis模块,需要 ...

  4. 发布和使用ArcGIS Server 服务之--地图服务(Mapserver)

    发布和使用 ArcGIS Server 服务之--地图服务(Mapserver) 1.什么是地图服务? 1.1地图服务的数据源和支持方式 1.2如何开始创建地图服务? 1.3为什么要使用地图服务 1. ...

  5. SOCKET是调用操作系统通信服务的一种机制

    有没有SOCKET,网卡都会接收数据.网卡工作在数据链路层,它只认识链路上邻近的点.它甚至不认识它隔壁的隔壁,它又怎么可能知道传输层的信息呢(起点与终点,是传输层的信息)?...传输层的信息,只能由传 ...

  6. 提交响应后无法调用sendredirect_微服务的那些事(三),微服务的远程调用方式。RPC和HTTP...

    2.远程调用方式 无论是微服务还是SOA,都面临着服务间的远程调用.那么服务间的远程调用方式有哪些呢? 常见的远程调用方式有以下几种: RPC:Remote Produce Call远程过程调用,类似 ...

  7. 内网环境下预览ArcGIS地图服务

    内网环境下预览ArcGIS地图服务 文章目录 内网环境下预览ArcGIS地图服务 1.背景 2.解决方案 2.1下载ArcGIS API for JavaScript 2.2本地部署ArcGIS AP ...

  8. 实现远程调用_微服务的那些事(三),微服务的远程调用方式。RPC和HTTP

    2.远程调用方式 无论是微服务还是SOA,都面临着服务间的远程调用.那么服务间的远程调用方式有哪些呢? 常见的远程调用方式有以下几种: RPC:Remote Produce Call远程过程调用,类似 ...

  9. JAVA与.NET的相互调用——通过Web服务实现相互调用

    JAVA与.NET是现今世界竞争激烈的两大开发媒体,两者语言有很多相似的地方.而在很多大型的开发项目里面,往往需要使用两种语言进行集成开发.而很多的开发人员都会偏向于其中一种语言,在使用集成开发的时候 ...

最新文章

  1. 卫星的性能和服务器比较,卫星通信的常用频段的详细对比
  2. Samba服务器搭建案例
  3. android toolbar 开发总结
  4. Oculus不准备出席E3了!这是要搞事情?
  5. java quartz2.1_quartz 2.1学习(一)
  6. api laravel 统一返回方法_Laravel-自定义API返回的JSON格式
  7. 使用MDT2012部署WindowsLinux操作系统(4)
  8. uniapp微信小程序地图中叠加polygon
  9. 科研第一步:怎样获得好的idea?!
  10. 实验四——反汇编工具的使用
  11. 外卖红包领取公众号简单搭建
  12. 甘教课标版小学生计算机课,测评:《第6课 制作简单的表格教案》小学信息技术甘教课标版五年级上册教案4696(2)...
  13. 下面关于在dos停止mysql_下面关于在DOS停止MySql的命令中,正确的是 (5.0分)_学小易找答案...
  14. 微信公众号素材下载之java
  15. 通过.git/info/exclude文件配置忽略文件
  16. 从零开始学C++之STL(七):剩下5种算法代码分析与使用示例(remove 、rotate 、sort、lower_bound、accumulate)
  17. 为什么无线AP标称的速率和实际速率不一致?(空口速率)
  18. No suspicious code found. 1 files processed in 'File '
  19. 前端AI语音方面的实现
  20. 几维安全:千锤百炼,锻造移动游戏安全防护黄金铠甲 1

热门文章

  1. es中的ResourceWatcherService
  2. UVa1346 - Songs(贪心算法)
  3. 通过自动回复机器人学Mybatis---加强版
  4. 两个onCreate方法?你真的了解onCreate()么?
  5. Solidworks如何创建投影曲线
  6. c#数据结构之集合的实现(数组及链表两种实现)
  7. CSDN的Markdown编辑器常用语句
  8. Google开源OCR项目Tesseract训练(自己训练的记录,未成功)
  9. 连连看+php,java基于swing实现的连连看代码
  10. kdj超卖_三分钟学会KDJ三大买卖绝技,简单高效,把握最佳买卖点,不懂KDJ的股民值得一看!...