当前位置:  编程技术>.net/c#/asp.net

c#调用arcgis地图rest服务示例详解(arcgis地图输出)

    来源: 互联网  发布时间:2014-10-25

    本文导语:  1、使用步骤 1)构建请求网址 A、确定端点:每个GIS服务都有一个端点。例如,ArcGIS Server上Demographics文件夹下名为ESRI_Census_USA的一个地图服务sampleserver1.arcgisonline.com的端点为:http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demograp...

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 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 resDic
= Newtonsoft.Json.JsonConvert.DeserializeObject(res);
if (resDic.ContainsKey("addResults"))
{
List addRes = resDic["addResults"];
foreach (Dictionary 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();
fi.Attributes.Add("description", "测试点");
bool res = AddFeature(url, fi);
if (res)
{
Console.WriteLine("添加要素成功!");
}
else
{
Console.WriteLine("添加要素失败!");
}
Console.ReadKey();
}
}
}


    
 
 

您可能感兴趣的文章:

  • 谷歌地图调用插件 GMaps.js
  • Android调用google地图生成路线图实现代码
  • 使用asp.net调用谷歌地图api示例
  • C#调用CMD命令实例
  • C# 中调用 MySQL 存储过程的示例代码
  • c# 调用Surfer软件,添加引用的具体操作方法
  • C#调用SQL语句时乘号的用法
  • C# 调用 MySQL 存储过程的代码
  • C#中事件的动态调用实现方法
  • C++调用C#的DLL实现方法
  • C# 登录窗体与窗体调用
  • C# 调用C++写的dll的实现方法
  • c# 调用批处理(bat)的实现代码
  • c#和javascript函数相互调用示例分享
  • C#同步和异步调用方法实例
  • C# Winform 调用系统接口操作 INI 配置文件的代码
  • c#中js调用后台的方法介绍
  • c#调用qq邮箱smtp发送邮件(修正版)
  • c#调用qq邮箱smtp发送邮件(修改版)
  • C# Winform调用WEB Service API的示例代码
  • c#调用vc写的ocx控件示例
  • C#线程间不能调用剪切板的解决方法
  • 解析C#中委托的同步调用与异步调用(实例详解)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在Python中使用SWIG调用C和C++程序
  • Linux添加系统调用时如何调用C语言库函数
  • sessionbean调用entitybean的时候还需要像Client一样远程调用对象吗??
  • system()调用 与 ioctl()调用
  • linux中为什么系统调用比普通函数调用更费时间?
  • 如何在LINUX下用一个普通文件调用一个自己编写的调用系统的文件
  • 可不可以用java调用其他语言的编译结果?(好象asp调用com那样)
  • 为什么我的BEAN 在WIN2000中调用没有问题,但在LINUX中调用有问题
  • 为什么守护进程调用调用getlogin会失败呢?
  • 用RMI进行远程对象调用的时候,可不可以实现多个调用远程对象的并发操作
  • 关于jsp调用javabean的问题!调用是成功了,但是有小问题!
  • ioctl中能不能调用generic_file_read呀?我一调用就不动了
  • LINUX下系统调用是不能中断的,要怎么改造成可以中断系统调用?
  • 请问用javaScript或vbScript可否调用页面上Applet的public函数?如何调用?
  • 请问在jsp中调用外部的类,与jsp调用javabean有何区别??
  • 调用数学函数,需要调用哪个函数库?
  • 调用system(“命令”)和函数调用之间有什么不同?效率?
  • 请问如何在Java中调用一个VB所写的DLL?如何调用这个Dll的方法?如何取得和设置这个Dll的属性值?谢谢!
  • 脚本1调用脚本2,脚本2必须输入回车,如何在调用过程中自动输入回车
  • 请问linux中的系统调用号是如何跟系统调用表对应起来的
  • 我的APPLET在Jbuilder5中,可以调用EJB对象,但是移植到网页上却不能调用EJB对象!是何缘故,值得研究!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3