C#调用ArcGIS REST服务

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
{
    //自定义的Feature
    class 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

 

 

作者:阿凡卢

出处:http://www.cnblogs.com/luxiaoxun/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

http://www.cnblogs.com/luxiaoxun/p/3364107.html

时间: 2024-09-22 11:37:22

C#调用ArcGIS REST服务的相关文章

arcgis ser...-arcgis api for javascript调用arcgis server服务

问题描述 arcgis api for javascript调用arcgis server服务 本地部署3.9版本.有时候例子页面的地图也不出来.调用也没实现.谁弄给看看.qq1279134579 解决方案 今天尝试在Linux环境下安装ArcGIS Server10.2,启动服务碰到一个错误:ERROR: Unable to start Xvfb on any port in the range 6600 - 6619.具体环境:Linux:Redhat 6.4 64BitArcGIS Ser

用AJAX调用SOAP Web服务:构建Web服务客户机

ajax|web|web服务|客户机 [导读]本文介绍如何使用异步 JavaScript 和 XML (Asynchronous JavaScript and XML, AJAX) 设计模式来实现基于 Web 浏览器的 SOAP Web 服务客户机. AJAX 已普遍用于许多知名的 Web 应用程序服务,例如 GMail.Google Maps.Flickr 和 Odeo.com.通过使用异步 XML 消息传递,AJAX 为 Web 开发人员提供了一种扩展其 Web 应用程序价值和功能的途径.这

用AJAX调用SOAP Web服务:构建Web服务客户机(1)

ajax|web|web服务|客户机 本文介绍如何使用异步 JavaScript 和 XML (Asynchronous JavaScript and XML, AJAX) 设计模式来实现基于 Web 浏览器的 SOAP Web 服务客户机. AJAX 已普遍用于许多知名的 Web 应用程序服务,例如 GMail.Google Maps.Flickr 和 Odeo.com.通过使用异步 XML 消息传递,AJAX 为 Web 开发人员提供了一种扩展其 Web 应用程序价值和功能的途径.这里介绍的

用AJAX调用SOAP Web服务:构建Web服务客户机(3)

ajax|web|web服务|客户机 一个简单示例 我已经提供了一个示例项目来阐释 Web Services JavaScript Library 的基本功能.该演示所使用的 Web 服务(如清单 10 所示)已经在 WebSphere Application Server 中进行了实现,并提供了简单的 Hello World 功能. 清单 10. 一个简单的基于 Java 的"Hello World"Web 服务 package example; public class Hello

问问大神们,对于Arcgis 的服务添加一个浮动的柱状图

问题描述 问问大神们,对于Arcgis 的服务添加一个浮动的柱状图 我是在前端引进来一个arcgis服务,我打算做一个地图各个区域的数据的对比,所以在每个区域都要出现一个柱状图,一开始我想自定义inforwindows做一个效果放进去,可以inforindows只能同时显示一个,而且,也不会直接触发inforwindows(真小白,勿怪),之后打算用append div的形式填进去,可以不知道怎么处理才可以让每个柱状图放到每个区域对应的位置,怎么设定div的位置求助各位大神.

接口-RMI远程调用,一服务端和客户端一定要在一个工程里么

问题描述 RMI远程调用,一服务端和客户端一定要在一个工程里么 小弟初学RMI的知识,网上说的也不明白,我自己做了一个helloword测试,我不太明白的是 ,服务端和客户端一定要在一个工程下么?如果一定在一个工程下,那还算什么远程调用啊? 可是我在服务端有一个接口:IHello,成功绑定到8888端口之后,我新建客户端工程,在 IHello iHello = Naming.lookup("rmi://localhost:8888/IHello"); 在写这句话的时候,MyEclips

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

JAVA与.NET是现今世界竞争激烈的两大开发媒体,两者语言有很多相似的地方.而在很多大型的开发项目里面,往往需要使用两种语言进行集成开发.而很多的开发人员都会偏向于其中一种语言,在使用集成开发的时候对另一种语言感觉到畏惧.在这里在下向各位介绍一下,JAVA与.NET相互调用的例子.下面的介绍主要包括三方面:一是通过常用Web服务进行相互调用,二是使用TCP/IP套接字进行相互调用,三是使用Remote实现远程对象相互调用. 在这章里面先为大家介绍一下最简单,最常用的Web服务相互调用方式.首先

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

JAVA与.NET是现今世界竞争激烈的两大开发媒体,两者语言有很多相似的地方.而在很多大型的开发项目里面,往往需要使用两种语言进行集成开发.而很多的开发人员都会偏向于其中一种语言,在使用集成开发的时候对另一种语言感觉到畏惧.在这里在下向各位介绍一下,JAVA与.NET相互调用的例子.下面的介绍主要包括三方面:一是通过常用Web服务进行相互调用,二是使用TCP/IP套接字进行相互调用,三是使用Remote实现远程对象相互调用. 在这章里面先为大家介绍一下最简单,最常用的Web服务相互调用方式.首先

axis1 调用axis2 的服务上传pdf文件.报错

问题描述 axis1 调用axis2 的服务上传pdf文件.报错 axis1 调用axis2 的服务上传pdf文件.报错org.apache.axis2.AxisFault:invalid reference:cid:******的错误 解决方案 Axis2数据绑定报错 解决方案二: http://download.csdn.net/detail/dongf800/5187102