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/
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。