描述

本例展示了如何在另外一个任务里使用一个任务的结果。单击地图查看被单击的点的1公里范围内的缓存(如果需要可以修改这个默认的缓存距离)。也可以看缓存区的这些点的人口普查街区信息。单击一个点查看更多的人口普查街区的信息。

通过GeometryService, QueryTask和一些事件监听器实现了所有的功能:

  • ·GeometryService对象提供访问到ArcGIS Server的几何服务,该服务可以缓冲,投影和简化几何体。
  • ·QueryTask能根据地理或属性条件从地图图层检索要素。在本例中,查询基于地理(在缓存中的区域)。有趣地是,地图图层(人口普查街区组点)不是初始显示在地图上的。对很多这样的查询任务,可以仅仅显示需要的结果元素。
  • ·事件监听器帮助脚本知道事件什么时候发生。监听器说,“当A发生,做B”。监听器可以将几个操作连在一起,象查询后缓存。每当见到dojo.connect()方法,脚本正在监听一个事件。这有一个监听器的例子:
· dojo.connect(map, "onClick", function(evt) {
·            ...
        }

这三个参数表示对象的事件将在哪发生(the map),本身是什么事件(a mouse click)和当事件发生时运行什么函数。

下面是本例中事情发生的顺序:

1.某人单击地图,触发地图的"onClick"事件

2.几何服务缓存点,触发几何服务的"onBufferComplete"事件

3.缓存的虚线符号被增加到地图上并且查询任务执行,触发查询任务的"onComplete"事件

4.人口普查区被增加到地图上,使用函数sumPopulation统计人口

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=7" />
<title>QueryTask with query geometry from another task</title>
<link rel="stylesheet" type="text/css"
href="http://serverapi.arcgisonline.com/jsapi/arcgis/1.6/js/dojo/dijit/themes/tundra/tundra.css">
<script type="text/javascript" src="http://serverapi.arcgisonline.com/jsapi/arcgis/?v=1.6"></script>
<script type="text/javascript">
dojo.require("esri.map");
dojo.require("esri.tasks.query");
dojo.require("esri.tasks.geometry"); function init() {
var startExtent = new esri.geometry.Extent(-95.271, 38.933, -95.228,38.976, new esri.SpatialReference({wkid:4326}) );
var map = new esri.Map("mapDiv", { extent: startExtent });
//加载地图时添加查询功能
dojo.connect(map, "onLoad", initFunctionality); var streetMap = new esri.layers.ArcGISTiledMapServiceLayer("http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapServer");
//var censusMap = new esri.layers.ArcGISDynamicMapServiceLayer("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/");
map.addLayer(streetMap);
}
//初始化功能
function initFunctionality(map) {
var queryTask = new esri.tasks.QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/0"); //确定代理页面使用toJson几何服务并且载荷大于2000
//如果不是可用的缓冲区,则会请求一个http Post代理.
esriConfig.defaults.io.proxyUrl= "/arcgisserver/apis/javascript/proxy/proxy.ashx";
esriConfig.defaults.io.alwaysUseProxy = false; //查询
var query = new esri.tasks.Query();
query.returnGeometry = true;
query.outFields = ["POP2000","HOUSEHOLDS","HSE_UNITS", "TRACT", "BLOCK"]; //几何服务端点
var gsvc = new esri.tasks.GeometryService("http://sampleserver1.arcgisonline.com/arcgis/rest/services/Geometry/GeometryServer"); // +++++监听地图的onClick事件+++++
dojo.connect(map, "onClick", function(evt) {
map.graphics.clear();
var symbol = new esri.symbol.SimpleMarkerSymbol();
var graphic = new esri.Graphic(evt.mapPoint, symbol);
var params = new esri.tasks.BufferParameters();
params.features = [ graphic ]; // 缓冲线性单位(米,公里...)
params.distances = [ dojo.byId('bufferDistance').value ];
params.unit = esri.tasks.BufferParameters.UNIT_KILOMETER;
params.bufferSpatialReference = new esri.SpatialReference({wkid: 102113});
gsvc.buffer(params);
dojo.byId('messages').innerHTML = "<b>Creating Buffer Using GeometryService...</b>";
}); // +++++监听GeometryService类的onBufferComplete方法+++++
dojo.connect(gsvc, "onBufferComplete", function(graphics) {
var symbol = new esri.symbol.SimpleFillSymbol(
"none",
new esri.symbol.SimpleLineSymbol(
"dashdot",
new dojo.Color([255,0,0]),
2),
new dojo.Color([255,255,0,0.25]));
var graphic = new esri.Graphic(graphics[0].geometry,symbol);
map.graphics.add(graphic); query.geometry = graphic.geometry;
queryTask.execute(query);
dojo.byId('messages').innerHTML = "<b>Executing Query with Result BufferGeometry...</b>";
}); // +++++监听QueryTask中的executecomplete事件+++++
dojo.connect(queryTask, "onComplete", function(fset) {
//创建所选标记的图形
var symbol = new esri.symbol.SimpleMarkerSymbol();
symbol.style = esri.symbol.SimpleMarkerSymbol.STYLE_SQUARE;
symbol.setSize(8);
symbol.setColor(new dojo.Color([255,255,0,0.5])); var infoTemplate = new esri.InfoTemplate("Block: ${BLOCK}","${'*'}"); var resultFeatures = fset.features;
for (var i=0, il=resultFeatures.length; i<il; i++) {
var graphic = resultFeatures[i];
graphic.setSymbol(symbol);
graphic.setInfoTemplate(infoTemplate);
map.graphics.add(graphic);
}
var totalPopulation = sumPopulation(fset);
var r = "";
r = "<b>The total Census Block population within the buffer is <i>"
+ totalPopulation + "</i>.</b>";
dojo.byId('messages').innerHTML = r;
});
} function sumPopulation(fset) {
var features = fset.features;
var popTotal = 0;
for (var x = 0; x < features.length; x++) {
popTotal = popTotal + features[x].attributes['POP2000'];
}
return popTotal;
} dojo.addOnLoad(init);
</script>
</head> <body class="tundra">
Zoom to area and click on map to select census block points within the buffered circle.<br/>
Buffer distance (in kilometers):&nbsp;<input type="text" id="bufferDistance" value="1" size="5"/>
<div id="mapDiv" style="width: 500px; height:500px;"></div>
<span id="messages"></span>
</body>
</html>

最新文章

  1. iPad开发--QQ空间布局,登录模块
  2. 用c语言编写直接插入法
  3. cocos2d-x之xml文件读取初试
  4. 关于垃圾回收(GC和Marshal)有感
  5. Types of Entity in Entity Framework:
  6. python--列表的使用
  7. 模仿qq音乐播放字母效果
  8. 用php理解指针--写给刚刚学习编程的人
  9. poj 1684 Lazy Math Instructor(字符串)
  10. Java线程中yield()的用法
  11. WPF ”真正的“高仿QQ
  12. linux rsync实时同步
  13. 项目角度谈矢量切片运用以及Geoserver处理自定义规格矢量切片方案
  14. 实时显示数据 SignalR 及时消息提醒( 立即向其推送内容)
  15. 易忘&amp;有用 的冷门Anaconda命令
  16. 如何给域名配置https证书
  17. IOS编码转化
  18. Hadoop(18)-MapReduce框架原理-WritableComparable排序和GroupingComparator分组
  19. debian添加中文支持
  20. 牛客网多校赛第七场--C Bit Compression【位运算】【暴力】

热门文章

  1. SpringCloud学习笔记(3)----Spring Cloud Netflix之深入理解Eureka
  2. Comparator 与 Comparable
  3. UVA-12186 Another Crisis 树形dp
  4. POJ-3159 Candies 最短路应用(差分约束)
  5. [HDU5687]2016&quot;百度之星&quot; - 资格赛 Problem C
  6. 【jQuery02】点击标题面板显示内容
  7. Vue组件使用基础
  8. [terry笔记]oracle里的执行计划-查看
  9. ActiveMQ maven
  10. 洛谷 P2209 [USACO13OPEN]燃油经济性Fuel Economy