ArcGIS server 自9.3开始引入了基于Rest 的Web服务架构,并且允许用户创建发布Rest 服务。ArcGIS Server 支持多种类型的Rest 地理信息服务系统,包括地图制图、地理编码、地理数据、几何运算、地理处理、地球模型、图片和网络分析服务。每种类型的服务都具有特定的功能,因此要确定需要创建哪种类型的地理信息系统服务,首先需要了解ArcGIS Server 的服务能实现哪些功能:
ArcGIS Server 支持的服务类型及功能
服务类型 | 功能 | 所需资源-->制作工具 |
地图服务 |
最常用的ArcGIS服务。包括许多功能,提供对地图和图层内容的访问。主要进行制图、地图浏览或图层查询。支持地理处理(需要分析层)及网络分析(需要网络分析层)。 |
地图文档(.mxd, .pmf)-->ArcMap |
地理编码服务 |
主要进行地理编码。地理编码是按照坐标指定位置匹配到描述该位置的属性地址的过程,这些地址属性通常出现在参考材料中。也可以进行反地理编码,虽然现在很多商业的地理编码服务,但一些组织可能找不到适合他们的服务:地址信息不够更新,地址格式不一样或希望人们通过要素的本地名字来发现地址(例如,“大剧场,大体育馆等”)。所有这些情况需要特定的地理编码解决方案,这样就需要花费一定时间来构建适合自己需要的地理编码服务。 |
地址定位(.loc, .mxs, SDE batch locator) -->ArcCatlog |
地理数据服务 |
使用ArcGIS Server,通过本地网络或互联网可以访问地理数据库。能够执行地理数据库复制操作,使用数据提取进行拷贝,执行地理数据库查询。该服务非常适合远程访问地理数据库。例如,公司可以安装ArcSDE地理数据库来管理洛杉矶和纽约办公室的数据。地理数据服务创建后,每个办公室可以发布其ArcSDE地理数据库到互联网。地理数据库可以被用来创建ArcSDE地理数据库的备份,还可以周期同步的在互联网上改变地理数据库。 | 数据库连接文件(.sde) 或personal geodatabase或file geodatabase或地图文档参考数据-->ArcCatlog |
几何服务 | 执行几何计算,例如缓冲区、单一化、计算面积和长度、投影。网络分析(需要网络分析层)。 |
不需要GIS资源-->N/A |
地理处理服务 |
表现为一系列已发布的操作和分析地理信息的工具集。每个工具执行一个或多个操作,例如投影转换,增加属性表的列,创建要素缓冲区。工具接受输入(要素集,表,以及属性值),执行输入数据操作,生成表达在地图或者进一步需要处理的输出。工具可以被同步或异步执行。 |
带有工具图层的地图文档或工具层(.tbx)-->ArcMap或ArcCatalog 的ArcToolbox和ModelBuilder |
Globe服务 | 给网络用户提供3D地图浏览。 |
Globe 文档(.3dd, .pmf)-->ArcGlobe |
图像服务 | 通过Web服务提供只读访问镶嵌影像或栅格数据集。 | 影像数据集或引用栅格数据集的图层文件或编译的图像服务定义(.ISCDef) -->ArcCatalog, ArcMap, 或ArcGIS Image Server |
网络分析服务 |
执行网络分析功能,例如最优路径分析、最近设施查找、计算服务面积。 | 包含网络分析层的地图文档 --> ArcMap |
确定服务类型之后,接下来就是通过ArcGIS Desktop 创建资源(详见上面表格中的 所需资源-->制作工具)、将资源发布服务、最后就是浏览服务和测试REST 服务。
1.浏览发布的服务:
打开一个Web浏览器
如果不知道网址,按照下面的步骤使用服务目录帮助找到网址 — http://<服务器名称>/ < 实例名称>/rest/服务 ——这就是如何打开某一特定GIS服务器的服务目录。
http://sampleserver5.arcgisonline.com/ArcGIS/rest/services
首先会看到主页,其中列出了所有服务目录以及含有更多服务的的文件夹。除了服务名称,还能看到服务类型。点击服务名称,可以看到更多服务的信息。包括服务的元数据,包含的图层等信息。
2.ArcGIS 基于REST 风格Web 服务的开发应用实例(以javascript 为例):
2.1 使用ArcGIS Server JavaScript API 在Web 浏览器中显示瓦片地图:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
<title>Create Map and add a TileMap layer</title>
<link rel="stylesheet" href="http://js.arcgis.com/3.12/esri/css/esri.css"/>
<style>
html, body, #map{
padding:0;
margin: 0;
height: 100%;
}
</style>
<script src="http://js.arcgis.com/3.12/"></script>
<script>
var map;
require([
"esri/map",
"esri/layers/ArcGISTiledMapServiceLayer"
], function (Map, ArcGISTiledMapServiceLayer){
map = new Map("map");
var myLayer = new ArcGISTiledMapServiceLayer("http://server.arcgisonline.com/ArcGIS/rest/services/NGS_Topo_US_2D/MapServer");
map.addLayer(myLayer);
});
</script>
</head>
<body>
<div id="map"></div>
</body>
</html>
2.2 使用ArcGIS Server JavaScript API 在Web 输出查询图层的结果:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<!--The viewport meta tag is used to improve the presentation and behavior of the samples
on iOS devices-->
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
<title>Query State Info without Map</title>
<script src="http://js.arcgis.com/3.12/"></script>
<script>
require([
"dojo/dom", "dojo/on",
"esri/tasks/query", "esri/tasks/QueryTask", "dojo/domReady!"
], function (dom, on, Query, QueryTask) {
var queryTask = new QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/5");
var query = new Query();
query.returnGeometry = false;
query.outFields = [
"SQMI", "STATE_NAME", "STATE_FIPS", "SUB_REGION", "STATE_ABBR",
"POP2000", "POP2007", "POP00_SQMI", "POP07_SQMI", "HOUSEHOLDS",
"MALES", "FEMALES", "WHITE", "BLACK", "AMERI_ES", "ASIAN", "OTHER",
"HISPANIC", "AGE_UNDER5", "AGE_5_17", "AGE_18_21", "AGE_22_29",
"AGE_30_39", "AGE_40_49", "AGE_50_64", "AGE_65_UP"
];
on(dom.byId("execute"), "click", execute);
function execute () {
query.text = dom.byId("stateName").value;
query.where = "STATE_NAME like '%" + dom.byId("stateName").value + "'";
queryTask.execute(query, showResults);
}
function showResults (results) {
var resultItems = [];
var resultCount = results.features.length;
for (var i = 0; i < resultCount; i++) {
var featureAttributes = results.features[i].attributes;
for (var attr in featureAttributes) {
resultItems.push("<b>" + attr + ":</b> " + featureAttributes[attr] + "<br>");
}
resultItems.push("<br>");
}
dom.byId("info").innerHTML = resultItems.join("");
}
});
</script>
</head>
<body>
STATE_NAME:
<input type="text" id="stateName" value="">
<input id="execute" type="button" value="查询">
<br />
<br />
<div id="info" style="padding:5px; margin:5px; background-color:#eee;">
</div>
</body>
</html>
参考书籍: ArcGIS Server 9.3 REST 基础教程