欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-23 20:10:34
1、使用步骤 1)构建请求网址 a、确定端点:每个gis服务都有一个端点。例如,arcgis server上demographics文件夹下名为esri_census_...

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();
}
}
}