在ArcGIS JavaScript API中,用户可以使用Locator类进行地理编码。Locator类构建 《ArcGIS Server 9.3 REST 基础教程》 ESRI 白皮书 第 51 页 ESRI中国(北京)有限公司 器需要ArcGIS Server的地理编码服务的网址。本实例使用ESRI示例服务器的 ESRI_Geocode_USA服务。用户可以使用服务目录发现网址,并应用到自定义的服务中。 当用户点击Locate按钮,Locate功能就被调用。该功能将用户输入的地址文本解析为一个四 项矩阵。四项矩阵(街道地址,城市,州和邮政编码)对应locator中定义的地址属性。 在服务目录中查询地理编码服务就可以发现这些地址属性。例如,网页显示本实例中 的四个地址属性。 当addressToLocations方法被调用后,JavaScript API构建一个REST请求网址如下所 示: http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Locators/ESRI_Geocode_USA/GeocodeSer ver/findAddressCandidates?f=json&outFields=Loc_name&Address=380%20New%20York%20St&City= %20Redlands&State=%20CA&Zip=%2092373&callback=dojo.io.script.jsonp_dojoIoScript2._jsonpCallb ack 网址中的值是网址编码。解释为: 服务节点: http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Locators/ESRI_Geo code_USA/GeocodeServer 操作:findAddressCandidates 输出格式:f=json 输出属性:outFields = Loc_name 地址:地址= 380 New York St 城市:城市=雷德兰兹 国家:州=加利福尼亚 邮编:邮政编码= 92373 JavaScript API构建REST请求网址并传送到服务器。当locator完成匹配后,它实际上 将JSON返回以下响应: dojo.io.script.jsonp_dojoIoScript2._jsonpCallback({"candidates":[{"address":"380 NEW YORK ST, REDLANDS, CA, 92373","location":{"x":-117.195681386,"y":34.0575170970001},"score":100,"attributes":{"Loc_name":"Str eet_ Address"}},{"address":"458 NEW YORK ST, REDLANDS, CA, 92373","location":{"x":-117.19569688,"y":34.058514 9200002},"score":60,"attributes":{"Loc_name":"Street_Address"}},{"address":"298 NEW YORK ST, REDLANDS, CA, 92373","location":{"x":-117.19565025,"y":34.0555536900001},"score":60,"attributes":{"Loc_name":"Stree 《ArcGIS Server 9.3 REST 基础教程》 ESRI 白皮书 第 52 页 ESRI中国(北京)有限公司 t_ Address"}},{"address":"474 NEW YORK ST, REDLANDS, CA, 92373","location":{"x":-117.19569396,"y":34.058597 1300001},"score":60,"attributes":{"Loc_name":"Street_Address"}},{"address":"500 NEW YORK ST, REDLANDS, CA, 92373","location":{"x":-117.19572503,"y":34.0592554100002},"score":59,"attributes":{"Loc_name":"Stree t_ Address"}},{"address":"198 NEW YORK ST, REDLANDS, CA, 92373","location":{"x":-117.19562531,"y":34.053680 8300001},"score":58,"attributes":{"Loc_name":"Street_Address"}},{"address":"98 NEW YORK ST, REDLANDS, CA, 92373","location":{"x":-117.19560231,"y":34.05197162},"score":55,"attributes":{"Loc_name":"Street_ Address"}},{"address":"NEW YORK ST","location":{"x":-117.19572988,"y":34.0595619300001},"score":49,"attributes":{" Loc_name":"Street_Address"}},{"address":"92373","location":{"x":-117.186535,"y":34.0385580000001}," score":100,"at tributes":{"Loc_name":"Zipcode"}},{"address":"REDLANDS, CA","location":{"x":-117.171316,"y":34.0502740000001},"s core":100,"attributes":{"Loc_name":"CityState"}}]}); JavaScript API使用事件监听器来监测服务器的响应。当收到请求的响应,就调用 showResults功能,添加得分超过80的候选地址到地图中。候选地址由一系列的 AddressCandidate对象传递给监听的回调函数。 每个候选地址包括地理位置点,这样就可以将其绘制到地图中作为新的图形(图3.6)。 《ArcGIS Server 9.3 REST 基础教程》 ESRI 白皮书 第 53 页 ESRI中国(北京)有限公司 图 3.6 使用ArcGIS Server JavaScript API进行地理编码 3.3.1.2 直接应用 JavaScript 正如我们以前所述,ArcGIS Server JavaScript API封装了REST API和其它很多操作。 例如,它处理用户的互动,并显示互动的结果。我们推荐用户优先使用JavaScript API。 使用JavaScript API通常要求,用户的Web浏览器能够访问本地服务器上的JavaScript API库。JavaScript API提供了大量的功能。 本节将演示如何直接在JavaScript中使用REST API。下面的例子中,对输入的地址进 行编码,以表格的形式显示结果。 我们使用与第3.3.1.1节中例子相同的服务,就是 http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Locators/ESRI_Geocode_US A/GeocodeServer。点击链接就会看到需要输入的地址字段,支持的操作,以及候选地址列, 可返回ArcGIS Services目录。例如,地理编码一个地址: 《ArcGIS Server 9.3 REST 基础教程》 ESRI 白皮书 第 54 页 ESRI中国(北京)有限公司 服务端点: http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Locators/ESRI_Geo code_USA/GeocodeServer 操作是 findAddressCandidates 输入地址有四列:地址,市,州和邮政编码(邮编) 现在,我们需要写一个JavaScript程序,使用第3.3.1.1节中介绍的格式构建一个网址:
Geocode using ArcGIS Server REST API in JavaScript
JavaScript通常使用XMLHttpRequest或XMLHTTP发送请求和接收响应。你可以复制 上述代码,在文本编辑器保存为HTML文件。如果在Internet Explorer中运行HTML,点击提 交按钮。将会看到JavaScript构建的REST API,以及从ArcGIS Server地理编码服务返回的 匹配地址(图3.7)。 注意:该段程序在Internet Explorer中能够很好地运行,但不能在Firefox中运行。这是 因为Firefox浏览器拥有强大的跨域安全控制,可以阻止JavaScript提交URL请求到一个不同 网域的服务器。为解决此问题,需要用户编写一个本地代理程序,通过代理提交请求。 图3.7 通过REST使用ArcGIS Server Locator Service 的Html网页示例 《ArcGIS Server 9.3 REST 基础教程》 ESRI 白皮书 第 57 页 ESRI中国(北京)有限公司 3.3.2 利用 Flex Flex是Adobe Systems针对跨平台开发和部署而发布的技术集,应用程序可运行在 Adobe Flash,Web浏览器或Adobe AIR及其他桌面应用程序。 应用Flex开发的程序可以运行在大多数的已经安装Adobe Flash Player的 Web浏览器 中。 ArcGIS Server提供Flex API。与ArcGIS Server JavaScript API类似,ArcGIS Server 提供的Flex API不仅封装了REST API,也可以处理用户互动,如鼠标点击事件、地图和图 形显示等。我们建议你优先使用ArcGIS Server Flex API。 3.3.2.1 使用 ArcGIS Server Flex API ArcGIS Server Flex API允许你将ArcGIS Server地图和任务应用到Web应用程序。 ArcGIS Server Flex API提供的功能与ArcGIS Server JavaScript API类似。例如,利 用ArcGIS Server Flex API可以实现: 互动显示用户数据的地图。 执行服务器上的一个地理信息系统模型,并显示模型结果。 在 ArcGIS Online 基础地图上显示用户数据。 查找用户地理信息系统数据的要素或属性,显示查找结果。 搜索地址,并显示搜索结果。 创建 Mashups(整合来自多个网站源的信息)。 详细的ArcGIS Server Flex API帮助,请访问ESRI资源中心 http://resources.esri.com/arcgisserver/apis/flex。 在这里,我们只是展示一个简单的例子,它可以让你使用地图服务,执行查询州的人 口任务,并显示查询结果:ArcGIS Services Directory |
Home > | Help a> | API Reference |
Export Map Image: Layers
![]() | 《ArcGIS Server 9.3 REST 基础教程》 ESRI 白皮书 第 69 页 ESRI中国(北京)有限公司 Width: 400 Height: 400 Extent:
YMin: -19.11255617006 XMax: -58.6754035745517 YMax: 108.400033537315 Spatial Reference: 4269 Scale: 133972136.331439 |
Query ArcGIS Server for the population information of a State
<%if (stateName!=null) { String s_endPoint="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ ESRI_Census_USA/MapServer/5"; String s_operation="query"; String s_outFields="AGE_5_17,AGE_18_21,AGE_22_29,AGE_30_39,AGE_40_49,AGE_50_64,AGE_65_UP" 《ArcGIS Server 9.3 REST 基础教程》 ESRI 白皮书 第 74 页 ESRI中国(北京)有限公司 ; String s_format="json"; String s_returnGeometry="false"; // construct the URL String s_requestURL =s_endPoint + "/" + s_operation + "?" + "where=" + URLEncoder.encode("state_name = "" + stateName + "","UTF-8") + "&outFields=" + s_outFields + "&returnGeometry=" + s_returnGeometry + "&f=" + s_format; // send the request and receive the response HTTPUtil mHttpUtil=new HTTPUtil(); String s_Result=mHttpUtil.getResponse(s_requestURL); // parse the response JSONArray results = new JSONArray("[" + s_Result + "]"); JSONArray features=results.getJSONObject(0).getJSONArray("features"); JSONObject fields = new JSONArray("[" + features.getJSONObject(0).getString("attributes") + "]"). getJSONObject(0); %>Result
AGE_5_17 | AGE_18_21 | AGE_22_29 | AGE_30_39 | AGE_40_49 | AGE_50_64 | AGE_65_UP |
<%=fields.getString("AGE_5_17")%> | <%=fields.getString("AGE_18_21")%> | <%=fields.getString("AGE_22_29")%> | <%=fields.getString("AGE_30_39")%> | <%=fields.getString("AGE_40_49")%> | <%=fields.getString("AGE_50_64")%> | <%=fields.getString("AGE_65_UP")%> |